class OpenmanoCliAPI(object):
""" This class implements the necessary funtionality to interact with """
- CMD_TIMEOUT = 30
+ CMD_TIMEOUT = 120
def __init__(self, log, host, port, tenant):
self._log = log
to leafref, whose target is in a different module.
Once that is resovled this will switched to use
leafref";
- type string;
+ type leafref {
+ path "../../../constituent-vnfd" +
+ "[member-vnf-index = current()/../member-vnf-index-ref]" +
+ "/vnfd-id-ref";
+ }
}
leaf vnfd-connection-point-ref {
description
"Identifier for the VNFD.";
type leafref {
- path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:id";
+ path "../../../constituent-vnfd" +
+ "[member-vnf-index = current()/../member-vnf-index-ref]" +
+ "/vnfd-id-ref";
}
}
}
key vnf-source-ref;
leaf vnf-source-ref {
type leafref {
- path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:id";
+ path "../../constituent-vnfd/vnfd-id-ref";
}
}
leaf vnf-depends-on-ref {
description
"Reference to VNF that sorce VNF depends.";
type leafref {
- path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:id";
+ path "../../constituent-vnfd/vnfd-id-ref";
}
}
}
to leafref, whose target is in a different module.
Once that is resovled this will switched to use
leafref";
- type string;
+ type leafref {
+ path "../../../../constituent-vnfd" +
+ "[member-vnf-index = current()/../member-vnf-index-ref]" +
+ "/vnfd-id-ref";
+ }
}
leaf vnfd-connection-point-ref {
to leafref, whose target is in a different module.
Once that is resovled this will switched to use
leafref";
- type string;
+ type leafref {
+ path "/vnfd:vnfd-catalog/vnfd:vnfd" +
+ "[vnfd:id = current()/../vnfd-id-ref]/" +
+ "vnfd:connection-point/vnfd:name";
+ }
}
}
} //rsp
to leafref, whose target is in a different module.
Once that is resovled this will switched to use
leafref";
- type string;
+ type leafref {
+ path "../../../constituent-vnfd" +
+ "[member-vnf-index = current()/../member-vnf-index-ref]" +
+ "/vnfd-id-ref";
+ }
}
leaf vnfd-connection-point-ref {
to leafref, whose target is in a different module.
Once that is resovled this will switched to use
leafref";
- type string;
+ type leafref {
+ path "/vnfd:vnfd-catalog/vnfd:vnfd" +
+ "[vnfd:id = current()/../vnfd-id-ref]/" +
+ "vnfd:connection-point/vnfd:name";
+ }
}
list match-attributes {
list vnfd-monitoring-param {
description "A list of VNFD monitoring params";
- key "vnfd-id-ref vnfd-monitoring-param-ref";
+ key "member-vnf-index-ref vnfd-monitoring-param-ref";
leaf vnfd-id-ref {
description
Once that is resolved this will switched to use
leafref";
- type yang:uuid;
+ type leafref {
+ path "../../../constituent-vnfd" +
+ "[member-vnf-index = current()/../member-vnf-index-ref]" +
+ "/vnfd-id-ref";
+ }
}
leaf vnfd-monitoring-param-ref {
}
}
- leaf-list member-vnf-index-ref {
- description
- "Optional reference to member-vnf within constituent-vnfds";
- type uint64;
+ leaf member-vnf-index-ref {
+ description
+ "Mandatory reference to member-vnf within constituent-vnfds";
+ type leafref {
+ path "../../../constituent-vnfd/member-vnf-index";
+ }
}
}
}
"Use the default management interface on this VDU.";
leaf vdu-id {
type leafref {
- path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:vdu/vnfd:id";
+ path "../../vdu/id";
}
}
}
"Use the ip address associated with this connection point.";
leaf cp {
type leafref {
- path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:connection-point/vnfd:name";
+ path "../../connection-point/name";
}
}
}
def vnfr(self, vnfr_id):
raise NotImplementedError
+ @abc.abstractmethod
+ def get_Service_name(self):
+ """ Get the service name specific to the plugin """
+ pass
+
@abc.abstractmethod
@asyncio.coroutine
def apply_config(self, agent_nsr, agent_vnfr, config, rpc_ip):
.format(vnfr.name, method, rc))
return rc
- def is_vnfr_config_agent_managed(self, vnfr):
- if (not vnfr.has_field('netconf') and
- not vnfr.has_field('juju') and
- not vnfr.has_field('script')):
- return False
+ def get_vnfr_config_agent(self, vnfr):
+ # if (not vnfr.has_field('netconf') and
+ # not vnfr.has_field('juju') and
+ # not vnfr.has_field('script')):
+ # return False
for agent in self._plugin_instances.values():
try:
if agent.is_vnfr_managed(vnfr.id):
- return True
+ return agent
except Exception as e:
self._log.debug("Check if VNFR {} is config agent managed: {}".
format(vnfr.name, e))
+
+ def is_vnfr_config_agent_managed(self, vnfr):
+ if self.get_vnfr_config_agent(vnfr):
+ return True
return False
def _on_config_agent(self, config_agent):
if vnfr_name:
inp['vnfr_name'] = vnfr_name
- # TODO (pjoseph): Add config agents, we need to identify which all
- # config agents are required from this NS and provide only those
- inp['config-agent'] = {}
-
# Add parameters for initial config
inp['parameter'] = {}
for parameter in parameters:
format(nsr_obj.nsr_name, parameter, e))
+ # Add config agents specific to each VNFR
+ inp['config-agent'] = {}
+ for vnfr in nsr_obj.agent_nsr.vnfrs:
+ # Get the config agent for the VNFR
+ # If vnfr name is specified, add only CA specific to that
+ if (vnfr_name is None) or \
+ (vnfr_name == vnfr.name):
+ agent = self._config_agent_mgr.get_vnfr_config_agent(vnfr.vnfr_msg)
+ if agent:
+ if agent.agent_type != riftcm_config_plugin.DEFAULT_CAP_TYPE:
+ inp['config-agent'][vnfr.member_vnf_index] = agent.agent_data
+ inp['config-agent'][vnfr.member_vnf_index] \
+ ['service-name'] = agent.get_service_name(vnfr.id)
+
# Add vnfrs specific data
inp['vnfr'] = {}
for vnfr in nsr_obj.vnfrs:
inp['vnfr'][vnfr['member_vnf_index_ref']] = v
+
self._log.debug("Input data for {}: {}".
format((vnfr_name if vnfr_name else nsr_obj.nsr_name),
inp))
self._log.debug("Running the CMD: {}".format(cmd))
process = yield from asyncio.create_subprocess_shell(cmd,
- loop=self._loop)
- yield from process.wait()
-
- if process.returncode:
- msg = "NSR/VNFR {} initial config using {} failed with {}". \
+ loop=self._loop,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ stdout, stderr = yield from process.communicate()
+ rc = yield from process.wait()
+
+ if rc:
+ msg = "NSR/VNFR {} initial config using {} failed with {}: {}". \
format(vnfr_name if vnfr_name else nsr_obj.nsr_name,
- script, process.returncode)
+ script, rc, stderr)
self._log.error(msg)
raise InitialConfigError(msg)
- else:
- # os.remove(inp_file)
- pass
+
+ try:
+ os.remove(inp_file)
+ except Exception as e:
+ self._log.debug("Error removing input file {}: {}".
+ format(inp_file, e))
def get_script_file(self, script_name, d_name, d_id, d_type):
# Get the full path to the script
script_name)
self._log.debug("Checking for script at %s", script)
if not os.path.exists(script):
- self._log.debug("Did not find script %s", script)
+ self._log.warning("Did not find script %s", script)
script = os.path.join(os.environ['RIFT_INSTALL'],
'usr/bin',
script_name)
# to make sure it has execute permission
perm = os.stat(script).st_mode
if not (perm & stat.S_IXUSR):
- self._log.warn("NSR/VNFR {} initial config script {} " \
- "without execute permission: {}".
- format(d_name, script, perm))
+ self._log.warning("NSR/VNFR {} initial config script {} " \
+ "without execute permission: {}".
+ format(d_name, script, perm))
os.chmod(script, perm | stat.S_IXUSR)
return script
continue
script = self.get_script_file(conf.user_defined_script,
- vnfd.id,
vnfd.name,
+ vnfd.id,
'vnfd')
yield from self.process_initial_config(nsr_obj,
}
HEADERS = {"content-type": "application/vnd.yang.data+json"}
- TIMEOUT_SECS = 5
+ TIMEOUT_SECS = 60
AUTH = ('admin', 'admin')
def __init__(self, log, host="127.0.0.1", port=8008, use_ssl=False, ssl_cert=None, ssl_key=None):
self._account = None
self._ip = args.so_ip
+ self._api_server_ip = "localhost"
self._uport = args.upload_port
+ self._onboard_port = args.onboard_port
+ self._rport = args.restconf_port
+ self._user = args.restconf_user
+ self._password = args.restconf_password
+ self._onboard_url = "curl -k --user \"{user}:{passwd}\" \"https://{ip}:{port}/composer/upload?api_server=https://{api_server_ip}&upload_server=https://{ip}\"". \
+ format(ip=self._ip,
+ port=self._onboard_port,
+ user=self._user,
+ passwd=self._password,
+ api_server_ip=self._api_server_ip)
self._upload_url = "curl -k https://{ip}:{port}/api/upload". \
format(ip=self._ip,
port=self._uport)
- self._rport = args.restconf_port
- self._user = args.restconf_user
- self._password = args.restconf_password
self._headers = '-H "accept: application/json"' + \
' -H "content-type: application/json"'
self._conf_url = "curl -k {header} --user \"{user}:{passwd}\" https://{ip}:{port}/api/config". \
def _upload_package(self, pkg):
- upload_cmd = "{url} -F \"descriptor=@{pkg}\" ". \
- format(url=self._upload_url,
+ upload_cmd = "{url} -F \"package=@{pkg}\" ". \
+ format(url=self._onboard_url,
pkg=pkg)
self.log.debug("Upload pkg {} cmd: {}".format(pkg, upload_cmd))
parser.add_argument("-c", "--vim-account",
help="Cloud/VIM account to instantiate on")
+ parser.add_argument("-o", "--onboard-port", default=8443, type=int,
+ help="Onboarding port number - node port number, default 8443")
parser.add_argument("-p", "--upload-port", default=4567, type=int,
help="Upload port number, default 4567")
parser.add_argument("-P", "--restconf-port", default=8008, type=int,