diff --git a/magnum/conductor/template_definition.py b/magnum/conductor/template_definition.py index 70d7cda990..9d1ed35a9b 100644 --- a/magnum/conductor/template_definition.py +++ b/magnum/conductor/template_definition.py @@ -646,7 +646,10 @@ class UbuntuMesosTemplateDefinition(BaseTemplateDefinition): extra_params['domain_name'] = context.domain_name extra_params['region_name'] = osc.cinder_region_name() - label_list = ['rexray_preempt'] + label_list = ['rexray_preempt', 'mesos_slave_isolation', + 'mesos_slave_image_providers', + 'mesos_slave_work_dir', + 'mesos_slave_executor_environment_variables'] for label in label_list: extra_params[label] = baymodel.labels.get(label) diff --git a/magnum/templates/mesos/fragments/configure-mesos-slave.sh b/magnum/templates/mesos/fragments/configure-mesos-slave.sh index 13bd2b6390..168184e217 100644 --- a/magnum/templates/mesos/fragments/configure-mesos-slave.sh +++ b/magnum/templates/mesos/fragments/configure-mesos-slave.sh @@ -30,3 +30,23 @@ echo "docker,mesos" > /etc/mesos-slave/containerizers cat > /etc/mesos-slave/executor_registration_timeout < /etc/mesos-slave/isolation +fi + +if [ -n "$WORK_DIR" ]; then + echo "$WORK_DIR" > /etc/mesos-slave/work_dir +fi + +if [ -n "$IMAGE_PROVIDERS" ]; then + if [ -n "$ISOLATION" ]; then + echo "$IMAGE_PROVIDERS" > /etc/mesos-slave/image_providers + else + echo "isolation doesn't exist, not setting image_providers" + fi +fi + +if [ -n "$EXECUTOR_ENVIRONMENT_VARIABLES" ]; then + echo "$EXECUTOR_ENVIRONMENT_VARIABLES" > /etc/mesos-slave/executor_environment_variables +fi diff --git a/magnum/templates/mesos/fragments/write-heat-params.yaml b/magnum/templates/mesos/fragments/write-heat-params.yaml index 51b7ff57b5..d9a4b91cc8 100644 --- a/magnum/templates/mesos/fragments/write-heat-params.yaml +++ b/magnum/templates/mesos/fragments/write-heat-params.yaml @@ -18,3 +18,7 @@ write_files: REGION_NAME="$REGION_NAME" DOMAIN_NAME="$DOMAIN_NAME" REXRAY_PREEMPT="$REXRAY_PREEMPT" + ISOLATION="$ISOLATION" + WORK_DIR="$WORK_DIR" + IMAGE_PROVIDERS="$IMAGE_PROVIDERS" + EXECUTOR_ENVIRONMENT_VARIABLES="$EXECUTOR_ENVIRONMENT_VARIABLES" diff --git a/magnum/templates/mesos/mesoscluster.yaml b/magnum/templates/mesos/mesoscluster.yaml index 991bdc8e18..a43645a357 100644 --- a/magnum/templates/mesos/mesoscluster.yaml +++ b/magnum/templates/mesos/mesoscluster.yaml @@ -155,6 +155,38 @@ parameters: type: string description: url for keystone + mesos_slave_isolation: + type: string + description: > + Isolation mechanisms to use, e.g., `posix/cpu,posix/mem`, or + `cgroups/cpu,cgroups/mem`, or network/port_mapping (configure with flag: + `--with-network-isolator` to enable), or `cgroups/devices/gpus/nvidia` + for nvidia specific gpu isolation (configure with flag: `--enable-nvidia + -gpu-support` to enable), or `external`, or load an alternate isolator + module using the `--modules` flag. Note that this flag is only relevant + for the Mesos Containerizer. + default: "" + + mesos_slave_work_dir: + type: string + description: directory path to place framework work directories + default: "" + + mesos_slave_image_providers: + type: string + description: > + Comma separated list of supported image providers e.g., + APPC,DOCKER + default: "" + + mesos_slave_executor_environment_variables: + type: string + description: > + JSON object representing the environment variables that should be passed + to the executor, and thus subsequently task(s). By default the executor, + executor will inherit the agent's environment variables. + default: "" + resources: ###################################################################### @@ -388,6 +420,10 @@ resources: region_name: {get_param: region_name} domain_name: {get_param: domain_name} rexray_preempt: {get_param: rexray_preempt} + mesos_slave_isolation: {get_param: mesos_slave_isolation} + mesos_slave_work_dir: {get_param: mesos_slave_work_dir} + mesos_slave_image_providers: {get_param: mesos_slave_image_providers} + mesos_slave_executor_environment_variables: {get_param: mesos_slave_executor_environment_variables} outputs: diff --git a/magnum/templates/mesos/mesosslave.yaml b/magnum/templates/mesos/mesosslave.yaml index 3c10af7e4c..96a5e28ab1 100644 --- a/magnum/templates/mesos/mesosslave.yaml +++ b/magnum/templates/mesos/mesosslave.yaml @@ -87,6 +87,34 @@ parameters: enables any host to take control of a volume irrespective of whether other hosts are using the volume + mesos_slave_isolation: + type: string + description: > + Isolation mechanisms to use, e.g., `posix/cpu,posix/mem`, or + `cgroups/cpu,cgroups/mem`, or network/port_mapping (configure with flag: + `--with-network-isolator` to enable), or `cgroups/devices/gpus/nvidia` + for nvidia specific gpu isolation (configure with flag: `--enable-nvidia + -gpu-support` to enable), or `external`, or load an alternate isolator + module using the `--modules` flag. Note that this flag is only relevant + for the Mesos Containerizer. + + mesos_slave_work_dir: + type: string + description: directory path to place framework work directories + + mesos_slave_image_providers: + type: string + description: > + Comma separated list of supported image providers e.g., + APPC,DOCKER + + mesos_slave_executor_environment_variables: + type: string + description: > + JSON object representing the environment variables that should be passed + to the executor, and thus subsequently task(s). By default the executor, + executor will inherit the agent's environment variables. + mesos_masters_ips: type: string description: IP addresses of the Mesos master servers. @@ -150,6 +178,10 @@ resources: "$REGION_NAME": {get_param: region_name} "$DOMAIN_NAME": {get_param: domain_name} "$REXRAY_PREEMPT": {get_param: rexray_preempt} + "$ISOLATION": {get_param: mesos_slave_isolation} + "$WORK_DIR": {get_param: mesos_slave_work_dir} + "$IMAGE_PROVIDERS": {get_param: mesos_slave_image_providers} + "$EXECUTOR_ENVIRONMENT_VARIABLES": {get_param: mesos_slave_executor_environment_variables} configure_mesos_slave: type: OS::Heat::SoftwareConfig diff --git a/magnum/tests/unit/conductor/handlers/test_mesos_bay_conductor.py b/magnum/tests/unit/conductor/handlers/test_mesos_bay_conductor.py index 6f58713a61..5cbc3b9974 100644 --- a/magnum/tests/unit/conductor/handlers/test_mesos_bay_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_mesos_bay_conductor.py @@ -40,7 +40,13 @@ class TestBayConductorWithMesos(base.TestCase): 'no_proxy': 'no_proxy', 'server_type': 'vm', 'volume_driver': 'volume_driver', - 'labels': {'rexray_preempt': 'False'} + 'labels': {'rexray_preempt': 'False', + 'mesos_slave_isolation': + 'docker/runtime,filesystem/linux', + 'mesos_slave_image_providers': 'docker', + 'mesos_slave_executor_environment_variables': '{}', + 'mesos_slave_work_dir': '/tmp/mesos/slave' + } } self.bay_dict = { 'id': 1, @@ -107,7 +113,11 @@ class TestBayConductorWithMesos(base.TestCase): 'username': 'mesos_user', 'tenant_name': 'admin', 'domain_name': 'domainname', - 'rexray_preempt': 'False' + 'rexray_preempt': 'False', + 'mesos_slave_executor_environment_variables': '{}', + 'mesos_slave_isolation': 'docker/runtime,filesystem/linux', + 'mesos_slave_work_dir': '/tmp/mesos/slave', + 'mesos_slave_image_providers': 'docker' } self.assertEqual(expected, definition) @@ -145,7 +155,11 @@ class TestBayConductorWithMesos(base.TestCase): 'username': 'mesos_user', 'tenant_name': 'admin', 'domain_name': 'domainname', - 'rexray_preempt': 'False' + 'rexray_preempt': 'False', + 'mesos_slave_isolation': 'docker/runtime,filesystem/linux', + 'mesos_slave_executor_environment_variables': '{}', + 'mesos_slave_work_dir': '/tmp/mesos/slave', + 'mesos_slave_image_providers': 'docker' } self.assertEqual(expected, definition) diff --git a/magnum/tests/unit/conductor/test_template_definition.py b/magnum/tests/unit/conductor/test_template_definition.py index 3287b227e1..156edaa0ca 100644 --- a/magnum/tests/unit/conductor/test_template_definition.py +++ b/magnum/tests/unit/conductor/test_template_definition.py @@ -524,6 +524,13 @@ class UbuntuMesosTemplateDefinitionTestCase(base.TestCase): mock_baymodel = mock.MagicMock() mock_baymodel.tls_disabled = False rexray_preempt = mock_baymodel.labels.get('rexray_preempt') + mesos_slave_isolation = mock_baymodel.labels.get( + 'mesos_slave_isolation') + mesos_slave_work_dir = mock_baymodel.labels.get('mesos_slave_work_dir') + mesos_slave_image_providers = mock_baymodel.labels.get( + 'image_providers') + mesos_slave_executor_environment_variables = mock_baymodel.labels.get( + 'mesos_slave_executor_environment_variables') mock_bay = mock.MagicMock() mock_bay.uuid = '5d12f6fd-a196-4bf0-ae4c-1f639a523a52' del mock_bay.stack_id @@ -541,7 +548,12 @@ class UbuntuMesosTemplateDefinitionTestCase(base.TestCase): 'username': 'mesos_user', 'tenant_name': 'admin', 'domain_name': 'domainname', - 'rexray_preempt': rexray_preempt}} + 'rexray_preempt': rexray_preempt, + 'mesos_slave_isolation': mesos_slave_isolation, + 'mesos_slave_work_dir': mesos_slave_work_dir, + 'mesos_slave_executor_environment_variables': + mesos_slave_executor_environment_variables, + 'mesos_slave_image_providers': mesos_slave_image_providers}} mock_get_params.assert_called_once_with(mock_context, mock_baymodel, mock_bay, **expected_kwargs)