From bc56f286d4118bfd8c6ad14d0c91f55eb407aa7e Mon Sep 17 00:00:00 2001 From: wangqun Date: Mon, 29 Feb 2016 09:45:01 +0000 Subject: [PATCH] Add Container Volume Model into Kubernetes Heat Templates Previously,the kubernetes bay type did not support the Magnum Container Volume Model. This patch adds support for volume through the following: 1. Add volume_driver, region_name to kubernetes bay type. 2. Update kubernetes unit tests to support container volume. 3. Update kubernetes heat templates for container volume model. Note: The Container Volume Model of Kubernetes need the kubernetes Version >= 1.1.1 and docker version >= 1.8.3 Change-Id: I8f568087f8e8254cb14a81edb526e596da33abcc Partially-Implements: blueprint magnum-integrate-with-cinder --- magnum/conductor/template_definition.py | 3 ++ .../fragments/configure-kubernetes-minion.sh | 26 ++++++++++++++ .../fragments/write-heat-params.yaml | 6 ++++ magnum/templates/kubernetes/kubecluster.yaml | 15 ++++++++ magnum/templates/kubernetes/kubeminion.yaml | 36 +++++++++++++++++++ .../handlers/test_k8s_bay_conductor.py | 9 +++++ .../conductor/test_template_definition.py | 4 +++ 7 files changed, 99 insertions(+) diff --git a/magnum/conductor/template_definition.py b/magnum/conductor/template_definition.py index d12b6c9ba9..e9eea3092f 100644 --- a/magnum/conductor/template_definition.py +++ b/magnum/conductor/template_definition.py @@ -456,6 +456,8 @@ class K8sTemplateDefinition(BaseTemplateDefinition): required=True) self.add_parameter('network_driver', baymodel_attr='network_driver') + self.add_parameter('volume_driver', + baymodel_attr='volume_driver') self.add_parameter('tls_disabled', baymodel_attr='tls_disabled', required=True) @@ -518,6 +520,7 @@ class AtomicK8sTemplateDefinition(K8sTemplateDefinition): osc = clients.OpenStackClients(context) extra_params['user_token'] = self._get_user_token(context, osc, bay) extra_params['magnum_url'] = osc.magnum_url() + extra_params['region_name'] = osc.cinder_region_name() if baymodel.tls_disabled: extra_params['loadbalancing_protocol'] = 'HTTP' diff --git a/magnum/templates/kubernetes/fragments/configure-kubernetes-minion.sh b/magnum/templates/kubernetes/fragments/configure-kubernetes-minion.sh index 015f5d398b..d1266de971 100644 --- a/magnum/templates/kubernetes/fragments/configure-kubernetes-minion.sh +++ b/magnum/templates/kubernetes/fragments/configure-kubernetes-minion.sh @@ -38,6 +38,32 @@ if [ "$NETWORK_DRIVER" == "flannel" ]; then ' /etc/sysconfig/flanneld fi +if [ "$VOLUME_DRIVER" == "cinder" ]; then + CLOUD_CONFIG=/etc/kubernetes/kube_openstack_config + KUBERNETES=/etc/kubernetes + if [ ! -d ${KUBERNETES} -o ! -f ${CLOUD_CONFIG} ]; then + sudo mkdir -p $KUBERNETES + fi + AUTH_URL=${AUTH_URL/v3/v2} +cat > $CLOUD_CONFIG <> /etc/kubernetes/kubelet +#KUBELET_ARGS="$KUBELET_ARGS --cloud-provider=openstack --cloud-config=/etc/kubernetes/kube_openstack_config" +_EOC_ + + if [ ! -f /usr/bin/udevadm ]; then + sudo ln -s /sbin/udevadm /usr/bin/udevadm + fi + +fi + cat >> /etc/environment < @@ -496,6 +505,12 @@ resources: user_token: {get_param: user_token} bay_uuid: {get_param: bay_uuid} magnum_url: {get_param: magnum_url} + volume_driver: {get_param: volume_driver} + region_name: {get_param: region_name} + tenant_name: {get_param: tenant_name} + auth_url: {get_param: auth_url} + username: {get_param: username} + password: {get_param: password} kubernetes_port: {get_param: kubernetes_port} tls_disabled: {get_param: tls_disabled} secgroup_kube_minion_id: {get_resource: secgroup_kube_minion} diff --git a/magnum/templates/kubernetes/kubeminion.yaml b/magnum/templates/kubernetes/kubeminion.yaml index deef611376..d3f83b81ce 100644 --- a/magnum/templates/kubernetes/kubeminion.yaml +++ b/magnum/templates/kubernetes/kubeminion.yaml @@ -151,6 +151,36 @@ parameters: type: string description: ID of the security group for kubernetes minion. + volume_driver: + type: string + description: volume driver to use for container storage + + region_name: + type: string + description: A logically separate section of the cluster + + tenant_name: + type: string + description: an alternative term for a project + + auth_url: + type: string + description: > + url for kubernetes to authenticate before sending request to neutron + must be v2 since kubernetes backend only suppor v2 at this point + + username: + type: string + description: > + user account + + password: + type: string + description: > + user password, not set in current implementation, only used to + fill in for Kubernetes config file + hidden: true + http_proxy: type: string description: http proxy address for docker @@ -213,6 +243,12 @@ resources: $BAY_UUID: {get_param: bay_uuid} $USER_TOKEN: {get_param: user_token} $MAGNUM_URL: {get_param: magnum_url} + $AUTH_URL: {get_param: auth_url} + $USERNAME: {get_param: username} + $PASSWORD: {get_param: password} + $VOLUME_DRIVER: {get_param: volume_driver} + $REGION_NAME: {get_param: region_name} + $TENANT_NAME: {get_param: tenant_name} $HTTP_PROXY: {get_param: http_proxy} $HTTPS_PROXY: {get_param: https_proxy} $NO_PROXY: {get_param: no_proxy} diff --git a/magnum/tests/unit/conductor/handlers/test_k8s_bay_conductor.py b/magnum/tests/unit/conductor/handlers/test_k8s_bay_conductor.py index f403c0baab..37c3239283 100644 --- a/magnum/tests/unit/conductor/handlers/test_k8s_bay_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_k8s_bay_conductor.py @@ -32,6 +32,7 @@ class TestBayConductorWithK8s(base.TestCase): 'dns_nameserver': 'dns_nameserver', 'external_network_id': 'external_network_id', 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'docker_volume_size': 20, 'cluster_distro': 'fedora-atomic', 'coe': 'kubernetes', @@ -74,6 +75,7 @@ class TestBayConductorWithK8s(base.TestCase): self.addCleanup(osc_patcher.stop) self.mock_osc = mock.MagicMock() self.mock_osc.magnum_url.return_value = 'http://127.0.0.1:9511/v1' + self.mock_osc.cinder_region_name.return_value = 'RegionOne' self.mock_osc_class.return_value = self.mock_osc mock_stack = self.mock_osc.heat.return_value.stacks.get.return_value mock_stack.parameters = {'user_token': 'fake_token'} @@ -107,6 +109,7 @@ class TestBayConductorWithK8s(base.TestCase): 'flavor_id': 'minion_flavor', 'docker_volume_size': 'docker_volume_size', 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'master_flavor_id': 'master_flavor', 'apiserver_port': '', 'node_count': 'number_of_minions', @@ -127,6 +130,7 @@ class TestBayConductorWithK8s(base.TestCase): 'ssh_key_name': 'keypair_id', 'external_network': 'external_network_id', 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'dns_nameserver': 'dns_nameserver', 'server_image': 'image_id', 'minion_flavor': 'flavor_id', @@ -146,6 +150,7 @@ class TestBayConductorWithK8s(base.TestCase): 'user_token': 'fake_token', 'bay_uuid': self.bay_dict['uuid'], 'magnum_url': self.mock_osc.magnum_url.return_value, + 'region_name': self.mock_osc.cinder_region_name.return_value, 'tls_disabled': False, 'trustee_domain_id': '3527620c-b220-4f37-9ebc-6e63a81a9b2f', 'trustee_username': 'fake_trustee', @@ -182,6 +187,7 @@ class TestBayConductorWithK8s(base.TestCase): 'number_of_minions': 1, 'number_of_masters': 1, 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'discovery_url': 'https://discovery.etcd.io/test', 'http_proxy': 'http_proxy', 'https_proxy': 'https_proxy', @@ -227,6 +233,7 @@ class TestBayConductorWithK8s(base.TestCase): 'number_of_minions': 1, 'number_of_masters': 1, 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'discovery_url': 'http://tokentest/h1/h2/h3', 'http_proxy': 'http_proxy', 'https_proxy': 'https_proxy', @@ -340,6 +347,7 @@ class TestBayConductorWithK8s(base.TestCase): 'number_of_minions': 1, 'number_of_masters': 1, 'network_driver': 'network_driver', + 'volume_driver': 'volume_driver', 'docker_volume_size': 20, 'discovery_url': 'https://address/token', 'http_proxy': 'http_proxy', @@ -353,6 +361,7 @@ class TestBayConductorWithK8s(base.TestCase): 'user_token': 'fake_token', 'bay_uuid': self.bay_dict['uuid'], 'magnum_url': self.mock_osc.magnum_url.return_value, + 'region_name': self.mock_osc.cinder_region_name.return_value, 'tls_disabled': False, 'trustee_domain_id': '3527620c-b220-4f37-9ebc-6e63a81a9b2f', 'trustee_username': 'fake_trustee', diff --git a/magnum/tests/unit/conductor/test_template_definition.py b/magnum/tests/unit/conductor/test_template_definition.py index 06b57ca860..30506405a0 100644 --- a/magnum/tests/unit/conductor/test_template_definition.py +++ b/magnum/tests/unit/conductor/test_template_definition.py @@ -181,6 +181,7 @@ class AtomicK8sTemplateDefinitionTestCase(base.TestCase): mock_scale_manager = mock.MagicMock() mock_osc = mock.MagicMock() mock_osc.magnum_url.return_value = 'http://127.0.0.1:9511/v1' + mock_osc.cinder_region_name.return_value = 'RegionOne' mock_osc_class.return_value = mock_osc removal_nodes = ['node1', 'node2'] @@ -209,6 +210,7 @@ class AtomicK8sTemplateDefinitionTestCase(base.TestCase): 'username': 'fake_user', 'tenant_name': 'fake_tenant', 'magnum_url': mock_osc.magnum_url.return_value, + 'region_name': mock_osc.cinder_region_name.return_value, 'user_token': mock_context.auth_token}} mock_get_params.assert_called_once_with(mock_context, mock_baymodel, mock_bay, **expected_kwargs) @@ -232,6 +234,7 @@ class AtomicK8sTemplateDefinitionTestCase(base.TestCase): mock_scale_manager = mock.MagicMock() mock_osc = mock.MagicMock() mock_osc.magnum_url.return_value = 'http://127.0.0.1:9511/v1' + mock_osc.cinder_region_name.return_value mock_osc_class.return_value = mock_osc removal_nodes = ['node1', 'node2'] @@ -260,6 +263,7 @@ class AtomicK8sTemplateDefinitionTestCase(base.TestCase): 'username': 'fake_user', 'tenant_name': 'fake_tenant', 'magnum_url': mock_osc.magnum_url.return_value, + 'region_name': mock_osc.cinder_region_name.return_value, 'user_token': mock_context.auth_token, 'loadbalancing_protocol': 'HTTP', 'kubernetes_port': 8080}}