import requests
+from rift.mano.utils.project import DEFAULT_PROJECT
from rift.package import convert
from gi.repository import (
NsdYang,
class DescriptorOnboarder(object):
""" This class is responsible for onboarding descriptors using Restconf"""
DESC_ENDPOINT_MAP = {
- NsdYang.YangData_Nsd_NsdCatalog_Nsd: "nsd-catalog/nsd",
- RwNsdYang.YangData_Nsd_NsdCatalog_Nsd: "nsd-catalog/nsd",
- VnfdYang.YangData_Vnfd_VnfdCatalog_Vnfd: "vnfd-catalog/vnfd",
- RwVnfdYang.YangData_Vnfd_VnfdCatalog_Vnfd: "vnfd-catalog/vnfd",
+ NsdYang.YangData_RwProject_Project_NsdCatalog_Nsd: "nsd-catalog/nsd",
+ RwNsdYang.YangData_RwProject_Project_NsdCatalog_Nsd: "nsd-catalog/nsd",
+ VnfdYang.YangData_RwProject_Project_VnfdCatalog_Vnfd: "vnfd-catalog/vnfd",
+ RwVnfdYang.YangData_RwProject_Project_VnfdCatalog_Vnfd: "vnfd-catalog/vnfd",
}
DESC_SERIALIZER_MAP = {
- NsdYang.YangData_Nsd_NsdCatalog_Nsd: convert.NsdSerializer(),
- RwNsdYang.YangData_Nsd_NsdCatalog_Nsd: convert.RwNsdSerializer(),
- VnfdYang.YangData_Vnfd_VnfdCatalog_Vnfd: convert.VnfdSerializer(),
- RwVnfdYang.YangData_Vnfd_VnfdCatalog_Vnfd: convert.RwVnfdSerializer(),
+ NsdYang.YangData_RwProject_Project_NsdCatalog_Nsd: convert.NsdSerializer(),
+ RwNsdYang.YangData_RwProject_Project_NsdCatalog_Nsd: convert.RwNsdSerializer(),
+ VnfdYang.YangData_RwProject_Project_VnfdCatalog_Vnfd: convert.VnfdSerializer(),
+ RwVnfdYang.YangData_RwProject_Project_VnfdCatalog_Vnfd: convert.RwVnfdSerializer(),
}
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):
return headers
- def _get_url(self, descriptor_msg):
+ def _get_url(self, descriptor_msg, project=None):
if type(descriptor_msg) not in DescriptorOnboarder.DESC_SERIALIZER_MAP:
raise TypeError("Invalid descriptor message type")
+ if project is None:
+ project = DEFAULT_PROJECT
+
endpoint = DescriptorOnboarder.DESC_ENDPOINT_MAP[type(descriptor_msg)]
+ ep = "project/{}/{}".format(project, endpoint)
url = "{}://{}:{}/api/config/{}".format(
"https" if self._use_ssl else "http",
self._host,
self.port,
- endpoint,
+ ep,
)
return url
- def _make_request_args(self, descriptor_msg, auth=None):
+ def _make_request_args(self, descriptor_msg, auth=None, project=None):
if type(descriptor_msg) not in DescriptorOnboarder.DESC_SERIALIZER_MAP:
raise TypeError("Invalid descriptor message type")
serializer = DescriptorOnboarder.DESC_SERIALIZER_MAP[type(descriptor_msg)]
json_data = serializer.to_json_string(descriptor_msg)
- url = self._get_url(descriptor_msg)
+ url = self._get_url(descriptor_msg, project=project)
request_args = dict(
url=url,
self._log.error(msg)
raise UpdateError(msg) from e
- def onboard(self, descriptor_msg, auth=None):
+ def onboard(self, descriptor_msg, auth=None, project=None):
""" Onboard the descriptor config
Arguments:
OnboardError - The descriptor config update failed
"""
- request_args = self._make_request_args(descriptor_msg, auth)
+ request_args = self._make_request_args(descriptor_msg, auth, project)
try:
response = requests.post(**request_args)
response.raise_for_status()
except requests.exceptions.ConnectionError as e:
msg = "Could not connect to restconf endpoint: %s" % str(e)
self._log.error(msg)
+ self._log.exception(msg)
raise OnboardError(msg) from e
except requests.exceptions.HTTPError as e:
msg = "POST request to %s error: %s" % (request_args["url"], response.text)
self._log.error(msg)
+ self._log.exception(msg)
raise OnboardError(msg) from e
except requests.exceptions.Timeout as e:
msg = "Timed out connecting to restconf endpoint: %s", str(e)
self._log.error(msg)
+ self._log.exception(msg)
raise OnboardError(msg) from e