diff --git a/magnum/conductor/template_definition.py b/magnum/conductor/template_definition.py index 2314c81e56..3fe8bb387f 100644 --- a/magnum/conductor/template_definition.py +++ b/magnum/conductor/template_definition.py @@ -117,6 +117,9 @@ class OutputMapping(object): self.heat_output = heat_output def set_output(self, stack, bay): + if self.bay_attr is None: + return + for output in stack.outputs: if output['output_key'] == self.heat_output: setattr(bay, self.bay_attr, output['output_value']) @@ -320,6 +323,8 @@ class AtomicK8sTemplateDefinition(BaseTemplateDefinition): self.add_output('kube_master', bay_attr='api_address') + self.add_output('kube_minions', + bay_attr=None) self.add_output('kube_minions_external', bay_attr='node_addresses') diff --git a/magnum/templates/heat-kubernetes/kubecluster-coreos.yaml b/magnum/templates/heat-kubernetes/kubecluster-coreos.yaml index 23c809d1d0..b0980d8cf2 100644 --- a/magnum/templates/heat-kubernetes/kubecluster-coreos.yaml +++ b/magnum/templates/heat-kubernetes/kubecluster-coreos.yaml @@ -94,6 +94,15 @@ parameters: storage default: 25 + minions_to_remove: + type: comma_delimited_list + description: > + List of minions to be removed when doing an update. Individual minion may + be referenced several ways: (1) The resource name (e.g. ['1', '3']), + (2) The private IP address ['10.0.0.4', '10.0.0.6']. Note: the list should + be empty when doing an create. + default: [] + resources: master_wait_handle: @@ -328,6 +337,7 @@ resources: - extrouter_inside properties: count: {get_param: number_of_minions} + removal_policies: [{resource_list: {get_param: minions_to_remove}}] resource_def: type: kubenode-coreos.yaml properties: @@ -353,4 +363,3 @@ outputs: kube_minions_external: value: {get_attr: [kube_minions, kube_node_external_ip]} - diff --git a/magnum/templates/heat-kubernetes/kubecluster-fedora-ironic.yaml b/magnum/templates/heat-kubernetes/kubecluster-fedora-ironic.yaml index 6583a3472a..5f51f0d9e2 100644 --- a/magnum/templates/heat-kubernetes/kubecluster-fedora-ironic.yaml +++ b/magnum/templates/heat-kubernetes/kubecluster-fedora-ironic.yaml @@ -73,6 +73,15 @@ parameters: constraints: - allowed_values: ["true", "false"] + minions_to_remove: + type: comma_delimited_list + description: > + List of minions to be removed when doing an update. Individual minion may + be referenced several ways: (1) The resource name (e.g. ['1', '3']), + (2) The private IP address ['10.0.0.4', '10.0.0.6']. Note: the list should + be empty when doing an create. + default: [] + resources: ###################################################################### @@ -207,6 +216,7 @@ resources: depends_on: kube_master properties: count: {get_param: number_of_minions} + removal_policies: [{resource_list: {get_param: minions_to_remove}}] resource_def: type: kubenode-fedora-ironic.yaml properties: @@ -227,4 +237,4 @@ outputs: value: {get_attr: [kube_minions, kube_node_ip]} kube_minions_external: - value: {get_attr: [kube_minions, kube_node_external_ip]} \ No newline at end of file + value: {get_attr: [kube_minions, kube_node_external_ip]} diff --git a/magnum/templates/heat-kubernetes/kubecluster.yaml b/magnum/templates/heat-kubernetes/kubecluster.yaml index c05d6072cf..837b078cdc 100644 --- a/magnum/templates/heat-kubernetes/kubecluster.yaml +++ b/magnum/templates/heat-kubernetes/kubecluster.yaml @@ -87,10 +87,19 @@ parameters: wait_condition_timeout: type: number - description : > + description: > timeout for the Wait Conditions default: 6000 + minions_to_remove: + type: comma_delimited_list + description: > + List of minions to be removed when doing an update. Individual minion may + be referenced several ways: (1) The resource name (e.g. ['1', '3']), + (2) The private IP address ['10.0.0.4', '10.0.0.6']. Note: the list should + be empty when doing an create. + default: [] + resources: master_wait_handle: @@ -307,6 +316,7 @@ resources: - master_wait_condition properties: count: {get_param: number_of_minions} + removal_policies: [{resource_list: {get_param: minions_to_remove}}] resource_def: type: kubeminion.yaml properties: diff --git a/magnum/templates/heat-kubernetes/kubeminion.yaml b/magnum/templates/heat-kubernetes/kubeminion.yaml index 25e183ab21..9573338137 100644 --- a/magnum/templates/heat-kubernetes/kubeminion.yaml +++ b/magnum/templates/heat-kubernetes/kubeminion.yaml @@ -221,5 +221,9 @@ outputs: kube_minion_ip: value: {get_attr: [kube_minion_eth0, fixed_ips, 0, ip_address]} + kube_minion_external_ip: value: {get_attr: [kube_minion_floating, floating_ip_address]} + + OS::stack_id: + value: {get_attr: [kube_minion_eth0, fixed_ips, 0, ip_address]} diff --git a/magnum/templates/heat-kubernetes/kubenode-coreos.yaml b/magnum/templates/heat-kubernetes/kubenode-coreos.yaml index 3c98fc2905..5269338b5a 100644 --- a/magnum/templates/heat-kubernetes/kubenode-coreos.yaml +++ b/magnum/templates/heat-kubernetes/kubenode-coreos.yaml @@ -249,3 +249,5 @@ outputs: kube_node_external_ip: value: {get_attr: [kube_node_floating, floating_ip_address]} + OS::stack_id: + value: {get_attr: [kube_node_eth0, fixed_ips, 0, ip_address]} diff --git a/magnum/templates/heat-kubernetes/kubenode-fedora-ironic.yaml b/magnum/templates/heat-kubernetes/kubenode-fedora-ironic.yaml index 8b570c62e3..0b1a8012f4 100644 --- a/magnum/templates/heat-kubernetes/kubenode-fedora-ironic.yaml +++ b/magnum/templates/heat-kubernetes/kubenode-fedora-ironic.yaml @@ -173,3 +173,5 @@ outputs: kube_node_external_ip: value: {get_attr: [kube_node_floating, floating_ip_address]} + OS::stack_id: + value: {get_attr: [kube_node, networks, private, 0]} diff --git a/magnum/tests/unit/conductor/handlers/test_bay_conductor.py b/magnum/tests/unit/conductor/handlers/test_bay_conductor.py index 99c421030f..eecfc2ea51 100644 --- a/magnum/tests/unit/conductor/handlers/test_bay_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_bay_conductor.py @@ -284,7 +284,10 @@ class TestBayConductorWithK8s(base.TestCase): "output_key": "kube_minions_external"}, {"output_value": expected_api_address, "description": "No description given", - "output_key": "kube_master"} + "output_key": "kube_master"}, + {"output_value": ['any', 'output'], + "description": "No description given", + "output_key": "kube_minions"} ] mock_stack = mock.MagicMock() mock_stack.outputs = outputs