Repository: aurora Updated Branches: refs/heads/master efc5ff6ab -> b912e1726
Upgrade to Mesos 1.0.0 I also took this as an opportunity to switch us from mesos.native to mesos.executor on the Python side, meaning Docker containers will no longer require all mesos deps. Release notes here: http://mesos.apache.org/blog/mesos-1-0-0-released/ Upgrade notes here: http://mesos.apache.org/documentation/latest/upgrades/ Reviewed at https://reviews.apache.org/r/50584/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/b912e172 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/b912e172 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/b912e172 Branch: refs/heads/master Commit: b912e1726ec50c1f10d6cceaef6faf19c18cf880 Parents: efc5ff6 Author: Joshua Cohen <jco...@apache.org> Authored: Mon Aug 1 10:33:32 2016 -0500 Committer: Joshua Cohen <jco...@apache.org> Committed: Mon Aug 1 10:33:32 2016 -0500 ---------------------------------------------------------------------- 3rdparty/python/BUILD | 13 ++++---- RELEASE-NOTES.md | 4 +++ Vagrantfile | 2 +- build-support/packer/build.sh | 8 +++-- build-support/python/make-mesos-native-egg | 6 ++-- build.gradle | 2 +- .../apache/aurora/scheduler/app/AppModule.java | 7 ++--- .../aurora/scheduler/app/SchedulerMain.java | 7 +++-- .../mesos/CommandLineDriverSettingsModule.java | 13 ++++++++ .../scheduler/mesos/MesosTaskFactory.java | 9 +++++- src/main/python/apache/aurora/executor/BUILD | 2 +- .../executor/bin/thermos_executor_main.py | 2 +- .../CommandLineDriverSettingsModuleTest.java | 32 +++++++++++++++++--- .../mesos/MesosTaskFactoryImplTest.java | 11 +++++-- src/test/sh/org/apache/aurora/e2e/Dockerfile | 4 +-- 15 files changed, 87 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/3rdparty/python/BUILD ---------------------------------------------------------------------- diff --git a/3rdparty/python/BUILD b/3rdparty/python/BUILD index a44624c..c572da0 100644 --- a/3rdparty/python/BUILD +++ b/3rdparty/python/BUILD @@ -11,7 +11,7 @@ # limitations under the License. # -MESOS_REV = '0.28.2' +MESOS_REV = '1.0.0' python_requirement_library( name = 'mesos.interface', @@ -23,14 +23,13 @@ python_requirement_library( ) python_requirement_library( - name = 'mesos.native', + name = 'mesos.executor', requirements = [ python_requirement( - requirement = 'mesos.native==%s' % MESOS_REV, - # This native egg must currently be fetched out-of-band. - # See examples/vagrant/provision-dev-cluster.sh which fetches - # to third_party/ and uses mesos.native to enable a running - # cluster inside the root Vagrant machine. + requirement = 'mesos.executor==%s' % MESOS_REV, + # This native executor egg must currently be fetched out-of-band. + # See build-support/packer/build.sh which fetches to third_party/ and uses mesos.executor to + # enable a running cluster inside the root Vagrant machine. repository = '%s/third_party' % get_buildroot(), ) ] http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/RELEASE-NOTES.md ---------------------------------------------------------------------- diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index d46420e..19d7f7e 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -3,6 +3,10 @@ ### New/updated: +- Upgraded Mesos to 1.0.0. Note: as part of this upgrade we have switched from depending on + the mesos.native egg for Thermos in favor of the stripped down mesos.executor egg. This means + users launching Docker tasks with the Mesos DockerContainerizer are no longer required to use + images that include all of Mesos's dependencies. - Scheduler command line behavior has been modified to warn users of the deprecation of `production` attribute in `Job` thrift struct. The scheduler is queried for tier configurations and the user's choice of `tier` and `production` attributes is revised, if necessary. If `tier` is already set, http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/Vagrantfile ---------------------------------------------------------------------- diff --git a/Vagrantfile b/Vagrantfile index 5aa2128..88613bf 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -25,7 +25,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.hostname = "aurora.local" # See build-support/packer/README.md for instructions on updating this box. config.vm.box = "apache-aurora/dev-environment" - config.vm.box_version = "0.0.7" + config.vm.box_version = "0.0.8" config.vm.define "devcluster" do |dev| dev.vm.network :private_network, ip: "192.168.33.7" http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/build-support/packer/build.sh ---------------------------------------------------------------------- diff --git a/build-support/packer/build.sh b/build-support/packer/build.sh index 08938ec..7aed38f 100644 --- a/build-support/packer/build.sh +++ b/build-support/packer/build.sh @@ -17,7 +17,7 @@ set -o errexit set -o nounset set -o verbose -readonly MESOS_VERSION=0.28.2 +readonly MESOS_VERSION=1.0.0 function remove_unused { # The default ubuntu/trusty64 image includes juju-core, which adds ~300 MB to our image. @@ -133,10 +133,12 @@ function warm_artifact_cache { mkdir -p "$THIRD_PARTY_DIR" # Fetch the mesos egg, needed to build python components. - # The mesos.native target in 3rdparty/python/BUILD expects to find the native egg in third_party. + # The mesos.executor target in 3rdparty/python/BUILD expects to find the native egg in + # third_party. SVN_ROOT='https://svn.apache.org/repos/asf/aurora/3rdparty' pushd "$THIRD_PARTY_DIR" - wget -c ${SVN_ROOT}/ubuntu/trusty64/python/mesos.native-${MESOS_VERSION}-py2.7-linux-x86_64.egg + wget -c \ + ${SVN_ROOT}/ubuntu/trusty64/python/mesos.executor-${MESOS_VERSION}-py2.7-linux-x86_64.egg popd chown -R vagrant:vagrant aurora http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/build-support/python/make-mesos-native-egg ---------------------------------------------------------------------- diff --git a/build-support/python/make-mesos-native-egg b/build-support/python/make-mesos-native-egg index 736685f..9387496 100755 --- a/build-support/python/make-mesos-native-egg +++ b/build-support/python/make-mesos-native-egg @@ -84,7 +84,7 @@ build_ubuntu_trusty64() { $(fetch_and_build_mesos "$mesos_version") EOF mkdir -pv "$python_outdir" - cp -v mesos.native*.egg "$python_outdir" + cp -v mesos.executor*.egg "$python_outdir" popd } @@ -126,7 +126,7 @@ build_centos6() { EOS EOF mkdir -pv "$python_outdir" - cp -v mesos.native*.egg "$python_outdir" + cp -v mesos.executor*.egg "$python_outdir" popd } @@ -154,7 +154,7 @@ build_centos7() { sudo yum -y install ${CENTOS7_X86_64_DEPENDENCIES[*]} $(fetch_and_build_mesos "$mesos_version") EOF - cp -v mesos.native*.egg "$python_outdir" + cp -v mesos.executor*.egg "$python_outdir" popd } http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/build.gradle ---------------------------------------------------------------------- diff --git a/build.gradle b/build.gradle index 9540195..f466b3a 100644 --- a/build.gradle +++ b/build.gradle @@ -365,7 +365,7 @@ dependencies { compile "org.apache.curator:curator-client:${curatorRev}" compile "org.apache.curator:curator-framework:${curatorRev}" compile "org.apache.curator:curator-recipes:${curatorRev}" - compile 'org.apache.mesos:mesos:0.28.2' + compile 'org.apache.mesos:mesos:1.0.0' compile "org.apache.shiro:shiro-guice:${shiroRev}" compile "org.apache.shiro:shiro-web:${shiroRev}" compile "org.apache.zookeeper:zookeeper:${zookeeperRev}" http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/java/org/apache/aurora/scheduler/app/AppModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java index e5bafa4..c6c2a6d 100644 --- a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java +++ b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java @@ -94,9 +94,6 @@ public class AppModule extends AbstractModule { help = "If false, Docker tasks may run without an executor (EXPERIMENTAL)") private static final Arg<Boolean> REQUIRE_DOCKER_USE_EXECUTOR = Arg.create(true); - @CmdLine(name = "allow_gpu_resource", help = "Allow jobs to request Mesos GPU resource.") - private static final Arg<Boolean> ALLOW_GPU_RESOURCE = Arg.create(false); - @CmdLine(name = "enable_mesos_fetcher", help = "Allow jobs to pass URIs " + "to the Mesos Fetcher. Note that enabling this feature could pose " + "a privilege escalation threat.") @@ -109,13 +106,13 @@ public class AppModule extends AbstractModule { this.configurationManagerSettings = requireNonNull(configurationManagerSettings); } - public AppModule() { + public AppModule(boolean allowGpuResource) { this(new ConfigurationManagerSettings( ImmutableSet.copyOf(ALLOWED_CONTAINER_TYPES.get()), ENABLE_DOCKER_PARAMETERS.get(), DEFAULT_DOCKER_PARAMETERS.get(), REQUIRE_DOCKER_USE_EXECUTOR.get(), - ALLOW_GPU_RESOURCE.get(), + allowGpuResource, ENABLE_MESOS_FETCHER.get())); } http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java index 8fe2b79..94c1a29 100644 --- a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java +++ b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java @@ -86,6 +86,9 @@ public class SchedulerMain { @CmdLine(name = "viz_job_url_prefix", help = "URL prefix for job container stats.") private static final Arg<String> STATS_URL_PREFIX = Arg.create(""); + @CmdLine(name = "allow_gpu_resource", help = "Allow jobs to request Mesos GPU resource.") + private static final Arg<Boolean> ALLOW_GPU_RESOURCE = Arg.create(false); + @Inject private SingletonService schedulerService; @Inject private HttpService httpService; @Inject private SchedulerLifecycle schedulerLifecycle; @@ -134,7 +137,7 @@ public class SchedulerMain { return Modules.combine( new LifecycleModule(), new StatsModule(), - new AppModule(), + new AppModule(ALLOW_GPU_RESOURCE.get()), new CronModule(), new DbModule.MigrationManagerModule(), DbModule.productionModule(Bindings.annotatedKeyFactory(Storage.Volatile.class)), @@ -195,7 +198,7 @@ public class SchedulerMain { List<Module> modules = ImmutableList.<Module>builder() .add( - new CommandLineDriverSettingsModule(), + new CommandLineDriverSettingsModule(ALLOW_GPU_RESOURCE.get()), new LibMesosLoadingModule(), new MesosLogStreamModule(FlaggedZooKeeperConfig.create()), new LogStorageModule(), http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModule.java b/src/main/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModule.java index e137daa..8a386bd 100644 --- a/src/main/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModule.java +++ b/src/main/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModule.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; import static org.apache.mesos.Protos.FrameworkInfo; import static org.apache.mesos.Protos.FrameworkInfo.Capability; +import static org.apache.mesos.Protos.FrameworkInfo.Capability.Type.GPU_RESOURCES; import static org.apache.mesos.Protos.FrameworkInfo.Capability.Type.REVOCABLE_RESOURCES; /** @@ -100,6 +101,12 @@ public class CommandLineDriverSettingsModule extends AbstractModule { + "resources in offer.") private static final Arg<String> MESOS_ROLE = Arg.create(); + private final boolean allowGpuResource; + + public CommandLineDriverSettingsModule(boolean allowGpuResource) { + this.allowGpuResource = allowGpuResource; + } + @Override protected void configure() { Optional<Protos.Credential> credentials = getCredentials(); @@ -118,6 +125,7 @@ public class CommandLineDriverSettingsModule extends AbstractModule { principal, FRAMEWORK_FAILOVER_TIMEOUT.get(), RECEIVE_REVOCABLE_RESOURCES.get(), + allowGpuResource, role)); bind(DriverSettings.class).toInstance(settings); } @@ -152,6 +160,7 @@ public class CommandLineDriverSettingsModule extends AbstractModule { Optional<String> principal, Amount<Long, Time> failoverTimeout, boolean revocable, + boolean allowGpu, Optional<String> role) { FrameworkInfo.Builder infoBuilder = FrameworkInfo.newBuilder() @@ -168,6 +177,10 @@ public class CommandLineDriverSettingsModule extends AbstractModule { infoBuilder.addCapabilities(Capability.newBuilder().setType(REVOCABLE_RESOURCES)); } + if (allowGpu) { + infoBuilder.addCapabilities(Capability.newBuilder().setType(GPU_RESOURCES)); + } + if (role.isPresent()) { infoBuilder.setRole(role.get()); } http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java index cbbd6be..f9b1c7c 100644 --- a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java +++ b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java @@ -90,6 +90,9 @@ public interface MesosTaskFactory { @VisibleForTesting static final String DEFAULT_PORT_PROTOCOL = "TCP"; + @VisibleForTesting + static final String SOURCE_LABEL = "source"; + private final ExecutorSettings executorSettings; private final TierManager tierManager; private final IServerInfo serverInfo; @@ -262,7 +265,11 @@ public interface MesosTaskFactory { ExecutorInfo.Builder builder = executorSettings.getExecutorConfig().getExecutor().toBuilder() .setExecutorId(getExecutorId(task.getTaskId())) - .setSource(getInstanceSourceName(task.getTask(), task.getInstanceId())); + .setLabels( + Labels.newBuilder().addLabels( + Label.newBuilder() + .setKey(SOURCE_LABEL) + .setValue(getInstanceSourceName(task.getTask(), task.getInstanceId())))); //TODO: (rdelvalle) add output_file when Aurora's Mesos dep is updated (MESOS-4735) List<CommandInfo.URI> mesosFetcherUris = task.getTask().getMesosFetcherUris().stream() http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/python/apache/aurora/executor/BUILD ---------------------------------------------------------------------- diff --git a/src/main/python/apache/aurora/executor/BUILD b/src/main/python/apache/aurora/executor/BUILD index 0be65fc..486230d 100644 --- a/src/main/python/apache/aurora/executor/BUILD +++ b/src/main/python/apache/aurora/executor/BUILD @@ -54,7 +54,7 @@ python_binary( ':_executor', # TODO(ksweeney): This violates the rule that every library export the same deps as its # contained binaries. - '3rdparty/python:mesos.native', + '3rdparty/python:mesos.executor', ] ) http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/main/python/apache/aurora/executor/bin/thermos_executor_main.py ---------------------------------------------------------------------- diff --git a/src/main/python/apache/aurora/executor/bin/thermos_executor_main.py b/src/main/python/apache/aurora/executor/bin/thermos_executor_main.py index 0ef3856..c515931 100644 --- a/src/main/python/apache/aurora/executor/bin/thermos_executor_main.py +++ b/src/main/python/apache/aurora/executor/bin/thermos_executor_main.py @@ -42,7 +42,7 @@ from apache.aurora.executor.thermos_task_runner import ( ) try: - from mesos.native import MesosExecutorDriver + from mesos.executor import MesosExecutorDriver except ImportError: print(traceback.format_exc(), file=sys.stderr) MesosExecutorDriver = None http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/test/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModuleTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModuleTest.java b/src/test/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModuleTest.java index 448d57a..ffc960c 100644 --- a/src/test/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModuleTest.java +++ b/src/test/java/org/apache/aurora/scheduler/mesos/CommandLineDriverSettingsModuleTest.java @@ -26,6 +26,7 @@ import org.apache.aurora.common.quantity.Time; import org.apache.mesos.Protos; import org.junit.Test; +import static org.apache.mesos.Protos.FrameworkInfo.Capability.Type.GPU_RESOURCES; import static org.apache.mesos.Protos.FrameworkInfo.Capability.Type.REVOCABLE_RESOURCES; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -77,7 +78,8 @@ public class CommandLineDriverSettingsModuleTest { "user", Optional.absent(), Amount.of(1L, Time.MINUTES), - false, + false, // revocable + false, // allow gpu Optional.absent()); assertEquals("", info.getPrincipal()); assertEquals(0, info.getCapabilitiesCount()); @@ -91,7 +93,8 @@ public class CommandLineDriverSettingsModuleTest { "user", Optional.absent(), Amount.of(1L, Time.MINUTES), - true, + true, // revocable + false, // allow gpu Optional.absent()); assertEquals("", info.getPrincipal()); assertEquals(1, info.getCapabilitiesCount()); @@ -100,13 +103,30 @@ public class CommandLineDriverSettingsModuleTest { } @Test + public void testFrameworkInfoAllowGpu() { + Protos.FrameworkInfo info = CommandLineDriverSettingsModule.buildFrameworkInfo( + "aurora", + "user", + Optional.absent(), + Amount.of(1L, Time.MINUTES), + false, // revocable + true, // allow gpu + Optional.absent()); + assertEquals("", info.getPrincipal()); + assertEquals(1, info.getCapabilitiesCount()); + assertEquals(GPU_RESOURCES, info.getCapabilities(0).getType()); + assertFalse(info.hasRole()); + } + + @Test public void testFrameworkInfoNoRevocableWithAnnouncedPrincipal() { Protos.FrameworkInfo info = CommandLineDriverSettingsModule.buildFrameworkInfo( "aurora", "user", Optional.of("auroraprincipal"), Amount.of(1L, Time.MINUTES), - false, + false, // revocable + false, // allow gpu Optional.absent()); assertEquals("auroraprincipal", info.getPrincipal()); assertEquals(0, info.getCapabilitiesCount()); @@ -120,11 +140,13 @@ public class CommandLineDriverSettingsModuleTest { "user", Optional.of("auroraprincipal"), Amount.of(1L, Time.MINUTES), - true, + true, // revocable + true, // allow gpu Optional.of(TEST_ROLE)); assertEquals("auroraprincipal", info.getPrincipal()); - assertEquals(1, info.getCapabilitiesCount()); + assertEquals(2, info.getCapabilitiesCount()); assertEquals(REVOCABLE_RESOURCES, info.getCapabilities(0).getType()); + assertEquals(GPU_RESOURCES, info.getCapabilities(1).getType()); assertTrue(info.hasRole()); assertEquals(TEST_ROLE, info.getRole()); } http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java index 500fd43..bb8a849 100644 --- a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java +++ b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java @@ -65,6 +65,7 @@ import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER; import static org.apache.aurora.scheduler.base.TaskTestUtil.REVOCABLE_TIER; import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.DEFAULT_PORT_PROTOCOL; import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.METADATA_LABEL_PREFIX; +import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.SOURCE_LABEL; import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.getInverseJobSourceName; import static org.apache.aurora.scheduler.mesos.TaskExecutors.NO_OVERHEAD_EXECUTOR; import static org.apache.aurora.scheduler.mesos.TaskExecutors.SOME_OVERHEAD_EXECUTOR; @@ -151,8 +152,14 @@ public class MesosTaskFactoryImplTest extends EasyMockTest { return executor.toBuilder() .clearResources() .setExecutorId(MesosTaskFactoryImpl.getExecutorId(task.getTaskId())) - .setSource( - MesosTaskFactoryImpl.getInstanceSourceName(task.getTask(), task.getInstanceId())) + .setLabels( + Protos.Labels.newBuilder().addLabels( + Protos.Label.newBuilder() + .setKey(SOURCE_LABEL) + .setValue( + MesosTaskFactoryImpl.getInstanceSourceName( + task.getTask(), + task.getInstanceId())))) .setCommand(executor.getCommand().toBuilder().addAllUris( ImmutableSet.of( URI.newBuilder() http://git-wip-us.apache.org/repos/asf/aurora/blob/b912e172/src/test/sh/org/apache/aurora/e2e/Dockerfile ---------------------------------------------------------------------- diff --git a/src/test/sh/org/apache/aurora/e2e/Dockerfile b/src/test/sh/org/apache/aurora/e2e/Dockerfile index 6fdea3d..1b91f02 100644 --- a/src/test/sh/org/apache/aurora/e2e/Dockerfile +++ b/src/test/sh/org/apache/aurora/e2e/Dockerfile @@ -14,10 +14,8 @@ FROM python:2.7 -# mesos.native requires libcurl-nss to initialize MesosExecutorDriver # The mesos containerizer does not auto-create mount points, so we must initialize them manually. # TODO(jcohen): Remove this mkdir when https://issues.apache.org/jira/browse/MESOS-5229 is resolved. -RUN apt-get update && apt-get -y install libcurl4-nss-dev \ - && mkdir -p /home/vagrant/aurora/examples/vagrant/config +RUN mkdir -p /home/vagrant/aurora/examples/vagrant/config COPY http_example.py /tmp/