diff --git a/magnum/drivers/swarm_fedora_atomic_v1/template_def.py b/magnum/drivers/swarm_fedora_atomic_v1/template_def.py index 4688d5db08..da9813e4cf 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/template_def.py +++ b/magnum/drivers/swarm_fedora_atomic_v1/template_def.py @@ -59,6 +59,8 @@ class AtomicSwarmTemplateDefinition(template_def.BaseTemplateDefinition): cluster_template_attr='flavor_id') self.add_parameter('docker_volume_size', cluster_template_attr='docker_volume_size') + self.add_parameter('volume_driver', + cluster_template_attr='volume_driver') self.add_parameter('external_network', cluster_template_attr='external_network_id', required=True) @@ -98,7 +100,9 @@ class AtomicSwarmTemplateDefinition(template_def.BaseTemplateDefinition): extra_params['magnum_url'] = osc.magnum_url() label_list = ['flannel_network_cidr', 'flannel_backend', - 'flannel_network_subnetlen'] + 'flannel_network_subnetlen', 'rexray_preempt'] + + extra_params['auth_url'] = context.auth_url for label in label_list: extra_params[label] = cluster_template.labels.get(label) diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml b/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml index 07bf3ff99d..c10754cb85 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml @@ -212,6 +212,21 @@ parameters: size fo the data segments for the swift dynamic large objects default: 5242880 + volume_driver: + type: string + description: volume driver to use for container storage + default: "" + constraints: + - allowed_values: ["","rexray"] + + rexray_preempt: + type: string + description: > + enables any host to take control of a volume irrespective of whether + other hosts are using the volume + default: "false" + + resources: ###################################################################### @@ -384,6 +399,8 @@ resources: trustee_password: {get_param: trustee_password} trust_id: {get_param: trust_id} auth_url: {get_param: auth_url} + volume_driver: {get_param: volume_driver} + rexray_preempt: {get_param: rexray_preempt} swarm_nodes: type: "OS::Heat::ResourceGroup" @@ -427,6 +444,8 @@ resources: registry_container: {get_param: registry_container} registry_insecure: {get_param: registry_insecure} registry_chunksize: {get_param: registry_chunksize} + volume_driver: {get_param: volume_driver} + rexray_preempt: {get_param: rexray_preempt} outputs: diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/volume-service.sh b/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/volume-service.sh new file mode 100644 index 0000000000..cc39ff8b11 --- /dev/null +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/volume-service.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# Add rexray volume driver support for Swarm +. /etc/sysconfig/heat-params + +set -e +set -x + +# if no voulume driver is selected don't do any configuration +if [ -z "$VOLUME_DRIVER" ]; then + exit 0 +fi + +mkdir -p /etc/rexray +mkdir -p /var/log/rexray +mkdir -p /var/run/rexray +mkdir -p /var/lib/rexray + +REXRAY_CONFIG=/etc/rexray/config.yml + +# Add rexray configuration +cat > $REXRAY_CONFIG < /etc/systemd/system/rexray.service < + enables any host to take control of a volume irrespective of whether + other hosts are using the volume + default: "false" + resources: master_wait_handle: @@ -213,6 +225,8 @@ resources: "$TRUSTEE_PASSWORD": {get_param: trustee_password} "$TRUST_ID": {get_param: trust_id} "$AUTH_URL": {get_param: auth_url} + "$VOLUME_DRIVER": {get_param: volume_driver} + "$REXRAY_PREEMPT": {get_param: rexray_preempt} write_network_config: type: "OS::Heat::SoftwareConfig" @@ -330,6 +344,12 @@ resources: group: ungrouped config: {get_file: fragments/add-proxy.sh} + volume_service: + type: "OS::Heat::SoftwareConfig" + properties: + group: ungrouped + config: {get_file: fragments/volume-service.sh} + swarm_master_init: type: "OS::Heat::MultipartMime" properties: @@ -350,6 +370,7 @@ resources: - config: {get_resource: add_proxy} - config: {get_resource: enable_services} - config: {get_resource: cfn_signal} + - config: {get_resource: volume_service} ###################################################################### # diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml index b65f23fc0f..b06e86902e 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml @@ -149,6 +149,18 @@ parameters: description: > size fo the data segments for the swift dynamic large objects + volume_driver: + type: string + description: volume driver to use for container storage + default: "" + + rexray_preempt: + type: string + description: > + enables any host to take control of a volume irrespective of whether + other hosts are using the volume + default: "false" + resources: node_wait_handle: @@ -202,6 +214,8 @@ resources: "$REGISTRY_CONTAINER": {get_param: registry_container} "$REGISTRY_INSECURE": {get_param: registry_insecure} "$REGISTRY_CHUNKSIZE": {get_param: registry_chunksize} + "$VOLUME_DRIVER": {get_param: volume_driver} + "$REXRAY_PREEMPT": {get_param: rexray_preempt} remove_docker_key: type: "OS::Heat::SoftwareConfig" @@ -301,6 +315,12 @@ resources: group: ungrouped config: {get_file: fragments/add-proxy.sh} + volume_service: + type: "OS::Heat::SoftwareConfig" + properties: + group: ungrouped + config: {get_file: fragments/volume-service.sh} + swarm_node_init: type: "OS::Heat::MultipartMime" properties: @@ -320,6 +340,7 @@ resources: - config: {get_resource: enable_docker_registry} - config: {get_resource: enable_services} - config: {get_resource: cfn_signal} + - config: {get_resource: volume_service} swarm_node: type: "OS::Nova::Server" diff --git a/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py b/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py index 99a0b9b9c1..0ee12d8686 100644 --- a/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py @@ -46,8 +46,10 @@ class TestBayConductorWithSwarm(base.TestCase): 'network_driver': 'network_driver', 'labels': {'flannel_network_cidr': '10.101.0.0/16', 'flannel_network_subnetlen': '26', - 'flannel_backend': 'vxlan'}, + 'flannel_backend': 'vxlan', + 'rexray_preempt': 'False'}, 'master_lb_enabled': False, + 'volume_driver': 'rexray' } self.bay_dict = { 'id': 1, @@ -128,7 +130,9 @@ class TestBayConductorWithSwarm(base.TestCase): 'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656', 'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de', 'auth_url': 'http://192.168.10.10:5000/v3', - 'swarm_version': 'fake-version' + 'swarm_version': 'fake-version', + 'volume_driver': 'rexray', + 'rexray_preempt': 'False' } self.assertEqual(expected, definition) self.assertEqual( @@ -193,7 +197,9 @@ class TestBayConductorWithSwarm(base.TestCase): 'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de', 'auth_url': 'http://192.168.10.10:5000/v3', 'docker_storage_driver': 'devicemapper', - 'swarm_version': 'fake-version' + 'swarm_version': 'fake-version', + 'volume_driver': 'rexray', + 'rexray_preempt': 'False' } self.assertEqual(expected, definition) self.assertEqual( @@ -210,7 +216,8 @@ class TestBayConductorWithSwarm(base.TestCase): not_required = ['image_id', 'flavor_id', 'dns_nameserver', 'docker_volume_size', 'fixed_network', 'http_proxy', 'https_proxy', 'no_proxy', 'network_driver', - 'master_flavor_id', 'docker_storage_driver'] + 'master_flavor_id', 'docker_storage_driver', + 'volume_driver', 'rexray_preempt'] for key in not_required: self.cluster_template_dict[key] = None self.bay_dict['discovery_url'] = 'https://discovery.etcd.io/test' @@ -250,7 +257,8 @@ class TestBayConductorWithSwarm(base.TestCase): 'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656', 'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de', 'auth_url': 'http://192.168.10.10:5000/v3', - 'swarm_version': 'fake-version' + 'swarm_version': 'fake-version', + 'rexray_preempt': 'False' } self.assertEqual(expected, definition) self.assertEqual( @@ -309,7 +317,9 @@ class TestBayConductorWithSwarm(base.TestCase): 'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656', 'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de', 'auth_url': 'http://192.168.10.10:5000/v3', - 'swarm_version': 'fake-version' + 'swarm_version': 'fake-version', + 'volume_driver': 'rexray', + 'rexray_preempt': 'False' } self.assertEqual(expected, definition) self.assertEqual( @@ -369,7 +379,9 @@ class TestBayConductorWithSwarm(base.TestCase): 'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656', 'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de', 'auth_url': 'http://192.168.10.10:5000/v3', - 'swarm_version': 'fake-version' + 'swarm_version': 'fake-version', + 'volume_driver': 'rexray', + 'rexray_preempt': 'False' } self.assertEqual(expected, definition) self.assertEqual( diff --git a/magnum/tests/unit/drivers/test_template_definition.py b/magnum/tests/unit/drivers/test_template_definition.py index 8a4a8fc8a9..28cabb0bb7 100644 --- a/magnum/tests/unit/drivers/test_template_definition.py +++ b/magnum/tests/unit/drivers/test_template_definition.py @@ -716,6 +716,7 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase): flannel_cidr = mock_baymodel.labels.get('flannel_network_cidr') flannel_subnet = mock_baymodel.labels.get('flannel_network_subnetlen') flannel_backend = mock_baymodel.labels.get('flannel_backend') + rexray_preempt = mock_baymodel.labels.get('rexray_preempt') swarm_def = swarm_tdef.AtomicSwarmTemplateDefinition() @@ -726,7 +727,9 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase): 'magnum_url': mock_osc.magnum_url.return_value, 'flannel_network_cidr': flannel_cidr, 'flannel_backend': flannel_backend, - 'flannel_network_subnetlen': flannel_subnet}} + 'flannel_network_subnetlen': flannel_subnet, + 'auth_url': 'http://192.168.10.10:5000/v3', + 'rexray_preempt': rexray_preempt}} mock_get_params.assert_called_once_with(mock_context, mock_baymodel, mock_bay, **expected_kwargs) diff --git a/releasenotes/notes/swarm-integration-with-cinder-e3068138a3f75dbe.yaml b/releasenotes/notes/swarm-integration-with-cinder-e3068138a3f75dbe.yaml new file mode 100644 index 0000000000..0d53e04200 --- /dev/null +++ b/releasenotes/notes/swarm-integration-with-cinder-e3068138a3f75dbe.yaml @@ -0,0 +1,10 @@ +--- +features: + - Integrate Docker Swarm Fedora Atomic driver with the + Block Storage Service (cinder). The rexray volume + driver was added based on rexray v0.4. Users can + create and attach volumes using docker's navive + client and they will authenticate using the per + cluster trustee user. Rexray can be either added + in the Fedora Atomic image or can be used running + in a container.