diff --git a/magnum/drivers/heat/k8s_coreos_template_def.py b/magnum/drivers/heat/k8s_coreos_template_def.py index f6038a5da6..45b8284f37 100644 --- a/magnum/drivers/heat/k8s_coreos_template_def.py +++ b/magnum/drivers/heat/k8s_coreos_template_def.py @@ -66,42 +66,49 @@ class CoreOSK8sTemplateDefinition(k8s_template_def.K8sTemplateDefinition): self.add_parameter('docker_storage_driver', cluster_template_attr='docker_storage_driver') - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): super(CoreOSK8sTemplateDefinition, - self).add_nodegroup_params(cluster) - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - self.add_parameter('number_of_minions', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('minion_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('master_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=master_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) + self).add_nodegroup_params(cluster, nodegroups=nodegroups) + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter( + 'master_flavor', nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + else: + self.add_parameter( + 'number_of_minions', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'minion_flavor', nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - - self.add_output('kube_minions', - nodegroup_attr='node_addresses', - nodegroup_uuid=worker_ng.uuid, - mapping_type=NodeAddressOutputMapping) - self.add_output('kube_masters', - nodegroup_attr='node_addresses', - nodegroup_uuid=master_ng.uuid, - mapping_type=MasterAddressOutputMapping) - self.add_output('number_of_minions', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - is_stack_param=True) + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output('kube_masters', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=MasterAddressOutputMapping) + else: + self.add_output('kube_minions', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=NodeAddressOutputMapping) + self.add_output('number_of_minions', + nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + is_stack_param=True) super(CoreOSK8sTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_params(self, context, cluster_template, cluster, **kwargs): extra_params = kwargs.pop('extra_params', {}) diff --git a/magnum/drivers/heat/k8s_fedora_template_def.py b/magnum/drivers/heat/k8s_fedora_template_def.py index 427149a598..c42cadbc77 100644 --- a/magnum/drivers/heat/k8s_fedora_template_def.py +++ b/magnum/drivers/heat/k8s_fedora_template_def.py @@ -69,20 +69,27 @@ class K8sFedoraTemplateDefinition(k8s_template_def.K8sTemplateDefinition): self.add_parameter('docker_storage_driver', cluster_template_attr='docker_storage_driver') - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output( + 'kube_masters', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=MasterAddressOutputMapping) + else: + self.add_output( + 'kube_minions', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=NodeAddressOutputMapping) - self.add_output('kube_minions', - nodegroup_attr='node_addresses', - nodegroup_uuid=worker_ng.uuid, - mapping_type=NodeAddressOutputMapping) - self.add_output('kube_masters', - nodegroup_attr='node_addresses', - nodegroup_uuid=master_ng.uuid, - mapping_type=MasterAddressOutputMapping) super(K8sFedoraTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_params(self, context, cluster_template, cluster, **kwargs): extra_params = kwargs.pop('extra_params', {}) @@ -117,9 +124,6 @@ class K8sFedoraTemplateDefinition(k8s_template_def.K8sTemplateDefinition): '"cinder" volume driver needs "cloud_provider_enabled" label ' 'to be true or unset.')) - extra_params['master_image'] = cluster_template.image_id - extra_params['minion_image'] = cluster_template.image_id - label_list = ['coredns_tag', 'kube_tag', 'container_infra_prefix', 'availability_zone', diff --git a/magnum/drivers/heat/k8s_template_def.py b/magnum/drivers/heat/k8s_template_def.py index e3771f3bb2..9f42757960 100644 --- a/magnum/drivers/heat/k8s_template_def.py +++ b/magnum/drivers/heat/k8s_template_def.py @@ -86,33 +86,50 @@ class K8sTemplateDefinition(template_def.BaseTemplateDefinition): self.add_output('kube_masters_private', cluster_attr=None) - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): super(K8sTemplateDefinition, - self).add_nodegroup_params(cluster) - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - self.add_parameter('number_of_minions', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('minion_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('master_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=master_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) + self).add_nodegroup_params(cluster, nodegroups=nodegroups) + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter( + 'master_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'master_image', nodegroup_attr='image_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + else: + self.add_parameter( + 'number_of_minions', + nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'minion_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'minion_image', nodegroup_attr='image_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - self.add_output('number_of_minions', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - is_stack_param=True, - mapping_type=template_def.NodeGroupOutputMapping) + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker] + for nodegroup in nodegroups: + if nodegroup.role != 'master': + self.add_output( + 'number_of_minions', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, is_stack_param=True, + mapping_type=template_def.NodeGroupOutputMapping) super(K8sTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_params(self, context, cluster_template, cluster, **kwargs): extra_params = kwargs.pop('extra_params', {}) diff --git a/magnum/drivers/heat/swarm_fedora_template_def.py b/magnum/drivers/heat/swarm_fedora_template_def.py index d35d365cb1..bad79fed4b 100644 --- a/magnum/drivers/heat/swarm_fedora_template_def.py +++ b/magnum/drivers/heat/swarm_fedora_template_def.py @@ -78,43 +78,53 @@ class SwarmFedoraTemplateDefinition(template_def.BaseTemplateDefinition): self.add_output('discovery_url', cluster_attr='discovery_url') - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): super(SwarmFedoraTemplateDefinition, - self).add_nodegroup_params(cluster) - master_ng = cluster.default_ng_master - worker_ng = cluster.default_ng_worker - self.add_parameter('number_of_nodes', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('node_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('master_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=master_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) + self).add_nodegroup_params(cluster, nodegroups=nodegroups) + nodegroups = nodegroups or [cluster.default_ng_master, + cluster.default_ng_worker] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter( + 'master_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + else: + self.add_parameter( + 'number_of_nodes', + nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'node_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] - self.add_output('swarm_masters', - nodegroup_attr='node_addresses', - nodegroup_uuid=master_ng.uuid, - mapping_type=template_def.NodeGroupOutputMapping) - self.add_output('swarm_nodes', - nodegroup_attr='node_addresses', - nodegroup_uuid=worker_ng.uuid, - mapping_type=template_def.NodeGroupOutputMapping) - self.add_output('number_of_nodes', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - is_stack_param=True, - mapping_type=template_def.NodeGroupOutputMapping) + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output( + 'swarm_masters', nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=template_def.NodeGroupOutputMapping) + else: + self.add_output( + 'swarm_nodes', nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=template_def.NodeGroupOutputMapping) + self.add_output( + 'number_of_nodes', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, is_stack_param=True, + mapping_type=template_def.NodeGroupOutputMapping) super(SwarmFedoraTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_params(self, context, cluster_template, cluster, **kwargs): extra_params = kwargs.pop('extra_params', {}) diff --git a/magnum/drivers/heat/swarm_mode_template_def.py b/magnum/drivers/heat/swarm_mode_template_def.py index 2b1c024752..a38794cb59 100644 --- a/magnum/drivers/heat/swarm_mode_template_def.py +++ b/magnum/drivers/heat/swarm_mode_template_def.py @@ -141,43 +141,52 @@ class SwarmModeTemplateDefinition(template_def.BaseTemplateDefinition): extra_params=extra_params, **kwargs) - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): super(SwarmModeTemplateDefinition, - self).add_nodegroup_params(cluster) - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - self.add_parameter('number_of_nodes', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('node_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('master_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=master_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) + self).add_nodegroup_params(cluster, nodegroups=nodegroups) + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter( + 'master_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + else: + self.add_parameter( + 'number_of_nodes', + nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'node_flavor', + nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - - self.add_output('swarm_masters', - nodegroup_attr='node_addresses', - nodegroup_uuid=master_ng.uuid, - mapping_type=MasterAddressOutputMapping) - self.add_output('swarm_nodes', - nodegroup_attr='node_addresses', - nodegroup_uuid=worker_ng.uuid, - mapping_type=NodeAddressOutputMapping) - self.add_output('number_of_nodes', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - is_stack_param=True, - mapping_type=template_def.NodeGroupOutputMapping) + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output('swarm_masters', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=MasterAddressOutputMapping) + else: + self.add_output('swarm_nodes', + nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=NodeAddressOutputMapping) + self.add_output( + 'number_of_nodes', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, is_stack_param=True, + mapping_type=template_def.NodeGroupOutputMapping) super(SwarmModeTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_env_files(self, cluster_template, cluster): env_files = [] diff --git a/magnum/drivers/heat/template_def.py b/magnum/drivers/heat/template_def.py index eac71e7712..0fa1d492cb 100755 --- a/magnum/drivers/heat/template_def.py +++ b/magnum/drivers/heat/template_def.py @@ -187,6 +187,7 @@ class TemplateDefinition(object): def __init__(self): self.param_mappings = list() self.output_mappings = list() + self.nodegroup_output_mappings = list() def add_parameter(self, *args, **kwargs): param_class = kwargs.pop('param_class', ParameterMapping) @@ -196,7 +197,10 @@ class TemplateDefinition(object): def add_output(self, *args, **kwargs): mapping_type = kwargs.pop('mapping_type', OutputMapping) output = mapping_type(*args, **kwargs) - self.output_mappings.append(output) + if kwargs.get('cluster_attr', None): + self.output_mappings.append(output) + else: + self.nodegroup_output_mappings.append(output) def get_output(self, *args, **kwargs): for output in self.output_mappings: @@ -295,12 +299,15 @@ class TemplateDefinition(object): def resolve_ambiguous_values(self, context, heat_param, heat_value, value): return str(value) - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): pass - def update_outputs(self, stack, cluster_template, cluster): + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): for output in self.output_mappings: output.set_output(stack, cluster_template, cluster) + for output in self.nodegroup_output_mappings: + output.set_output(stack, cluster_template, cluster) @abc.abstractproperty def driver_module_path(self): @@ -350,8 +357,9 @@ class BaseTemplateDefinition(TemplateDefinition): def get_params(self, context, cluster_template, cluster, **kwargs): osc = self.get_osc(context) + nodegroups = kwargs.pop('nodegroups', None) # Add all the params from the cluster's nodegroups - self.add_nodegroup_params(cluster) + self.add_nodegroup_params(cluster, nodegroups=nodegroups) extra_params = kwargs.pop('extra_params', {}) extra_params['trustee_domain_id'] = osc.keystone().trustee_domain_id @@ -394,25 +402,36 @@ class BaseTemplateDefinition(TemplateDefinition): return super(BaseTemplateDefinition, self).resolve_ambiguous_values( context, heat_param, heat_value, value) - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): # Assuming that all the drivers that will not override # this method do not support more than two nodegroups. # Meaning that we have one master and one worker. - master_ng = cluster.default_ng_master - self.add_parameter('number_of_masters', - nodegroup_attr='node_count', - nodegroup_uuid=master_ng.uuid, - param_class=NodeGroupParameterMapping) + nodegroups = nodegroups or [cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter('number_of_masters', + nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=NodeGroupParameterMapping) + self.add_parameter('role', + nodegroup_attr='role', + nodegroup_uuid=nodegroup.uuid, + param_class=NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): master_ng = cluster.default_ng_master - self.add_output('number_of_masters', - nodegroup_attr='node_count', - nodegroup_uuid=master_ng.uuid, - is_stack_param=True, - mapping_type=NodeGroupOutputMapping) + nodegroups = nodegroups or [cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output('number_of_masters', + nodegroup_attr='node_count', + nodegroup_uuid=master_ng.uuid, + is_stack_param=True, + mapping_type=NodeGroupOutputMapping) super(BaseTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def validate_discovery_url(self, discovery_url, expect_size): url = str(discovery_url) diff --git a/magnum/drivers/mesos_ubuntu_v1/template_def.py b/magnum/drivers/mesos_ubuntu_v1/template_def.py index 4679d68a50..8d0f1ece57 100644 --- a/magnum/drivers/mesos_ubuntu_v1/template_def.py +++ b/magnum/drivers/mesos_ubuntu_v1/template_def.py @@ -43,42 +43,49 @@ class UbuntuMesosTemplateDefinition(template_def.BaseTemplateDefinition): self.add_output('mesos_slaves_private', cluster_attr=None) - def add_nodegroup_params(self, cluster): + def add_nodegroup_params(self, cluster, nodegroups=None): super(UbuntuMesosTemplateDefinition, - self).add_nodegroup_params(cluster) - master_ng = cluster.default_ng_master - worker_ng = cluster.default_ng_worker - self.add_parameter('number_of_slaves', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('slave_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=worker_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) - self.add_parameter('master_flavor', - nodegroup_attr='flavor_id', - nodegroup_uuid=master_ng.uuid, - param_class=template_def.NodeGroupParameterMapping) + self).add_nodegroup_params(cluster, nodegroups=nodegroups) + nodegroups = nodegroups or [cluster.default_ng_master, + cluster.default_ng_worker] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_parameter( + 'master_flavor', nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + else: + self.add_parameter( + 'number_of_slaves', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) + self.add_parameter( + 'slave_flavor', nodegroup_attr='flavor_id', + nodegroup_uuid=nodegroup.uuid, + param_class=template_def.NodeGroupParameterMapping) - def update_outputs(self, stack, cluster_template, cluster): - worker_ng = cluster.default_ng_worker - master_ng = cluster.default_ng_master - self.add_output('mesos_master', - nodegroup_attr='node_addresses', - nodegroup_uuid=master_ng.uuid, - mapping_type=template_def.NodeGroupOutputMapping) - self.add_output('mesos_slaves', - nodegroup_attr='node_addresses', - nodegroup_uuid=worker_ng.uuid, - mapping_type=template_def.NodeGroupOutputMapping) - self.add_output('number_of_slaves', - nodegroup_attr='node_count', - nodegroup_uuid=worker_ng.uuid, - is_stack_param=True, - mapping_type=template_def.NodeGroupOutputMapping) + def update_outputs(self, stack, cluster_template, cluster, + nodegroups=None): + nodegroups = nodegroups or [cluster.default_ng_worker, + cluster.default_ng_master] + for nodegroup in nodegroups: + if nodegroup.role == 'master': + self.add_output( + 'mesos_master', nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=template_def.NodeGroupOutputMapping) + else: + self.add_output( + 'mesos_slaves', nodegroup_attr='node_addresses', + nodegroup_uuid=nodegroup.uuid, + mapping_type=template_def.NodeGroupOutputMapping) + self.add_output( + 'number_of_slaves', nodegroup_attr='node_count', + nodegroup_uuid=nodegroup.uuid, is_stack_param=True, + mapping_type=template_def.NodeGroupOutputMapping) super(UbuntuMesosTemplateDefinition, - self).update_outputs(stack, cluster_template, cluster) + self).update_outputs(stack, cluster_template, cluster, + nodegroups=nodegroups) def get_params(self, context, cluster_template, cluster, **kwargs): extra_params = kwargs.pop('extra_params', {})