From c6af29a4f03bc206eba6670aca3f3ccb63d70bd6 Mon Sep 17 00:00:00 2001 From: Vishwanath Jayaraman Date: Mon, 28 Sep 2015 23:45:12 -0500 Subject: [PATCH] IP Address parameterization support This commit adds code to support IP Address values as parameterized input for VDUs in a VNFD template. Change-Id: I4e49dda5ab4b8901c88aaac83d567242a3c4e080 Closes-bug: #1490633 --- tacker/extensions/vnfm.py | 4 ++ tacker/vm/drivers/heat/heat.py | 118 +++++++++++++++++++++------------ 2 files changed, 80 insertions(+), 42 deletions(-) diff --git a/tacker/extensions/vnfm.py b/tacker/extensions/vnfm.py index 204771d45..a2e25b2c7 100644 --- a/tacker/extensions/vnfm.py +++ b/tacker/extensions/vnfm.py @@ -110,6 +110,10 @@ class UserDataFormatNotFound(exceptions.NotFound): message = _("user_data and/or user_data_format not provided") +class IPAddrInvalidInput(exceptions.InvalidInput): + message = _("IP Address input values should be in a list format") + + def _validate_service_type_list(data, valid_values=None): if not isinstance(data, list): msg = _("invalid data format for service list: '%s'") % data diff --git a/tacker/vm/drivers/heat/heat.py b/tacker/vm/drivers/heat/heat.py index aa70abf57..cdc059c84 100644 --- a/tacker/vm/drivers/heat/heat.py +++ b/tacker/vm/drivers/heat/heat.py @@ -129,6 +129,78 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver): else: self._update_params(value, paramvalues, True) + @log.log + def _process_parameterized_input(self, dev_attrs, vnfd_dict): + param_vattrs_yaml = dev_attrs.pop('param_values', None) + if param_vattrs_yaml: + try: + param_vattrs_dict = yaml.load(param_vattrs_yaml) + LOG.debug('param_vattrs_yaml', param_vattrs_dict) + except Exception as e: + LOG.debug("Not Well Formed: %s", str(e)) + raise vnfm.ParamYAMLNotWellFormed( + error_msg_details=str(e)) + else: + self._update_params(vnfd_dict, param_vattrs_dict) + else: + raise vnfm.ParamYAMLInputMissing() + + @log.log + def _process_vdu_network_interfaces(self, vdu_id, vdu_dict, properties, + template_dict): + def make_port_dict(): + port_dict = { + 'type': 'OS::Neutron::Port', + 'properties': { + 'port_security_enabled': False + } + } + port_dict['properties'].setdefault('fixed_ips', []) + return port_dict + + def make_mgmt_outputs_dict(port): + mgmt_ip = 'mgmt_ip-%s' % vdu_id + outputs_dict[mgmt_ip] = { + 'description': 'management ip address', + 'value': { + 'get_attr': [port, 'fixed_ips', + 0, 'ip_address'] + } + } + + def handle_port_creation(network_param, ip_list=[], + mgmt_port=False): + port = '%s-%s-port' % (vdu_id, network_param['network']) + port_dict = make_port_dict() + if mgmt_port: + make_mgmt_outputs_dict(port) + for ip in ip_list: + port_dict['properties']['fixed_ips'].append({"ip_address": ip}) + port_dict['properties'].update(network_param) + template_dict['resources'][port] = port_dict + return port + + networks_list = [] + outputs_dict = {} + template_dict['outputs'] = outputs_dict + properties['networks'] = networks_list + for network_param in vdu_dict[ + 'network_interfaces'].values(): + port = None + if 'addresses' in network_param: + ip_list = network_param.pop('addresses', []) + if not isinstance(ip_list, list): + raise vnfm.IPAddrInvalidInput() + mgmt_flag = network_param.pop('management', False) + port = handle_port_creation(network_param, ip_list, mgmt_flag) + if network_param.pop('management', False): + port = handle_port_creation(network_param, [], True) + if port is not None: + network_param = { + 'port': {'get_resource': port} + } + networks_list.append(network_param) + @log.log def create(self, plugin, context, device): LOG.debug(_('device %s'), device) @@ -165,19 +237,7 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver): LOG.debug('vnfd_dict %s', vnfd_dict) if 'get_input' in vnfd_yaml: - param_vattrs_yaml = dev_attrs.pop('param_values', None) - if param_vattrs_yaml: - try: - param_vattrs_dict = yaml.load(param_vattrs_yaml) - LOG.debug('param_vattrs_yaml', param_vattrs_dict) - except Exception as e: - LOG.debug("Not Well Formed: %s", str(e)) - raise vnfm.ParamYAMLNotWellFormed( - error_msg_details=str(e)) - else: - self._update_params(vnfd_dict, param_vattrs_dict) - else: - raise vnfm.ParamYAMLInputMissing() + self._process_parameterized_input(dev_attrs, vnfd_dict) KEY_LIST = (('description', 'description'), ) @@ -197,35 +257,9 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver): for (key, vdu_key) in KEY_LIST: properties[key] = vdu_dict[vdu_key] if 'network_interfaces' in vdu_dict: - # properties['networks'] = ( - # vdu_dict['network_interfaces'].values()) - networks_list = [] - properties['networks'] = networks_list - for network_param in vdu_dict[ - 'network_interfaces'].values(): - if network_param.pop('management', False): - mgmt_port = 'mgmt_port-%s' % vdu_id - mgmt_port_dict = { - 'type': 'OS::Neutron::Port', - 'properties': { - 'port_security_enabled': False, - } - } - mgmt_port_dict['properties'].update(network_param) - template_dict['resources'][ - mgmt_port] = mgmt_port_dict - network_param = { - 'port': {'get_resource': mgmt_port} - } - mgmt_ip = 'mgmt_ip-%s' % vdu_id - outputs_dict[mgmt_ip] = { - 'description': 'management ip address', - 'value': { - 'get_attr': [mgmt_port, 'fixed_ips', - 0, 'ip_address'] - } - } - networks_list.append(network_param) + self._process_vdu_network_interfaces(vdu_id, vdu_dict, + properties, + template_dict) if 'user_data' in vdu_dict and 'user_data_format' in vdu_dict: properties['user_data_format'] = vdu_dict[ 'user_data_format']