def create(self, plugin, context, vnf, auth_attr): LOG.debug('vnf %s', vnf) region_name = vnf.get('placement_attr', {}).get('region_name', None) heatclient = hc.HeatClient(auth_attr, region_name) tth = translate_template.TOSCAToHOT(vnf, heatclient) tth.generate_hot() stack = self._create_stack(heatclient, tth.vnf, tth.fields) return stack['stack']['id']
def create(self, plugin, context, vnf, auth_attr, base_hot_dict=None, vnf_package_path=None, inst_req_info=None, grant_info=None): LOG.debug('vnf %s', vnf) region_name = vnf.get('placement_attr', {}).get('region_name', None) heatclient = hc.HeatClient(auth_attr, region_name) additional_param = None if inst_req_info is not None: additional_param = inst_req_info.additional_params user_data_path = None user_data_class = None if additional_param is not None: LOG.debug('additional_param: %s', additional_param) user_data_path = additional_param.get('lcm-operation-user-data') user_data_class = additional_param.get( 'lcm-operation-user-data-class') LOG.debug('UserData path: %s', user_data_path) LOG.debug('UserData class: %s', user_data_class) if user_data_path is not None and user_data_class is not None: LOG.info('Execute user data and create heat-stack.') if base_hot_dict is None: error_reason = _("failed to get Base HOT.") raise vnfm.LCMUserDataFailed(reason=error_reason) vnfd_str = vnf['vnfd']['attributes']['vnfd'] vnfd_dict = yaml.safe_load(vnfd_str) LOG.debug('VNFD: %s', vnfd_dict) LOG.debug('VNF package path: %s', vnf_package_path) sys.path.append(vnf_package_path) user_data_module = os.path.splitext( user_data_path.lstrip('./'))[0].replace('/', '.') LOG.debug('UserData module: %s', user_data_module) LOG.debug('Append sys.path: %s', sys.path) try: module = importlib.import_module(user_data_module) LOG.debug('Append sys.modules: %s', sys.modules) except Exception: self._delete_user_data_module(user_data_module) error_reason = _( "failed to get UserData path based on " "lcm-operation-user-data from additionalParams.") raise vnfm.LCMUserDataFailed(reason=error_reason) finally: sys.path.remove(vnf_package_path) LOG.debug('Remove sys.path: %s', sys.path) try: klass = getattr(module, user_data_class) except Exception: self._delete_user_data_module(user_data_module) error_reason = _( "failed to get UserData class based on " "lcm-operation-user-data-class from additionalParams.") raise vnfm.LCMUserDataFailed(reason=error_reason) # Set the timeout and execute the UserData script. hot_param_dict = None with eventlet.timeout.Timeout(USER_DATA_TIMEOUT, False): try: hot_param_dict = klass.instantiate(base_hot_dict, vnfd_dict, inst_req_info, grant_info) except Exception: raise finally: self._delete_user_data_module(user_data_module) if hot_param_dict is not None: LOG.info('HOT input parameter: %s', hot_param_dict) else: error_reason = _( "fails due to timeout[sec]: %s") % USER_DATA_TIMEOUT raise vnfm.LCMUserDataFailed(reason=error_reason) if not isinstance(hot_param_dict, dict): error_reason = _("return value as HOT parameter from UserData " "is not in dict format.") raise vnfm.LCMUserDataFailed(reason=error_reason) # Create heat-stack with BaseHOT and parameters stack = self._create_stack_with_user_data(heatclient, vnf, base_hot_dict, hot_param_dict) elif user_data_path is None and user_data_class is None: LOG.info('Execute heat-translator and create heat-stack.') tth = translate_template.TOSCAToHOT(vnf, heatclient, inst_req_info, grant_info) tth.generate_hot() stack = self._create_stack(heatclient, tth.vnf, tth.fields) else: error_reason = _( "failed to get lcm-operation-user-data or " "lcm-operation-user-data-class from additionalParams.") raise vnfm.LCMUserDataFailed(reason=error_reason) return stack['stack']['id']