Marathon: Creating docker app without port mappings creates uneditable app on UI

Created on 22 Sep 2016  Â·  5Comments  Â·  Source: mesosphere/marathon

I reproduced this on 1.3.0-RC5 to 1.3.0 and current 1.4.0-SNAPSHOT.

Create a docker app with no port mappings:

image

image

or in json mode:

image

{
  "id": "emptyports",
  "cmd": null,
  "cpus": 1,
  "mem": 128,
  "disk": 0,
  "instances": 1,
  "container": {
    "docker": {
      "image": "nginx",
      "network": "HOST"
    },
    "type": "DOCKER"
  }
}

Observe portMappings: null

image

Now, when I click Edit:

image

Exception:

Uncaught (in promise) TypeError: Cannot read property 'map' of null(…)i @ main.js:formatted:51623dockerPortMappings @ main.js:formatted:51650(anonymous function) @ main.js:formatted:51075(anonymous function) @ main.js:formatted:51073h @ main.js:formatted:51070populateFieldsFromAppDefinition @ main.js:formatted:51302AppConfigEditFormComponent_getInitialState @ main.js:formatted:50600AppConfigEditFormComponent @ main.js:formatted:7707mountComponent @ main.js:formatted:9555ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountChildren @ main.js:formatted:10141_createContentMarkup @ main.js:formatted:9987mountComponent @ main.js:formatted:9950mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075mountComponent @ main.js:formatted:9585ReactCompositeComponent_mountComponent @ main.js:formatted:7047mountComponent @ main.js:formatted:7075_updateRenderedComponent @ main.js:formatted:9754_performComponentUpdate @ main.js:formatted:9739updateComponent @ main.js:formatted:9706ReactCompositeComponent_updateComponent @ main.js:formatted:7047performUpdateIfNecessary @ main.js:formatted:9684performUpdateIfNecessary @ main.js:formatted:7095s @ main.js:formatted:6880perform @ main.js:formatted:7418perform @ main.js:formatted:7418perform @ main.js:formatted:6939T @ main.js:formatted:6947ReactUpdates_flushBatchedUpdates @ main.js:formatted:7047closeAll @ main.js:formatted:7454perform @ main.js:formatted:7427batchedUpdates @ main.js:formatted:11325l @ main.js:formatted:6889r @ main.js:formatted:6752enqueueSetState @ main.js:formatted:6796r.setState @ main.js:formatted:6714onRequestAppVersion @ main.js:formatted:69646n.emit @ main.js:formatted:17636(anonymous function) @ main.js:formatted:30613e._invokeCallback @ main.js:formatted:17814e.dispatch @ main.js:formatted:17802(anonymous function) @ main.js:formatted:29862(anonymous function) @ main.js:formatted:19599(anonymous function) @ main.js:formatted:19574

This could be looked at as a marathon-ui issue probably rather than marathon - however there is no github issues enabled for the marathon-ui project as far as I can see.

Most helpful comment

I see that https://github.com/mesosphere/marathon-ui/commit/b32fa61cb127c8e5a6652d8f14608659bbb26bb0 commit actually fixes this - now I just need to find a way to repackage that into my marathon somehow.

All 5 comments

I see that https://github.com/mesosphere/marathon-ui/commit/b32fa61cb127c8e5a6652d8f14608659bbb26bb0 commit actually fixes this - now I just need to find a way to repackage that into my marathon somehow.

Is there a way i can incorporate the change into my marathon?

This is what I did, it's pretty arduous, as marathon deploys as a fat jar:

TL;DR
I rebuilt the marathon-ui project, packaged up as a jar, published it to local maven repo with new version number 1.2.1 and added it as a dependency to the sbt.build for marathon, on which then I ran sbt assembly and voila, the new marathon jar is there, which I just copied over to my masters repointed the systemd service file and done :)

Details from the top of my head (I might be missing something)

I. Rebuilding the marathon-ui project:
I.a.) The npm build:

  • checkout the latest marathon-ui repo
  • install npm and node (use nvm, and it won't work on windows...) nvm install 5.4.1 (version is important)
  • npm run dist -> that creates the dist folder

I.b) the maven build: install maven

  • mkdir -p src/main/resources/META-INF/resource/webjars --- I'll check this later, not sure about the exact path
  • cp -R dist/* src/main/resources/META-INF/resource/webjars/
  • copy pom.xml.tpl to pom.xml
  • replace every parameter in pom.xml (${...}) to the appropriate values (version -> 1.2.1 for example)
  • mvn package - this will create the jar ideally everything lives under target/ui-1.2.1.jar

II . install the jar locally to the maven repo

  • mvn install:install-file -Dfile=ui-1.2.1.jar -DgroupId=mesosphere.marathon
    -DartifactId=ui -Dversion=1.2.1 -Dpackaging=jar

III. rebuild marathon

  • checkout marathon repo
  • change build.sbt to add to resolvers the maven local repo (resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository")
  • change build.sbt to refer to MarathonUI as version 1.2.1
  • sbt assembly (this took a long time for me, like 7mins, and sometimes it fails with scalastyle issues -- that case just comment out scalastylesettings ;))
  • you should have a target/scala-2.11/marathon-assembly-...version...jar

IV. deploy marathon jar

  • scp the jar over to the master node(s) and put it to a folder you want it to be
  • systemctl cat dcos-marathon (if you run dcos)
  • edit the service file and point it to the new marathon jar

Note: I guess you could unzip the jars manually too and make the change there - but the problem is the npm run dist will create one big main.js which will be hard to edit.

This appears to be a dup of https://github.com/mesosphere/marathon/issues/4340, but an update on version(s) in which the fix will appear would be helpful... Cheers!

The #4340 fix is included in Marathon UI v1.1.5 which is shipped with Marathon v1.3.2.

Was this page helpful?
0 / 5 - 0 ratings