X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=rwlaunchpad%2Fplugins%2Frwlaunchpadtasklet%2Fscripts%2Fonboard_pkg;h=d5bb4e50733443486fc8579a813cb0d624da93d7;hb=f49375710db1acf3cd74c8651d098b7a08e8d0b2;hp=b616ccf38e94c7f5b492af7dcc95d8aee887ce21;hpb=07da3570c19de04f015ade251dba8412daf2e280;p=osm%2FSO.git diff --git a/rwlaunchpad/plugins/rwlaunchpadtasklet/scripts/onboard_pkg b/rwlaunchpad/plugins/rwlaunchpadtasklet/scripts/onboard_pkg old mode 100644 new mode 100755 index b616ccf3..d5bb4e50 --- a/rwlaunchpad/plugins/rwlaunchpadtasklet/scripts/onboard_pkg +++ b/rwlaunchpad/plugins/rwlaunchpadtasklet/scripts/onboard_pkg @@ -72,6 +72,10 @@ class OnboardPkgRcConnError(OnboardPkgError): pass +class OnboardPkgDcError(OnboardPkgError): + pass + + class OnboardPkgAcctError(OnboardPkgError): pass @@ -96,6 +100,8 @@ class OnboardPackage: self._log = log self._args = args + self._project = args.project + self._pkgs = None self._service_name = None @@ -104,29 +110,49 @@ class OnboardPackage: 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". \ + + self._conf_url = "curl -k {header} --user \"{user}:{passwd}\" https://{ip}:{port}/api/config/project/{project}". \ + format(header=self._headers, + user=self._user, + passwd=self._password, + ip=self._ip, + port=self._rport, + project=self._project) + + self._oper_url = "curl -k {header} --user \"{user}:{passwd}\" https://{ip}:{port}/api/operational/project/{project}". \ format(header=self._headers, user=self._user, passwd=self._password, ip=self._ip, - port=self._rport) + port=self._rport, + project=self._project) @property def log(self): return self._log def validate_args(self): + args = self._args if args.upload_pkg is not None: self._pkgs = args.upload_pkg self.log.debug("Packages to upload: {}".format(self._pkgs)) @@ -147,8 +173,8 @@ class OnboardPackage: uuid.UUID(args.datacenter) self._dc = args.datacenter except ValueError as e: - raise OnboardPkgInvalidDescId("Invalid UUID for datacenter: {}". - format(args.datacenter)) + raise OnboardPkgInvalidDescId("Invalid UUID for datacenter {}: {}". + format(args.datacenter, e)) elif args.vim_account: self._account = args.vim_account @@ -163,8 +189,8 @@ class OnboardPackage: self._service_name, self._account)) - if (self._pkgs is None) and (self._nsd_id is None): - raise OnboardPkgInputError("Need to specify either upload-pkg or instantiate options") + if (self._pkgs is None) and (self._nsd_id is None) and (not args.list_nsds): + raise OnboardPkgInputError("Need to specify either upload-pkg or instantiate or list options") # Validate the port numbers are correct def valid_port(port): @@ -180,10 +206,12 @@ class OnboardPackage: def _exec_cmd(self, cmd): self.log.debug("Execute command: {}".format(cmd)) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True) (output, err) = proc.communicate() rc = proc.returncode - self.log.debug("Command exec status: {}, {}, {}".format(rc, output, err)) + self.log.debug("Command exec status: {}\nSTDOUT: {}\nSTDERR: {}". + format(rc, output, err)) if rc != 0: raise OnboardPkgCmdError("Command {} failed ({}): {}". format(cmd, rc, err)) @@ -224,8 +252,8 @@ class OnboardPackage: 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)) @@ -263,7 +291,31 @@ class OnboardPackage: self.log.debug("No NSD ID provided for instantiation") return - # TODO: Add check to see if datacenter is valid + # Check to see if datacenter is valid + if self._dc: + dc_url = "{url}/datacenters". format(url=self._oper_url) + output = self._exec_cmd(dc_url) + if (output is None) or (len(output) == 0): + # Account not found + raise OnboardPkgDcError("Datacenter {} provided is not valid". + format(self._dc)) + found = False + js = json.loads(output) + if "ro-accounts" in js["rw-launchpad:datacenters"]: + for ro in js["rw-launchpad:datacenters"]["ro-accounts"]: + if "datacenters" in ro: + for dc in ro["datacenters"]: + if dc["uuid"] == self._dc: + self.log.debug("Found datacenter {}".format(dc)) + found = True + break + if found: + break + + if found is False: + raise OnboardPkgDcError("Datacenter {} provided is not valid". + format(self._dc)) + # Check cloud account is valid, if provided if self._account: @@ -290,7 +342,12 @@ class OnboardPackage: format(self._nsd_id, js['error'])) - nsd = js['nsd:nsd'] + try: + nsd = js['nsd:nsd'] + except KeyError as e: + raise OnboardPkgNsdError("NSD ID {} provided is not valid". + format(self._nsd_id)) + self.log.debug("NSD to instantiate: {}".format(nsd)) # Generate a UUID for NS @@ -337,11 +394,41 @@ class OnboardPackage: self.log.info("Successfully initiated instantiation of NS as {} ({})". format(self._service_name, ns_id)) + def list_nsds(self): + if self._args.list_nsds: + self.log.debug("Check NSDS at {}:{}, with credentials {}:{}". + format(self._ip, self._rport, self._user, self._password)) + + rest_url = self._conf_url+"/nsd-catalog/nsd" + try: + output = self._exec_cmd(rest_url) + self.log.debug("Output of NSD list: {}". + format(output)) + if output: + js = json.loads(output) + if "error" in js: + raise OnboardPkgRcConnError("SO Restconf connect error: {}". + format(js["error"])) + else: + print("No NSDs found on SO") + return + + self.log.debug("NSD list: {}".format(js)) + print('List of NSDs on SO:\nName\tID') + for nsd in js['nsd:nsd']: + print('{}\t{}'.format(nsd['name'], nsd['id'])) + + except OnboardPkgCmdError as e: + self.log.error("SO restconf connect failed: {}".format(e)) + raise OnboardPkgRcConnError("SO Restconf connect error: {}". + format(e)) + def process(self): self.validate_args() self.validate_connectivity() self.upload_packages() self.instantiate() + self.list_nsds() if __name__ == "__main__": @@ -353,6 +440,9 @@ if __name__ == "__main__": help="Descriptor packages to upload. " + \ "If multiple descriptors are provided, they are uploaded in the same sequence.") + parser.add_argument("-l", "--list-nsds", action='store_true', + help="List available network service descriptors") + parser.add_argument("-i", "--instantiate", help="Instantiate a network service with the name") parser.add_argument("-d", "--nsd-id", @@ -362,10 +452,14 @@ if __name__ == "__main__": parser.add_argument("-c", "--vim-account", help="Cloud/VIM account to instantiate on") + parser.add_argument("--project", default='default', + help="Project to use, default 'default'") + 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=8888, type=int, - help="RESTconf port number, default 8888") + parser.add_argument("-P", "--restconf-port", default=8008, type=int, + help="RESTconf port number, default 8008") parser.add_argument("--restconf-user", default='admin', help="RESTconf user name, default admin") parser.add_argument("--restconf-password", default='admin',