+ def _vnf_config_primitive(self, nsr_id, vnfr_id, primitive,
+ vnf_config=None, vnfd_descriptor=None):
+ '''
+ Pass vnf_config to avoid querying DTS each time
+ '''
+ self._log.debug("VNF config primitive {} for nsr {}, vnfr {}".
+ format(primitive.name, nsr_id, vnfr_id))
+
+ if vnf_config is None or vnfd_descriptor is None:
+ vnfr_msg = yield from self.get_vnfr(vnfr_id)
+ if vnfr_msg is None:
+ msg = "Unable to get VNFR {} through DTS".format(vnfr_id)
+ self._log.error(msg)
+ return 3, msg
+
+ vnf_config = vnfr_msg.vnf_configuration
+ vnfd_descriptor = vnfr_msg.vnfd
+ self._log.debug("VNF config= %s", vnf_config.as_dict())
+ self._log.debug("VNFD descriptor= %s", vnfd_descriptor.as_dict())
+
+ data = {}
+ script = None
+ found = False
+
+ configs = vnf_config.config_primitive
+ for config in configs:
+ if config.name == primitive.name:
+ found = True
+ self._log.debug("RiftCA: Found the config primitive %s",
+ config.name)
+
+ spt = config.user_defined_script
+ if spt is None:
+ self._log.error("RiftCA: VNFR {}, Did not find "
+ "script defined in config {}".
+ format(vnfr['name'], config.as_dict()))
+ return 1, "Did not find user defined script for " \
+ "config primitive {}".format(primitive.name)
+
+ spt = shlex.quote(spt.strip())
+ if spt[0] == '/':
+ script = spt
+ else:
+ script = os.path.join(self._rift_var_root_dir,
+ 'launchpad/packages/vnfd',
+ self._project.name,
+ vnfd_descriptor.id,
+ 'scripts',
+ spt)
+ self._log.debug("Rift config agent: Checking for script "
+ "in %s", script)
+ if not os.path.exists(script):
+ self._log.debug("Rift config agent: Did not find "
+ "script %s", script)
+ return 1, "Did not find user defined " \
+ "script {}".format(spt)
+
+ params = {}
+ for param in config.parameter:
+ val = None
+ for p in primitive.parameter:
+ if p.name == param.name:
+ val = p.value
+ break
+
+ if val is None:
+ val = param.default_value
+
+ if val is None:
+ # Check if mandatory parameter
+ if param.mandatory:
+ msg = "VNFR {}: Primitive {} called " \
+ "without mandatory parameter {}". \
+ format(vnfr.name, config.name,
+ param.name)
+ self._log.error(msg)
+ return 1, msg
+
+ if val:
+ val = self.convert_value(val, param.data_type)
+ params.update({param.name: val})
+
+ data['parameters'] = params
+ break
+
+ if not found:
+ msg = "Did not find the primitive {} in VNFR {}". \
+ format(primitive.name, vnfr.name)
+ self._log.error(msg)
+ return 1, msg
+
+ rc, script_err = yield from self.exec_script(script, data)
+ return rc, script_err
+
+ @asyncio.coroutine
+ def vnf_config_primitive(self, nsr_id, vnfr_id, primitive, output):