[WIP] ng-7: Adapt parameter and output mappings

With this change parameter and output mappings can support multiple
stacks.

Change-Id: I45cf765977c7f5a92f28ae12c469b98435763163
This commit is contained in:
Theodoros Tsioutsias 2019-06-24 13:45:27 +02:00
parent 141e9b4d2d
commit 9875e145f4
7 changed files with 262 additions and 189 deletions

View File

@ -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', {})

View File

@ -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',

View File

@ -87,33 +87,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', {})

View File

@ -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', {})

View File

@ -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 = []

View File

@ -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)

View File

@ -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', {})