From 2479a0739895b15a13a07aa8260598483249c621 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Tue, 17 Dec 2019 16:37:25 +0800 Subject: [PATCH 01/16] Refactor the notification process code Change-Id: Ie12527c77e5cacc55bdc3bc1505ec130e9d3c582 Issue-ID: MODELING-269 Signed-off-by: hongyuzhao --- catalog/packages/biz/notificationsutil.py | 228 +++++++++++++-------- catalog/packages/biz/ns_descriptor.py | 24 +-- catalog/packages/biz/pnf_descriptor.py | 15 +- catalog/packages/biz/vnf_package.py | 16 +- .../packages/serializers/vnf_pkg_notifications.py | 16 +- catalog/packages/tests/test_nsdm_subscription.py | 31 +-- .../packages/tests/test_vnf_pkg_subscription.py | 21 +- catalog/pub/database/models.py | 6 + .../swagger/etsicatalog.swagger.notification.json | 2 +- tox.ini | 2 +- 10 files changed, 203 insertions(+), 158 deletions(-) diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py index 8a653b4..8cdfd80 100644 --- a/catalog/packages/biz/notificationsutil.py +++ b/catalog/packages/biz/notificationsutil.py @@ -17,51 +17,50 @@ import uuid import requests from rest_framework import status from catalog.packages import const -from catalog.pub.database.models import VnfPkgSubscriptionModel, NsdmSubscriptionModel -from catalog.pub.database.models import VnfPackageModel +from catalog.pub.database.models import VnfPackageModel, VnfPkgSubscriptionModel, NsdmSubscriptionModel import catalog.pub.utils.timeutil from catalog.pub.utils.values import remove_none_key from catalog.pub.config import config as pub_config import traceback from django.db.models import Q +from catalog.packages.serializers.vnf_pkg_notifications import PkgChangeNotificationSerializer, \ + PkgOnboardingNotificationSerializer logger = logging.getLogger(__name__) class NotificationsUtil(object): - def __init__(self): + def __init__(self, notification_type): + self.notification_type = notification_type + self.notifyserializer = None + + def prepare_notification(self, **kwargs): pass - def send_notification(self, notification, filters, isvnfpkg): - subscriptions_filter = {v + "__contains": notification[k] for k, v in filters.items()} + def send_notification(self): + notification = self.prepare_notification() + + subscriptions_filter = {v + "__contains": notification[k] for k, v in self.filters.items()} subscriptions_filter = remove_none_key(subscriptions_filter) logger.debug('send_notification subscriptions_filter = %s' % subscriptions_filter) q1 = Q() q1.connector = 'OR' for k, v in subscriptions_filter.items(): q1.children.append((k, v)) - if isvnfpkg: - subscriptions = VnfPkgSubscriptionModel.objects.filter(q1) - subscription_root_uri = const.VNFPKG_SUBSCRIPTION_ROOT_URI - else: - subscriptions = NsdmSubscriptionModel.objects.filter(q1) - subscription_root_uri = const.NSDM_SUBSCRIPTION_ROOT_URI + subscriptions = self.SubscriptionModel.objects.filter(q1) if not subscriptions.exists(): logger.info("No subscriptions created for the filters %s" % notification) return logger.info("Start sending notifications") for sub in subscriptions: # set subscription id - if isvnfpkg: - notification["subscriptionId"] = sub.subscription_id - else: - notification["subscriptionId"] = sub.subscriptionid + notification["subscriptionId"] = sub.get_subscription_id() notification['_links']['subscription'] = { 'href': 'http://%s:%s/%s%s' % (pub_config.MSB_SERVICE_IP, pub_config.MSB_SERVICE_PORT, - subscription_root_uri, + self.subscription_root_uri, notification["subscriptionId"]) } callbackuri = sub.callback_uri @@ -70,6 +69,10 @@ class NotificationsUtil(object): if auth_info["authType"] == const.OAUTH2_CLIENT_CREDENTIALS: pass """ + if self.notifyserializer: + serialized_data = self.notifyserializer(data=notification) + if not serialized_data.is_valid(): + logger.error('Notification Data is invalid:%s.' % serialized_data.errors) self.post_notification(callbackuri, notification) def post_notification(self, callbackuri, notification): @@ -96,76 +99,135 @@ class NotificationsUtil(object): logger.error(traceback.format_exc()) -def prepare_vnfpkg_notification(vnf_pkg_id, notification_type, pkg_change_type, operational_state): - logger.info('Start to prepare notification') - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - vnfd_id = None - if vnf_pkg: - vnfd_id = vnf_pkg[0].vnfdId - notification_content = { - 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. - 'notificationType': notification_type, - # set 'subscriptionId' after filtering for subscribers - 'timeStamp': catalog.pub.utils.timeutil.now_time(), - 'vnfPkgId': vnf_pkg_id, - 'vnfdId': vnfd_id, - '_links': { - 'vnfPackage': { - 'href': 'http://%s:%s/%s/vnf_packages/%s' % (pub_config.MSB_SERVICE_IP, - pub_config.MSB_SERVICE_PORT, - const.PKG_URL_PREFIX, - vnf_pkg_id) +class PkgNotifications(NotificationsUtil): + def __init__(self, notification_type, vnf_pkg_id, change_type=None, operational_state=None): + super(PkgNotifications, self).__init__(notification_type) + self.filters = { + 'vnfdId': 'vnfd_id', + 'vnfPkgId': 'vnf_pkg_id' + } + self.vnf_pkg_id = vnf_pkg_id + self.change_type = change_type + self.operational_state = operational_state + self.SubscriptionModel = VnfPkgSubscriptionModel + self.subscription_root_uri = const.VNFPKG_SUBSCRIPTION_ROOT_URI + if self.notification_type == "VnfPackageChangeNotification": + self.notifyserializer = PkgChangeNotificationSerializer + else: + self.notifyserializer = PkgOnboardingNotificationSerializer + + def prepare_notification(self): + logger.info('Start to prepare Pkgnotification') + + vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=self.vnf_pkg_id) + vnfd_id = None + if vnf_pkg: + vnfd_id = vnf_pkg[0].vnfdId + notification_content = { + 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. + 'notificationType': self.notification_type, + # set 'subscriptionId' after filtering for subscribers + 'timeStamp': catalog.pub.utils.timeutil.now_time(), + 'vnfPkgId': self.vnf_pkg_id, + 'vnfdId': vnfd_id, + '_links': { + 'vnfPackage': { + 'href': 'http://%s:%s/%s/vnf_packages/%s' % (pub_config.MSB_SERVICE_IP, + pub_config.MSB_SERVICE_PORT, + const.PKG_URL_PREFIX, + self.vnf_pkg_id) + } } } - } - - if notification_type == "VnfPackageChangeNotification": - notification_content['changeType'] = pkg_change_type - notification_content['operationalState'] = operational_state - - return notification_content - - -def prepare_nsd_notification(nsd_info_id, nsd_id, notification_type, failure_details=None, operational_state=None): - logger.info('Start to prepare notification') - notification_content = { - 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. - 'notificationType': notification_type, - # set 'subscriptionId' after filtering for subscribers - 'timeStamp': catalog.pub.utils.timeutil.now_time(), - 'nsdInfoId': nsd_info_id, - 'nsdId': nsd_id, - 'onboardingFailureDetails': failure_details, - 'nsdOperationalState': operational_state, - '_links': { - 'nsdInfo': { - 'href': 'http://%s:%s/%s/ns_descriptors/%s' % (pub_config.MSB_SERVICE_IP, - pub_config.MSB_SERVICE_PORT, - const.NSD_URL_PREFIX, - nsd_info_id) + + if self.notification_type == "VnfPackageChangeNotification": + notification_content['changeType'] = self.change_type + notification_content['operationalState'] = self.operational_state + + return notification_content + + +class NsdNotifications(NotificationsUtil): + def __init__(self, notification_type, nsd_info_id, nsd_id, failure_details=None, operational_state=None): + super(NsdNotifications, self).__init__(notification_type) + self.filters = { + 'nsdInfoId': 'nsdInfoId', + 'nsdId': 'nsdId', + } + self.SubscriptionModel = NsdmSubscriptionModel + self.subscription_root_uri = const.NSDM_SUBSCRIPTION_ROOT_URI + self.nsd_info_id = nsd_info_id + self.nsd_id = nsd_id + self.failure_details = failure_details + self.operational_state = operational_state + # todo: + # if self.notification_type == "VnfPackageChangeNotification": + # self.notifyserializer = PkgChangeNotificationSerializer + # else: + # self.notifyserializer = PkgOnboardingNotificationSerializer + + def prepare_notification(self): + logger.info('Start to prepare Nsdnotification') + + notification_content = { + 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. + 'notificationType': self.notification_type, + # set 'subscriptionId' after filtering for subscribers + 'timeStamp': catalog.pub.utils.timeutil.now_time(), + 'nsdInfoId': self.nsd_info_id, + 'nsdId': self.nsd_id, + '_links': { + 'nsdInfo': { + 'href': 'http://%s:%s/%s/ns_descriptors/%s' % (pub_config.MSB_SERVICE_IP, + pub_config.MSB_SERVICE_PORT, + const.NSD_URL_PREFIX, + self.nsd_info_id) + } } } - } - return notification_content - - -def prepare_pnfd_notification(pnfd_info_id, pnfd_id, notification_type, failure_details=None): - logger.info('Start to prepare notification') - notification_content = { - 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. - 'notificationType': notification_type, - # set 'subscriptionId' after filtering for subscribers - 'timeStamp': catalog.pub.utils.timeutil.now_time(), - 'pnfdInfoIds': pnfd_info_id, - 'pnfdId': pnfd_id, - 'onboardingFailureDetails': failure_details, - '_links': { - 'pnfdInfo': { - 'href': 'http://%s:%s/%s/pnf_descriptors/%s' % (pub_config.MSB_SERVICE_IP, - pub_config.MSB_SERVICE_PORT, - const.NSD_URL_PREFIX, - pnfd_info_id) + if self.notification_type == "NsdOnboardingFailureNotification": + notification_content['onboardingFailureDetails'] = self.failure_details + if self.notification_type == "NsdChangeNotification": + notification_content['nsdOperationalState'] = self.operational_state + return notification_content + + +class PnfNotifications(NotificationsUtil): + def __init__(self, notification_type, pnfd_info_id, pnfd_id, failure_details=None): + super(PnfNotifications, self).__init__(notification_type) + self.filters = { + 'pnfdId': 'pnfdId', + 'pnfdInfoIds': 'pnfdInfoIds', + } + self.SubscriptionModel = NsdmSubscriptionModel + self.subscription_root_uri = const.NSDM_SUBSCRIPTION_ROOT_URI + self.pnfd_info_id = pnfd_info_id + self.pnfd_id = pnfd_id + self.failure_details = failure_details + # todo + # if self.notification_type == "VnfPackageChangeNotification": + # self.notifyserializer = PkgChangeNotificationSerializer + # else: + # self.notifyserializer = PkgOnboardingNotificationSerializer + + def prepare_notification(self, *args, **kwargs): + logger.info('Start to prepare Pnfnotification') + notification_content = { + 'id': str(uuid.uuid4()), # shall be the same if sent multiple times due to multiple subscriptions. + 'notificationType': self.notification_type, + # set 'subscriptionId' after filtering for subscribers + 'timeStamp': catalog.pub.utils.timeutil.now_time(), + 'pnfdInfoIds': self.pnfd_info_id, + 'pnfdId': self.pnfd_id, + '_links': { + 'pnfdInfo': { + 'href': 'http://%s:%s/%s/pnf_descriptors/%s' % (pub_config.MSB_SERVICE_IP, + pub_config.MSB_SERVICE_PORT, + const.NSD_URL_PREFIX, + self.pnfd_info_id) + } } } - } - return notification_content + if self.notification_type == "PnfdOnboardingFailureNotification": + notification_content['onboardingFailureDetails'] = self.failure_details + return notification_content diff --git a/catalog/packages/biz/ns_descriptor.py b/catalog/packages/biz/ns_descriptor.py index ca1b684..8b337dc 100644 --- a/catalog/packages/biz/ns_descriptor.py +++ b/catalog/packages/biz/ns_descriptor.py @@ -24,7 +24,7 @@ from catalog.pub.database.models import NSPackageModel, PnfPackageModel, VnfPack from catalog.pub.exceptions import CatalogException, ResourceNotFoundException from catalog.pub.utils import fileutil, toscaparser from catalog.pub.utils.values import ignore_case_get -from catalog.packages.biz.notificationsutil import prepare_nsd_notification, NotificationsUtil +from catalog.packages.biz.notificationsutil import NsdNotifications from catalog.packages import const logger = logging.getLogger(__name__) @@ -141,8 +141,10 @@ class NsDescriptor(object): raise CatalogException("nsd_id(%s) does not exist in metadata." % nsd_id) other_nspkg = NSPackageModel.objects.filter(nsdId=nsd_id) if other_nspkg and other_nspkg[0].nsPackageId != nsd_info_id: - logger.warn("NSD(%s,%s) already exists.", nsd_id, other_nspkg[0].nsPackageId) - send_notification(const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING_FAILURE, nsd_info_id, nsd_id) + failure_details = "NSD(%s,%s) already exists.", nsd_id, other_nspkg[0].nsPackageId + logger.warn(failure_details) + send_notification(const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING_FAILURE, nsd_info_id, nsd_id, + failure_details=failure_details) raise CatalogException("NSD(%s) already exists." % nsd_id) for vnf in nsd["vnfs"]: @@ -244,15 +246,7 @@ class NsDescriptor(object): def send_notification(type, nsd_info_id, nsd_id=None, failure_details=None, operational_state=None): - data = prepare_nsd_notification(nsd_info_id=nsd_info_id, - nsd_id=nsd_id, - notification_type=type, - failure_details=failure_details, - operational_state=operational_state) - filters = { - 'nsdInfoId': 'nsdInfoId', - 'nsdId': 'nsdId', - } - logger.debug('Notify request data = %s' % data) - logger.debug('Notify request filters = %s' % filters) - NotificationsUtil().send_notification(data, filters, False) + notify = NsdNotifications(type, nsd_info_id, nsd_id, + failure_details=failure_details, + operational_state=operational_state) + notify.send_notification() diff --git a/catalog/packages/biz/pnf_descriptor.py b/catalog/packages/biz/pnf_descriptor.py index 6f45729..dd6a236 100644 --- a/catalog/packages/biz/pnf_descriptor.py +++ b/catalog/packages/biz/pnf_descriptor.py @@ -25,7 +25,7 @@ from catalog.pub.database.models import NSPackageModel, PnfPackageModel from catalog.pub.exceptions import CatalogException, ResourceNotFoundException from catalog.pub.utils import fileutil, toscaparser from catalog.pub.utils.values import ignore_case_get -from catalog.packages.biz.notificationsutil import prepare_pnfd_notification, NotificationsUtil +from catalog.packages.biz.notificationsutil import PnfNotifications from catalog.packages import const logger = logging.getLogger(__name__) @@ -237,14 +237,5 @@ class PnfDescriptor(object): def send_notification(type, pnfd_info_id, pnfd_id=None, failure_details=None): - data = prepare_pnfd_notification(pnfd_info_id=pnfd_info_id, - pnfd_id=pnfd_id, - notification_type=type, - failure_details=failure_details) - filters = { - 'pnfdId': 'pnfdId', - 'pnfdInfoIds': 'pnfdInfoIds', - } - logger.debug('Notify request data = %s' % data) - logger.debug('Notify request filters = %s' % filters) - NotificationsUtil().send_notification(data, filters, False) + notify = PnfNotifications(type, pnfd_info_id, pnfd_id, failure_details=failure_details) + notify.send_notification() diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index be73595..daf2fb2 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -24,7 +24,7 @@ import zipfile from catalog.packages import const from catalog.packages.biz.common import parse_file_range, read, save -from catalog.packages.biz.notificationsutil import prepare_vnfpkg_notification, NotificationsUtil +from catalog.packages.biz.notificationsutil import PkgNotifications from catalog.pub.config.config import CATALOG_ROOT_PATH from catalog.pub.database.models import VnfPackageModel, NSPackageModel from catalog.pub.exceptions import CatalogException, ResourceNotFoundException @@ -293,14 +293,6 @@ def handle_upload_failed(vnf_pkg_id): def send_notification(pkg_id, type, pkg_change_type, operational_state=None): - data = prepare_vnfpkg_notification(vnf_pkg_id=pkg_id, - notification_type=type, - pkg_change_type=pkg_change_type, - operational_state=operational_state) - filters = { - 'vnfdId': 'vnfd_id', - 'vnfPkgId': 'vnf_pkg_id' - } - logger.debug('Notify request data = %s' % data) - logger.debug('Notify request filters = %s' % filters) - NotificationsUtil().send_notification(data, filters, True) + notify = PkgNotifications(type, pkg_id, change_type=pkg_change_type, + operational_state=operational_state) + notify.send_notification() diff --git a/catalog/packages/serializers/vnf_pkg_notifications.py b/catalog/packages/serializers/vnf_pkg_notifications.py index 2a73aa3..a0fd495 100644 --- a/catalog/packages/serializers/vnf_pkg_notifications.py +++ b/catalog/packages/serializers/vnf_pkg_notifications.py @@ -149,12 +149,18 @@ class PkgChangeNotificationSerializer(serializers.Serializer): required=True, allow_null=False ) - notificationTypes = serializers.ChoiceField( + notificationType = serializers.ChoiceField( help_text="Discriminator for the different notification types.", choices=["VnfPackageChangeNotification"], required=True, allow_null=False ) + timeStamp = serializers.DateTimeField( + help_text="Date-time of the generation of the notification.", + format="%Y-%m-%d %H:%M:%S", + required=True, + allow_null=False + ) subscriptionId = serializers.CharField( help_text="Identifier of the subscription that this notification relates to.", required=True, @@ -202,7 +208,7 @@ class PkgOnboardingNotificationSerializer(serializers.Serializer): required=True, allow_null=False ) - notificationTypes = serializers.ChoiceField( + notificationType = serializers.ChoiceField( help_text="Discriminator for the different notification types.", choices=["VnfPackageOnboardingNotification"], required=True, @@ -213,6 +219,12 @@ class PkgOnboardingNotificationSerializer(serializers.Serializer): required=True, allow_null=False ) + timeStamp = serializers.DateTimeField( + help_text="Date-time of the generation of the notification.", + format="%Y-%m-%d %H:%M:%S", + required=True, + allow_null=False + ) vnfPkgId = serializers.UUIDField( help_text="Identifier of the VNF package.", required=True, diff --git a/catalog/packages/tests/test_nsdm_subscription.py b/catalog/packages/tests/test_nsdm_subscription.py index 98ad9c1..d1e8770 100644 --- a/catalog/packages/tests/test_nsdm_subscription.py +++ b/catalog/packages/tests/test_nsdm_subscription.py @@ -22,7 +22,7 @@ from rest_framework import status from catalog.packages.biz.nsdm_subscription import NsdmSubscription from catalog.pub.database.models import NsdmSubscriptionModel -from catalog.packages.biz.notificationsutil import NotificationsUtil, prepare_nsd_notification, prepare_pnfd_notification +from catalog.packages.biz.notificationsutil import NsdNotifications, PnfNotifications from catalog.packages import const from catalog.pub.config import config as pub_config import catalog.pub.utils.timeutil @@ -607,8 +607,6 @@ class TestNsdmSubscription(TestCase): 'timeStamp': "nowtime()", 'nsdInfoId': "d0ea5ec3-0b98-438a-9bea-488230cff174", 'nsdId': "b632bddc-bccd-4180-bd8d-4e8a9578eff7", - 'onboardingFailureDetails': None, - 'nsdOperationalState': None, "subscriptionId": "1111", '_links': { 'subscription': { @@ -647,14 +645,11 @@ class NotificationTest(TestCase): def test_nsdpkg_notify(self, mock_nowtime, mock_uuid, mock_requests_post): mock_nowtime.return_value = "nowtime()" mock_uuid.return_value = "1111" - notification_content = prepare_nsd_notification("nsdinfoid1", "nsdid1", - const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING_FAILURE, - "NSD(nsdid1) already exists.", operational_state=None) - filters = { - 'nsdInfoId': 'nsdInfoId', - 'nsdId': 'nsdId', - } - NotificationsUtil().send_notification(notification_content, filters, False) + notify = NsdNotifications(const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING_FAILURE, + nsd_info_id="nsdinfoid1", + nsd_id="nsdid1", + failure_details="NSD(nsdid1) already exists.", operational_state=None) + notify.send_notification() expect_callbackuri = "http://127.0.0.1/self" expect_notification = { 'id': "1111", @@ -663,7 +658,6 @@ class NotificationTest(TestCase): 'nsdInfoId': "nsdinfoid1", 'nsdId': "nsdid1", 'onboardingFailureDetails': "NSD(nsdid1) already exists.", - 'nsdOperationalState': None, "subscriptionId": "1", '_links': { 'subscription': { @@ -687,13 +681,11 @@ class NotificationTest(TestCase): def test_pnfpkg_notify(self, mock_nowtime, mock_uuid, mock_requests_post): mock_nowtime.return_value = "nowtime()" mock_uuid.return_value = "1111" - notification_content = prepare_pnfd_notification("pnfdInfoIds1", 'pnfdId1', - const.NSD_NOTIFICATION_TYPE.PNFD_ONBOARDING) - filters = { - 'pnfdId': 'pnfdId', - 'pnfdInfoIds': 'pnfdInfoIds', - } - NotificationsUtil().send_notification(notification_content, filters, False) + notify = PnfNotifications(const.NSD_NOTIFICATION_TYPE.PNFD_ONBOARDING, + pnfd_info_id="pnfdInfoIds1", + pnfd_id='pnfdId1', + failure_details=None) + notify.send_notification() expect_callbackuri = "http://127.0.0.1/self" expect_notification = { 'id': "1111", @@ -701,7 +693,6 @@ class NotificationTest(TestCase): 'timeStamp': "nowtime()", 'pnfdInfoIds': "pnfdInfoIds1", 'pnfdId': "pnfdId1", - 'onboardingFailureDetails': None, "subscriptionId": "1", '_links': { 'subscription': { diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index f00e2ac..bc7ee49 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -22,7 +22,7 @@ from django.test import TestCase from catalog.pub.database.models import VnfPkgSubscriptionModel, VnfPackageModel from .const import vnf_subscription_data, vnfd_data -from catalog.packages.biz.notificationsutil import NotificationsUtil, prepare_vnfpkg_notification +from catalog.packages.biz.notificationsutil import PkgNotifications from catalog.packages import const from catalog.pub.config import config as pub_config import catalog.pub.utils.timeutil @@ -197,7 +197,7 @@ class TestNfPackageSubscription(TestCase): @mock.patch("uuid.uuid4") @mock.patch.object(catalog.pub.utils.timeutil, "now_time") def test_vnfpkg_subscript_notify(self, mock_nowtime, mock_uuid, mock_requests_post, mock_parse_vnfd, mock_requests_get): - mock_nowtime.return_value = "nowtime()" + mock_nowtime.return_value = "2019-02-16 14:41:16" uuid_subscriptid = "99442b18-a5c7-11e8-998c-bf1755941f13" uuid_vnfPackageId = "3fa85f64-5717-4562-b3fc-2c963f66afa6" uuid_vnfdid = "00342b18-a5c7-11e8-998c-bf1755941f12" @@ -226,7 +226,7 @@ class TestNfPackageSubscription(TestCase): expect_notification = { 'id': "1111", 'notificationType': const.PKG_NOTIFICATION_TYPE.ONBOARDING, - 'timeStamp': "nowtime()", + 'timeStamp': "2019-02-16 14:41:16", 'vnfPkgId': uuid_vnfPackageId, 'vnfdId': uuid_vnfdid, "subscriptionId": uuid_subscriptid, @@ -271,20 +271,17 @@ class NotificationTest(TestCase): vnfd_id="vnfdid1", vnf_pkg_id="vnfpkgid1" ).save() - mock_nowtime.return_value = "nowtime()" + mock_nowtime.return_value = "2019-12-16 14:41:16" mock_uuid.return_value = "1111" - notification_content = prepare_vnfpkg_notification("vnfpkgid1", const.PKG_NOTIFICATION_TYPE.CHANGE, - const.PKG_CHANGE_TYPE.OP_STATE_CHANGE, operational_state=None) - filters = { - 'vnfdId': 'vnfd_id', - 'vnfPkgId': 'vnf_pkg_id' - } - NotificationsUtil().send_notification(notification_content, filters, True) + notify = PkgNotifications(const.PKG_NOTIFICATION_TYPE.CHANGE, "vnfpkgid1", + const.PKG_CHANGE_TYPE.OP_STATE_CHANGE, operational_state=None) + + notify.send_notification() expect_callbackuri = "http://127.0.0.1/self" expect_notification = { 'id': "1111", 'notificationType': const.PKG_NOTIFICATION_TYPE.CHANGE, - 'timeStamp': "nowtime()", + 'timeStamp': "2019-12-16 14:41:16", 'vnfPkgId': "vnfpkgid1", 'vnfdId': "vnfdid1", 'changeType': const.PKG_CHANGE_TYPE.OP_STATE_CHANGE, diff --git a/catalog/pub/database/models.py b/catalog/pub/database/models.py index 9f0b498..950d667 100644 --- a/catalog/pub/database/models.py +++ b/catalog/pub/database/models.py @@ -198,6 +198,9 @@ class NsdmSubscriptionModel(models.Model): import json return json.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]])) + def get_subscription_id(self): + return self.subscriptionid + class VnfPkgSubscriptionModel(models.Model): subscription_id = models.CharField(max_length=255, primary_key=True, db_column='SUBSCRIPTION_ID') @@ -232,3 +235,6 @@ class VnfPkgSubscriptionModel(models.Model): } subscription_obj["filter"] = filter_obj return subscription_obj + + def get_subscription_id(self): + return self.subscription_id diff --git a/catalog/swagger/etsicatalog.swagger.notification.json b/catalog/swagger/etsicatalog.swagger.notification.json index b42d9dd..104ac97 100644 --- a/catalog/swagger/etsicatalog.swagger.notification.json +++ b/catalog/swagger/etsicatalog.swagger.notification.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgChangeNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgOnboardingNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}}, "definitions": {"NOTIFICATION_LINKSERIALIZER": {"title": "Vnfpackage", "description": "Link to the resource representing the VNF package to which the notified change applies.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "PkgmLinks": {"title": " links", "description": "Links to resources related to this resource.", "type": "object", "properties": {"vnfPackage": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}, "subscription": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}}}, "PkgChangeNotification": {"required": ["id", "notificationTypes", "subscriptionId", "vnfPkgId", "changeType", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationTypes": {"title": "Notificationtypes", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageChangeNotification"]}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "changeType": {"title": "Changetype", "description": "The type of change of the VNF package.", "type": "string", "enum": ["OP_STATE_CHANGE", "PKG_DELETE"]}, "operationalState": {"title": "Operationalstate", "description": "New operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "minLength": 1}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}, "PkgOnboardingNotification": {"required": ["id", "notificationTypes", "subscriptionId", "vnfPkgId", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationTypes": {"title": "Notificationtypes", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageOnboardingNotification"]}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "format": "uuid"}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgChangeNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgOnboardingNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}}, "definitions": {"NOTIFICATION_LINKSERIALIZER": {"title": "Vnfpackage", "description": "Link to the resource representing the VNF package to which the notified change applies.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "PkgmLinks": {"title": " links", "description": "Links to resources related to this resource.", "type": "object", "properties": {"vnfPackage": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}, "subscription": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}}}, "PkgChangeNotification": {"required": ["id", "notificationType", "timeStamp", "subscriptionId", "vnfPkgId", "changeType", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageChangeNotification"]}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "changeType": {"title": "Changetype", "description": "The type of change of the VNF package.", "type": "string", "enum": ["OP_STATE_CHANGE", "PKG_DELETE"]}, "operationalState": {"title": "Operationalstate", "description": "New operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "minLength": 1}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}, "PkgOnboardingNotification": {"required": ["id", "notificationType", "subscriptionId", "timeStamp", "vnfPkgId", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageOnboardingNotification"]}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "format": "uuid"}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}}} \ No newline at end of file diff --git a/tox.ini b/tox.ini index 3745940..f9b7824 100644 --- a/tox.ini +++ b/tox.ini @@ -22,5 +22,5 @@ commands = {[testenv]commands} [testenv:cov] -deps = coverage +deps = coverage==4.2 commands = coverage xml --omit="*test*,*__init__.py,*site-packages*" -- 2.16.6 From 7cec085b66fe866444c9d043cbaf958bc5029602 Mon Sep 17 00:00:00 2001 From: dyh Date: Mon, 20 Jan 2020 15:08:39 +0800 Subject: [PATCH 02/16] update document Issue-ID: MODELING-292 Change-Id: I3a6568d84fb6c04dd9bf0ee6bfe26f722ea463ed Signed-off-by: dyh --- docs/administration.rst | 15 + docs/architecture.rst | 12 + docs/consumedapis.rst | 48 + docs/humaninterfaces.rst | 9 + docs/images/architecture.png | Bin 0 -> 77365 bytes docs/index.rst | 14 +- docs/installation.rst | 69 + docs/introduction.rst | 8 +- docs/offeredapis.rst | 155 ++ docs/release-notes.rst | 6 +- docs/swagger/etsicatalog_API_v1.yaml | 2716 ++++++++++++++++++++++++++++++++++ 11 files changed, 3041 insertions(+), 11 deletions(-) create mode 100644 docs/administration.rst create mode 100644 docs/architecture.rst create mode 100644 docs/consumedapis.rst create mode 100644 docs/humaninterfaces.rst create mode 100644 docs/images/architecture.png create mode 100644 docs/installation.rst create mode 100644 docs/offeredapis.rst create mode 100644 docs/swagger/etsicatalog_API_v1.yaml diff --git a/docs/administration.rst b/docs/administration.rst new file mode 100644 index 0000000..2427834 --- /dev/null +++ b/docs/administration.rst @@ -0,0 +1,15 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============== +Administration +============== + +Administration Links +-------------------- + +Here are some links to our administration pages found in the ONAP Service websites + +- `Modeling Jira `_ +- `Modeling Jenkins `_ +- `Modeling Confluence Portal `_ diff --git a/docs/architecture.rst b/docs/architecture.rst new file mode 100644 index 0000000..cc9dd45 --- /dev/null +++ b/docs/architecture.rst @@ -0,0 +1,12 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============ +Architecture +============ +Etsicatalog is a web application based on python3 and Django framework. It is a standalone micro-service which provides: + +- Package Management Service +- Parser Service + +.. image:: images/architecture.png \ No newline at end of file diff --git a/docs/consumedapis.rst b/docs/consumedapis.rst new file mode 100644 index 0000000..2efd1d6 --- /dev/null +++ b/docs/consumedapis.rst @@ -0,0 +1,48 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============= +Consumed APIs +============= + +SDC +--- +Etsicatalog invokes SDC APIs to query/fetch package from SDC catalog. + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/sdc/v1/catalog/services/ + - GET + - Get service list + * - /api/sdc/v1/catalog/services/{{csarId}}/metadata + - GET + - Get a service metadata + * - /api/sdc/v1/catalog/resources + - GET + - Get resource list + * - /api/sdc/v1/catalog/resources/{{csarId}}/metadata + - GET + - Get a resource metadata + * - /api/sdc/v1/catalog/services/{{csarId}}/toscaModel + - GET + - Download a service package + +Micro Service Bus +----------------- +Etsicatalog invokes Micro Service Bus APIs to register service to MSB. + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/microservices/v1/services + - POST + - Register service to the Microservice Bus \ No newline at end of file diff --git a/docs/humaninterfaces.rst b/docs/humaninterfaces.rst new file mode 100644 index 0000000..2963870 --- /dev/null +++ b/docs/humaninterfaces.rst @@ -0,0 +1,9 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Human Interfaces +================ + +There is **No** Human Interface (pure Rest API project) + +Any "Rest Client" application may be used (Postman, ...) to interact with etsicatalog application. \ No newline at end of file diff --git a/docs/images/architecture.png b/docs/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcd9e433b89a43c8b559d5840a6ea199f7b6150 GIT binary patch literal 77365 zcmd42by$?$+Bd9(G>9ljBOxHA(lK;ME2VUIcMKsQARt}R0@9rWLpMlw3@IJMkV6mO zsQcdU{k?nd=Xsw$zTJ*E)Y!=vyTjJZv)Td-v|)$-a?Pxpxm$ z`QAMgc1#rHmF>Xq50D@ComFJS@0ATx>>$6OnTsik-Md#Ag>z$wj{J`0@J7@5-n~aI zzy9tonNfS(yLXo>D=DVtp|^h<68E?le1KEly0U)(Z{|JFx?X}wrtvw#+~IoC@>TXO*V5l)`ya0aX@N9)+5c>Tzm5HOd;O0Mb5DNr zzj2O#Rh~irf8`vXra!%RdiRfj_`8oY-fz6DvTT06}f&amck!N~TLav$T9 zHcw@PrHQd_aiomzvWZ!|dd90ir>mUoDLMl?`aF-<`}g!5eMhx z0Vr>i;xLYkr&Z!u%PwZT^jPW3!n(S?w(q+6%u0G_iB7G3`pH9N5{|#N!%B7N4G-wa*w`1ZR15$bzM-=(24$_sA$-gV962ELDll^wG|@8Zfo* zy1KblkpeH7Sqtq>yTix8-(S|<&!ua3KkM(8y+C|p=>)mh5#STx$NH+1J$?Gov$&?_ z)N7ESFLrEtnny^ef1)q+a+jF z6&@31VRJKO3xC_Wgl$@7iUm^cFVq*}5A=grSXip7s>-BbVu`pHg8|8wUS4Eo%tv#1 z^S>35Q)lhaw@pFu+H1gDmoA(};%ls-5fwExY=57XgTtH?eoO=gh^;2G#f^eE*)-d2 z24b;Wi16|8t#-alNjia>gQyt^dq!qwpL(;gFfn}&4{s#C1yq@|nG+8xbZihzzuNty zqe(YBeA4tl32FP}a%&SpsJ<5|C^wgZmp5r>R=%|2dqC0Ef#VXHP$s1f^T-#oP_ms| zJB}9bL*@bBvJ8Smjw1Tzq{u}oZ^nHnG(9a%XXT47&&YbqB-B4QcP+o6fgfo#A)yCL<^3eEk~5 z_1oz8c|uot(FxtlF;=wr4}yrF{RY;I=2%bGYWw~D-;vg$R_kn^91VlZupEH3q0d7d}17~3JFGUq0Etq7^$WNxX8*GVd95x|Lt995Ya@M1lim$@c6L@+ zSZLFur_!B(H~ht&dvcvo#r;v*hgl&$i6TZG^)9Ht*@GXk^)Gh`Gb5(*&{%AjFbo}SHA z@TY$#gyglmm6er)Lj`gae*Wat@-xwQrh#4Rc=1w4kwNv%Th+QjF{hc6%|kUN6{p)b zWtJ|$G?#t&$~Bg5gr1`v2OHba^75V2B)ds}-@t&iwKZ^O5?z;Wj&O{}s_{X{m*Mtj zIiSHA?y5KYa4T!;xY$^fQ^}Y~^|K_Y2bFACEAT#a9r(z~4SP3^)O+8Tcd$=dPRn|> zD6L}IG)vIjkSexEl^^p_O)G712)ScSjNf|UXxhhHmGTP8$hKY=1@h_`se23tK^}*0M zB^L-F**>6Nk}IP+&dg-S7Bb`7P_e;i*<2T3OfsACX7oj>>sAUc1`r5U^EEN2tL(W{%@3o63>SS#;IEkyXQAz*6ScGx z0}V2-GNLBw(W-5~U6B2RTV0SnFyjh@C0i;He7}qQK^N{o$9*Jrx~wwhq0a1lZ%iR$ z#BC#_v$f--(X2f!w3zUz=Dczd&s(zoy0_@TTmBs0!h)k;Nk#%t*G^I&v~>U|nIf{Z zC0#vumNXv|Y&_`6&5un(nMn0y;pZHUA7SX;nqXAPI8Ty3R{uni*9*2{xl}>vmm z*1viB&<=-*zB$<$I7Iq`PFuXx1?2w9O0derLfBQ-O|m9p(@q(Qpz25rVq@uqz9Q*9 z_0}=5@Q_`gI^p8H&BgLJcxb&HG&bV`G~kwRVCh>q>>#p|Zrd9=Q#fg8{yOfTKVCwU za^mpAKqF+U`gWshB($p$;KkSUp=q|iP;Ls61&LEGUxBkr+DRnh4&}4|LW8jd=&#AK zf58C*7@#!LD>yJAl_9qaH(>NV3)fa-DcDhOT7a_cr-`R@@58RynFOP^Gmm`OVSpH!|cra!Mdj#bz?Nj#j?MD35)o<+Fz77f9SexCOy4 ze0|gi5LslQVJ)pm)}dyP;fS?0!T!9m zsD}m-e;oZ>Cq$jj^zg>jfPauHAH9MtE#5B5mL}{COQ|6==dnkli|+F5Es_)DsoAY}GOj zwNqxMY;1OpNsVEUI4P9>mFBqIfymrh8i2%b%`CepP2$3GFIUT5IBf$4cSeN!xs!6( z8)A~FMnEg37f9dFvMT_w>$*tAa@)Nxs;akevxL96q+*#-XiZdQ!fLh~i&RWPcRc{9 zCwLnY0$3{{CsQO+Ne^=*Si?mi$6m)<=^9oqA=yfZ!Y)?;b!q51fs(0PHGLXGz)h!o z0ffjNZERl2eN(yu&x+fR(xPDnuChhJHU!@hmE}5D)?$!NEwED~uXEAbv4h!k&Gf}) zT~0Fm!kv^x0MZXMegRL@r5#6;iGkU-hCEtc_GnuyMKxqxzRRt`=!VZI@t>UApJis^UgEx`uCDnV z!jn&8dy?)!o{6Rvfu(S57#o5@RkEUJsOkp&P+0MP>-h?mE61UZWAgjLw;V$golg$8 zxqI-;C{tb&4Sf3+2x`#xL^WOlCZECT%3*NqG=AJ$Uy;l-c)R~c6h{6|`4tJl> zKKb;xeQBiDOP$@QR?r>yNlJMWmraUZWBZkn z3&A)pEq`bm((-kZ^srBW4DRBv{U4&X;hRl zn$HV-LCThscVcg}WXiV(_exo@PH`8}P@`SKlp00Z1}ytZUTS=TNHmKfeV)L~aq;Mz z0hyL}9`nH#V3Rrn^SQ7>*NpoMavIIC9p8)NW#1|-SAjU^kRp}I2VZ>;b2eVEhm_lI zc3}!DvvwQA79L%{9W{h0D+Sr6X-_};9X{_cB!!sJK<7p@18dc=A>n&0FBua^j|BYU z&iyJb4!_<7PZ&Ok97+SSG}msm17*CY122i8PPASR7pQjjD1-0l3s)ZuPeK!xUcbEA zx({+Scqnxw|2q-n3}3P_-*JRZ>up`PpQ5lP`T>;kS!UOFMHJ$Y=yOZBppQ8r&_XC%cn_EXrhx$jAN4{4kE5A~ExYBf6jAIY0 zzaF6$vaJFeX3+H*&6N7x>^42{&MNqp`x_E-@IQOJZEI*&NK(!Uio&q}8Yj1ykv$As zYFq|*W$p>00*9dyPnNlmqev_vU4V%9IFzZ3mpsRB-s#pp8oL=LIgKKF6S?OXcpyla zovM^&aR8?m-2GZX6tnJ{SM4(ePqM$k^V-E207P*b4}|ol#QI*2?Mk$$m*+=1ohv9$ znfK@jdfdX6g}q_GlUl}3A!jfjPJu;4t@d5`nhY3&o5oVoA*71*Y7ScoO;a@Kc#AmYAo+bb4To1YAkZ}vlQhEm7$VgB7atS@=`6z@CxN6tEuKtJ|YqaO## z64)WuQd9jx=$}4*C`}9Sb+je(4^*#dNN>7h-;qmDap`j+d(DFD0xa0bO*nun1>284 zW9&HCnh0;G6uC9HZLj>MeDR&b?!D8AYW{V5xF5Q`JJ(^{#M~g1RR3mRB(gX%q=e)+ z>n5=iUC2JXQU|oN3lW*~!34J3^rCd|d^F|%d3RK4FxHbR^($HC;6H3=UVILVl_ttR zwi`KL5^420E${SQfx3k*EQ#QIl>-Q$AAB=zf?PWeoVnASnOv~PK!98ClcLlFU6_B@ zCzEWw#{8iCf-_F9^Y>d*KX`B<4zw-+XaG@GFKwTMCu;KW9%$(X!l9J?^7VrmYU~rc ztmFm1a}vkrUTwdY`-Q;`sK+$9XPMjBOk|k39Xm=1XM4HfOyUef+6H-KjE!{K zH2BVHan2j;2id~s9PPbHSeU#fK{U;*1{$|>sThRNITCO@rnGC#xXEen^rJe~1=6Zf zd;@Z2f|0KJ@$h;_7xpVR<9PD}>S+$cuY`fPPCFO^DBl zX@Wq!p|)=}uEV?RTj6ky;bJub7umlSD_-_IYA_aLqYhc*@;m=_PBvvGMAn_mf6Toz zvaH?Y-bMZ8BJHDbyG-Zx2bi}xqMYu&^R-q!YyPw94pC5umYz5W!#R+hpSW}S$&KRj z?c7mdj@Zj5KHjv$sb512Yp%EMObo6@I(@B`K7}nTU5Y?!{itc9LdtSPU)Vnk1zuc% zL~boks0QRRKMYPXEV>uI12-$X0WLynUad9Y)7rscqhcZ6S%GScR9_z$l2k&ji^Cw- zdmO{mR5--F9NhnK+oRElBo)<5pn7=hYr710Z7G59FPJ@*HK&emY~2N2&e)zBS_q>qY77n=cjM@8V0#09$&A4 zHt&Si&&Q4`B6wMLpKv^0djjG~zn+M4gHht?;lwajkB353W3oq1szfs4mI5Z%3?b+s5OiK!M9@zZsQLa6Ql-)Pllz88Sfu<^&fmFeTF_4N z)`)|Df{7cFm&ZHsO4T${HC)cyn&Hj7=3JLBad&%rEPj_g zhfrI0EC{T*`g%;n*H!SLm=LWaFm?EL$2^H3GPr~=Y?SC9LHCmG;6B+d9O1?neTG6e zoGMIl&(40Pvz7YrzCCCt(H+=$(1aIhXm?G$xwu4-T80R^2pzS>N18dQSqVmsHE!x> z`8(5Kje1=-Yus9#U!KiM4xcbT-(`(VMyy3IGs=P7!%Lu)cpA1_wl=zT+gAsTFj3(Z zxSEkm=l=^!k&;aT+Cw_~6n{=cjEUIsdPOxJet*i*e0eq}0V3?dpvgrN}Jye zwB2O3*85x(V;E-k7Tqot6JYon%TQlfI4_<jBOB7}Zt`Jqq6rrh7Yil^kv8#1u--N5o8E*IYYuiOLP7 zDA`Ykp5Hyl!K#Yw+5Wu2Wuoy^ejmQ@u3!dv5O%RW!%se2DrH+1Qg++L-|DXbQf>j? zY-Q>$iO4CSitWIM?`8<a>p}V6R_`b&TZ>TCcjCo zJ*vG+}cl zDtdrd+pcVfIh|tTlu3W~+~5^*Z6{Y)P`1eak6MwtpI81>i{kA0kwcGiG@OhlE=7Fo zZx6)$9G0vj^PDNaTSQc9o}^DT8jxL-@FY*y#^t0dG`nAkWN8yzh{ujYZJUpiGAWi+ zp`*Ey&LGCQcjsu1pX(^F!7}@l^&mmmex-lptkpZ-dm*U0o@?!bCUfc()J{ABH`!!6 zpUa1DjxYqd>EuILi=S~OHKb?HD^}T#5h73A2jo-gn@vv?4vOmmUpvnH+awlZmu&7< zXcSam9@z+-_u5n6tv#H@6yAKwO_WCXiC-bDs~X|$_Us&T7#0eT7rjdt;lJ7Y1}ic? z(kRqzUf*@NO>drtA%0%9fPInzq!e^tT(biV+WT+gN59%Ki#==fb-liayHM!?X}W&^ zs>{Q%v2Ur~nAR3)Z1Us#ShKZyZ$5N=tD!2kEWM5{!jEq|URf1&hM6w+zMzQUiT-lR zgx!;d<^jLpjB)k+x5TS(HTV?eUU}lQ2sxV)vwJm`76u+B<$cQdfd)`$O0P)fHJv6G z-iKz9*}4F4La(f+ta6_Pz4}fhFooCe&H|hIUKlN84Pe`pw^pCQ_0K&6NaEwO7t)3d?G5Fn$48y2Da@6?W%w#2t z6TrByg@iwHl%3+C9>$y%cLJ}4rgig4*fVB=uF5XErOY!8jDES_uat+Z%kVqtOG!#v zb#!`p??i*wz~$w)8!{M9uF9Wd>YD>!f|%XSDNgU&i<%-&h*g-SopdN>Y+Ej;&!=Hj zhpN@EM}Lrmkpf%CPnch7k>fxjqVYAL&d2Mj6?gEia@qXJUS3-i96fbCI_b8^s;>O> zASxf>JOFJyaP`d$&p+3E1OjawXZoS(mz7B%UH8|)UV0V6Ddwfs=9^bvUGA1dIK4>qyiz^&}qfX}&%FqIPJhKU_%p-0yl0s0bGfFJB#U(5%>~u5$XQy31|^9oeNQ^*|;$EoHukR@$;H!!2)XzzC;fWC8ED z_1?V#{l~prh#-L-EED6l&4fvn^nNkHg?Bw~8*NdIo`-I@Q3Vq_Vs`|Ir$>W+whgz$ znun^5<#5fe$=s@PrH{c^470Q^Kn3p$O0x4=d*`;{g5;l(HM)7yIX*hm8o_1x{GQXo zE5SOKw};-~pNvKL565H*{d&mAU|X;i?(emgeD zd3SkvDRS`AH^c+;o&7HAfL$Mjypc5!83L=H?)r~d4unDo%Ho0fh?!}KJ!P2TeN(YU z;jJRdX%@*&pub+}> z+pSZ=d)fxqAmY1=%_WGw{`E;x(j6L5Y)t|`dL*rf;KOY-|5?TImW1icFC66r@Y!Y@%KHG!7=6*hT#@$WQH02BD^4Mpj0C4b zAq2OEk(4e9fe07muWXmL=k>*Cp(GVTV7OpkGCBMCL2g0a)Gnh@jYA0bNPkDPOxKDH zWDJPo+AJ7fv*Q+15-j;g$vK7!++WO)c8Vx^x=QT6wd<+hLLKg**l@LR9uO1H(aEd9 zvIIqM+b`y5o2*^FM!ld|*t%@Lzf8bT*e2FWaPH}ISiE(87(y?LVuH>uDlF320-Cwh zKU~%aEQ#EUqpl}PSYa^!UHE}N?U7iBTJ#`uv8vmscZ4kYayXZ87su$uXw+!x!^?5} zDV}f#;EU_sr)9NSq;rJ_$4li0u#p)-6P*ihOaP|gL)^CI3iLX8+Otol0wxwwZ3S6) zICnwMP;>6pjrwM3cdcR8jlRqKvMP;1E*Qzl&r-bv}VaGb+ti1k0&khWC*I*k$LKE)SFV0)xTM)M$mITi{Q{cUtTnwsyM5rwi% zn+=vke+m_G3uqEgA>VOsyMQSv0qIom)b~PtaMIH6$$Cu-+nQP!IrP5F^me{;C{4Kg7*2?gv7;Fyqa{@}0kC5v_=-DXxh29rF$X08LvhJ@2Yfb|s4%r)d@{fb>5L4!v(JHY6IXhLa&n%GV ziK;r3Tf4hPi*v+EN|ml@I3?k(0e+PVo1f*43?EfCiwZls(v4GQy{0qGV*Oa&b}|Ns zk2S=Mn9o-kpMdM%TVVx6?C9ByZ2aCSm3Zcr5kxZ>zfw&?wnvItd!WC%B^bYs_mSsA zx33e-#VK{kfx`0|8ANM4eRZ4--IEa#WPDujIu;_98Ws}fSHU0b*{1}bgUa0Np9e!% zw$mXJ<3MN2*Bmkrdddn!!Mhn{*%ceyy9>%%Y|CC;{i|R1Gr17Iex7*f5v(y`&g|(QO4=! zg=3*4T+9>DK}Xi?%D^n1)# zTN_K}axfyZ-_|V^vWsA}t1?G2_TqP3)6S#*>cArtrkYh9s=HikLTdKK}emB(f76;ked*%AeED2KefCL{xsQ<6-iV?{C zcC#V?^mFy*?uuuVPZ%yI6nPLkL+c^#z1Fmp4R{(nG2H9f zPzCe4*1&{>KtGeuETB0+YJD5Yh>VsKT>~4OUx21D^+NOsA$hM9=5^$ZBwq!aq#UT1=iwOHBM@VJQ&UYg zve6~lHbMoXm6!JQZ3$LQLbh-r1yCfBLjVKmMz8f}`m%Yupqlg7j2lVub)S95jEeH} zX!@5ka>Gq1+u6os0mOZ5w2e(cC0mXuJB7@0$C<|UCAzf77a#NKxGULh1T79)qUTj! znZpv+;mCIX`)r7{jg5k`G66RB{N9nWN&iO}F%$|dGEcRddGo6oI$wtDNIC!Ng`T)Z zus&*R27|%t>n7p6dS#j>&m8iY$L7Lp#rlh~v$KbXheJa{6Mn+Y%*>>vrBhN*C1t7A@9to+F*rCF^v(%W>(Ttg?Ck8q!a{d9!|T_tSy+mZdI5n*hIuY%0uKx* z19huw#+$4w^b=K(BpHog^dQOWB=BWjT^&**pFW}a`T1#UYZDO>(b44yx*u$t-z|Y% z_cn)8dF>YJ-JtUu14$e@^$zg;xruz`%%5iv`_^>ieLuUyllam_{1B%*)x0@c?LJIe zo$Rn>zl%e|&mol0o;ZDc^Vwg)KxP*IE~wQoJQ`I}JlLEMOP0n^a9=7H%n^aszWm+; z3(`%V_1pxbOzu#bPk>K>@54huC!a@YRObhaftlmBVTgl+PjJIZ!AQYI;q2oBz|D$}j~^Xv=}8kd=w z86W@n(W9S8KRh@n8@b&>(z({x*OBHnH#fIcq_V82sQ5M@PjkU&Q&U-ae+&CA=z9nO zb$}l_1dWOify1*gmLu~J^?o#J*Jn<9%s1}bF3F+qu(fry(40BA} zuQ0q-og5rK-i`Z>LtSz_1ThgGCv|U?<7Y)Tm*}j>PbmSSzGTN9#$j{e^9JJ z5~R>%Ff*eZY8(a+gPxYyIXXHbo!!XD$Oaim3JNYRTwHj&XXtELiew}tNoi@g`DEUF zJUl#Z?(P#ZvuYze`zZ_)*}q4+=qj}B44$}Qba+;%R{pvIx}C%Z7Xc!C7ulm9((f)!_d7? z=iyM8+$@eHXo6BKIy9OMqWaxIZ-2Q-jkiN&b$i>e%6OVHbYwOyjiSO!QBe^90G#qn zAVc;OhXN`pYI=J5D4M#udTws+p_rzc8d_)JJ%*5P3|RnqIk_J{eyoHudlLk!;^i@b zzu-216L3Y+@*;?*xMw-!pChZP;%+x2L|l=WZ6go}INYt`YeGW8Xlsr0S%cpR{|55k z=4JroUU*tJ7UEvJG?=pPdtM&WY=J23*a}bUnJSno2xDnPKYtetSg{9Fz9x}0F6fet z^(i#Kk@v-GAFGs@k`F~%g=%(wUJm(rd{0AJ-h5xa_B+xj7+5km`hCcdm64Ibz`y_k zfsJ7BO7$Z&{g`)7So1_=#4YzbWuBy&A10$CP2w@+UWAlB`H%E@QfD}rjb{BdzpNpC z7m%eNd5eSpWHOHyOvs9Pv55@(-QC^eW2cKS6cl%qyH63(l5~ajw_j(UKN(7rJb%_!-s(V~?hM{4kW5 z-^1sRa~}sXGb5wR`hn;Ib)kQB^kKa=romW2cX$SUIKX&0+T5u-05!NXI4~a-iwq?f zAcixMH@)6T*l30%EY29TvgRTIy%f3hatsSfyC{f8j{~D-HH(}@2q^&EvY`TvN}{`blLucT`KwUE&kWD5L6eAbe- zve`=*1e9Y9kOYbEB>(0>PhvlD1?n&1F1zp^aL;+nQ6nkPxu8FsXco0es4efn<#fw2 z_x;WgE;= z=AL2+l<=OpR=vD@^q#x8_==u-Bp^!t4Zje^8L2ze=9Q-#^9X}rY@g%l{J(BPL075%3qxYaI`RgeC$Y^?`& zaSTZ2csgWz9lPYP~5y`ETUs)1~@yk%`I&0ow`mOp}@mfhc7{jn#T`|q52Z7_G z6^7|FSA}&BlH(S|XoHo#y=rB%S3yD(s8X%e<69_K?YE#RBrIDM4|5Ey(@#_2eo9?w)hK^3O{3tn4Lan;ptoh_5`(CisZ8Mu^IXUilx0X#yGwHG;Fb*A7rHl;pge~AdN)sS1C()*$zc%WW5 znF)VT=Ri8>2n>r9C3`V>xpB!N@Q4HRAaQ~$5TN54G_CH^t@{;t@2x)|a)UMGNXOXn zg@r#$bw`3uAARXZ((=}H#eMUg-CQx_mhaEK@dFSJ&m7f`j<1S&2>0bkp8p~LTXoBs zzjq44Ny!N{@5dcZePr0NwDLiI%VLV9Ac1zp@XS@?_{}@G}$OX9|wL2|)Q} z{GGG10r`+|85-~?gxego-zxgGvf1;;wUISiB##OKd&)usnzBn)NB8~aPhO%5MT~pA z%cpe%23TvJRD9&6)otlSF zW5nH?MecV7vI>%$v5U&g3ff?v?eZpQ^vK_ZdvNCKm;~sy%o^{H=ufSoN=`IYEabDw zurBGnH1CnM67ygNV~eApQtmuaf9BcL_BG|zGmJwn;Q3SFal+5=m-TiEw-eqt5xXZ_ zl;bGeCU%l?6E31u*db{q8Qz3y2j6w7_y(OMqy4869YW)r93 z6>`4ZPuf?X^_czYVuD#$+~TRi7lDk^LL}ywQ+x;D!`g3!ttM|JQ^q_068B#16olT)ijFU`XnkL05)Eee??* z--JmWTYRIV`|BDV#BkAICr{s>;~ij*`+LiWQenQ(p=X$IEsz{9F-_d%@3F5 zdx=2>rSDvGWAm9V?rlg(bX)vPz%z%U%n82TJ%r zdR7gO)=wn2UcXDZiQUEa)HI@So+K7ka~8_XP$<$m(-aKM{quTE>02blfVte@xcqQ~ zEog=DYbc?ops(X+zXH_{ZbmQ`PghXB7M_`Vd=#d`$Y2;d^D+N1K@#T3U=^eECB{1j z{9wOjZ0%nXkO{@H2#E|($vv@a%2Div$gIkK$XcA#hxpwV_5 zvuzr|yd%s_KvL`qu@Oia9Uv~I`s|7y=`}bQrNU;{6q0cQVCC_WHHa~tQ<2!>v zh`ig18v#@AyN=2mi5A~8#yF6wL9gMTk_KfdznFN!HZH@Hrul9SM+#Mua1*GK8tTyQ zl0mx(EDW3Xy?<*vM0Ox5$v-kBPww237S!`@56)H4dg}8kZ4(Ih+`#&4Vt)wgkS4Fn zB^K5ZQ1lZ{cu{LEAv-HK(gPqwvttQI(bJMz1n;;l#$Prgn0#l&H$YtRB4^)r4KB`v z>YDP!5ZJ3AE<{Z)U!Gf2&?d7m6XrWa;wLLrwd=CVQ*h922zugTtVC)Sc+8BjZ_Sc+P?QQr&G%*b(#`s1Z`4 zei%GM2>9nYZnppJITs*i0F6DF!CHsPfL@q{1F^Toz&4!zazti%^waka%z(E<-4qE6 zvCGgQVV}rfb4QPb&T(#LopN60_HDzt+J*U4RkYE>?g@zg68pHZIXQoX5Glyw>({S< zKfXL|DJ4*07*=5P_T;2^fvTabqKqcSG%5K?h5@wh4xCWVphHR^VD6!#k4s(aN%-h}+c5Pz?a+A1A0Pb@XkH?JlGZJ0tAlHyc z5NKS@NWIf`_^#NTJf69bAb_Ume+@S%JVPfC=JyN{x&|4oFUulyco+Nh)}X2Rf>A^L zI!=%DjEz!ajWhNsnppIEV}pLYOoKCeZlp=r{>WXk0yoPT7@nQ1UOmz@a5*ldw>0dT z4})Xc!7$A4(z45z4Eq!x!LKm6DUv;23ztTJw?a`n6Vy;orT(H*brJ@|=+$RKuJEDy z1L>sU!&k*5UzrP0187df{_-YX;S(JVv+yRLueyQ{QK>vJ@XW`-j`<&F`?TSDBtCQD4M>R!d z3|zF+OZ`Lba{zuoekstwkbz3WWsHQKqZB z=|K9uUPw#K9ML?NcfeF!d^k;C#~&k%1?Hmf1I=3^`VGgo_we*23l7t1S zs8v7OLVbh6^HwCnmu?uPy!_- zrSQX6C$nLHy%N{bY?>LHygbLtBUJd*s<_4Bt*wM+Ywg6P^oRR3oo%y32j4O#^SXSQ zLz4rm4L_Kv`)Dus;Vu&*?fTX$*j)MR53`G}Q#gI`@c}fSgZ~-dc*+1jepE%!lr|tT zeK@Z_VKFdAHj-+b{)f`F;QdNdZan^j6IKM&sY-sxc9-I5+BWDiqM^Ap(?xEWd3T?h zIwh?%4D(&WA3EGCjMvh+N4D9`i=IxdAWc~RJ((?>@ z*+C_YiSJ>NEtTz|=BTtFbB6(8eopE-f-~O5)REnH-(N zcq(@0*Lb~1ro+tU|0n!O#DxWsQtWxVd`>PMN-Fh1>69-b(*}oVfiYB@ypuyOmxk#8 z<+bMZl{ph@8FYBQ*7;L-=CH~Aj`7{R`NV@^gxlWo2VrWenzKmdVk?Uf-4p?gB62~R zZ$JkpgC^yDxRFZLyqAoZ6H(9^&!MQ@lD{merz!VP1yJdol#v$x4JgOHq%wyZ@$qLE z3;8a@>lq{%j!zkNdQ8oNW%E7rNPee`bbU+yDRxrB?fsPkljYB7)~ENI7?bzPrMNJOx7C?{4690HW-=@^{FIcb9~ zp5Ygk*u$t&4k(kMcnqdB1Eyv+sLD)sJqG#lt2r`Gs#4{Ih(a z{azqh&x=g5I`HmFjJ_7?W!u56v2qsvq687T<)xBurAT4pAo%EYeJ3l^;}p|Ki2R6k z@sCwM-Oj7MlPEUZbk*u`8uJ2kSf6A-phGfbH$KAN%r}y*QDSU!FFbLW%GZ>e%_oO* zfxeyKzndUmaG@DSa_neHCp^Dzp~zPGBiBHJjVV5jw6MmtQ==Lp6UujD75XH$C;3`Z84ir_rpBb!^PiYk^kCUN}g_%ww*Hfv)^9 zYkV}L2eX4^AW^k?KaTLxVO*`X8m-y`E2iN?aNK)CPrwI2%IeCj!7OSFgSz1wL;iNx zX)xSZ9W;|hd@bB++MCdeU$)ep5b+jJMw&U*_317>SBnyK_(pC-$?5cayZxPs>(mb- z1#@lJBT|Ir##Fvd6H14CQOX4cGLgr#P9J7XNj&t-`m2N`zc*4t15G}Hy-t120lTr; zdmJ;0X=iUkEB+I%<#pAYIaVTo@jM(G2e#yP`?iL|uw36jO7J^8;tW9C&|I)yl9g%U!dwYucNhD>J?)m z=irxq{(Y+U?2L!_V3YTt#WeG4#>`h@IvvL)$El7X!Gfa7I1#wH>k(l9MDVzeLEu$R z9^YDsF00-T{L~yXySHy`t;XkD(6C1Sq$b1pB*|b(qV9ScsGEw*``)XtvBi*k2;gHpVxe&;v(=_% zDq-#|x4S54x9r`UnhNDv7KvmowS^hL zJ=ZBUS~cr?=*_35G=%w#M|g(Y&8`(^DrO&BJhWgRGo(e9iCM;n8^7b*hY-z^^3V2T zrw!^_mq@+RJd7b@>rG1({(^j9Z@&9uxYZ6Rl+x#gD^NIVN^vm&g1TZ~p>YO9ZD8OY z8+!*luSmP|{lUhc|2?NwwHu1}zW38zgjxNf*B)Ndmz!gF3)VAbrW$t_@dm_s+?lR+ z(&u_LhfJx2+A{YG8R<<&;Co6Tq=yvx?33HI^tASv-jd3j6WncoA58nXn_ZQrdZS8) zQ{TK9{4?(6>L;XCOACCNs0I=}djr_Ic*7zgGxGh5g1v+mFGP{CRAf=iz2@>K?~HZb zvv;AS24`I%p~xLwVh|p+765JR(LbTg$9ScUINRA_bT!2Z%W5QjbTF?a5>XiGzY__s zYirxr-b(kw-QOom30hei+c7bB6C|sc;rdomSDIB)ZF49KbI9)|j9Om636PT(z%bVW z_F_+r`z{UGt!ex8yb|DVtOYIJ#P>lNOu1bnTx#O)Ug#X%OmAjetGLQjUsU&uTgl+u zu|?L_LYqTx01o!h3W3wv@^4L9xy774fPGak;lw|Z9ed|`FfsS{;*RBv<1kcbbxRyZ0JvxV%F@| z3{u~4rL=7(0?@5w%#0=t8wau~>T0QJfxQ_CG9g&^Nwd ziz}_aJ6m-1e$|gqUCn&okv-w$oJ~7jL_g&3419v8n=Zl0eH3%U=7N%8mK;%A3T+|S zyspH1P~Uu5Uz3v9QiiOj+1bhqfigC-Vhe0EvB~jy5uZ~-Oz-c%Yij3KTv_^nruH{xc%|Zhc5E1S z1QvVbIId^cZ;a&PXZOL>UsY8g{9HKgl+fDzizk9q*8@vf=o{!DxO^Qa&y5-E(c=XD zrO{Wj#=={2c0BcfmobWpcs)s%N$W!!In_${SFtu~Yt2X!_N-7~-u9gtaSZRBi14rEIm~0Xm(hzLeIl9m2nyKhSuvA^ETDbeaPL z|F`TWiRZ`32~vt!m!T1l>cdeCJDrmr`?>%yAFu19wYVu~tRWGbjgjb%lB?>C7hm-v zW^7>d-EZI2*RWE*TsicJ2-_j&V%-WH%uGgtTMha&X=<%}Q$szbgkiPbxQ;q^U zu`r7bl2oPH85B)ne^qhgdg}&suB+9+NgdMZp956A`576TNclD8P73l0(5KC-Gi-sB zFm+hg(`s`qG=3-(PNlJ6a(bAK{zBd^dv9Z@H6sV#QPpTl=aqi?NvkaPDLE9{e9@h| zK3R+7_ypOcopu`F!Lawj!3HxVATEGEq}kB#-7tWT5cM!fZV{nsvbPbygkGbxeSbXl zkk+_wfQq_CY`tJL?h4o>mCVOhC>&g+D2d`+?H~H|hhBgl?7*)Uf9%(Lxrm5Jyv%V5 z6U=T8gBun$uHDBADig}YU0I^Qi;mKoAJKsdq4It0&gpPMbN1?OpXESzQXDQX0dECR zQKFqu3$?V-@pjX_;%?3<%XN-Y&G2fxov zW5!0fl9WGE5G1bd5Xv28q9r7#Vo9QE8WX4pW37sAqo|%>h72=Ve-(Ub%8M%HSF-pm z^Fd9~H=GF!C&gaoBFo=a6e)$Wp`Xg#W(}G*;%Z~F={PZ8xVVcPo^X7}gqb-G&hpfk z+&32|H4qp6Bh)7(LPog{ss(w!t*1Rs;1Ous4->>s3ECNXnh4-l{PvK0XQZ!HM`9MC zZTf_&^&MXA2NQKqMEaG8#l5>9#y^6-tjeiF`J`WtY}X9DFN^9GKk3}QdryNE-B%aS zDd4q@tm>eL{^hILjs^X#HkQ$`m!=g7xG2r<7zr@E-tk2LR;?Gt5)%=;C;ra=8>$D} z>Lagl7$wEM2N~ewfiIn?h8T|7=Oaq@&QQLzd=|o0Ti_EZ#^_;EiJcNFFgH-eToolL z@(9F94z6Ff#=V+yOV1=b6G#8Nm0G||-%9m8ZcVG7v<|HA_pra&?hAL$M!wAtJ^*#} z89+;Y(?tlZ3vB&WqH};VD9 zsc3!`l;y;RA)nPO8$~Zt^bG|rj*crDJ@KfGNSfiuuMnJr&KJnkc~C+tB(o-s$3W^? zU1NU)Y?(PC9S_k=^@S*VBi~5y4%`c5boeDTz^pJ_?&Dfr(%Rf=Phg@Ld#=v?Ip_|$ zY_Wm#ZjaASnv~p3{t7*jwA$5Zek4w#UXRt*$2faE=-*`I<|)(7akrQPk^Iob&6t^q ztD5h>e163xO|{3(7b4r~Hjz@|0s#hg;tucZhrdN=!TLCm9i3EP$?BSiq3I19MtelK z1hG*%V<7hcf?F z62Kc_Curm8j0hc`mT9%Y487&EtPXj4M%`pBr zig*b~fJ8JO3+?n>f&}%`D&?ahnQaJ36WzxPQ|O~~8I$Ll88mPHqM-=U*Ns&C*}1pU zhNmhz8!nF9HpWMk_q-;Y+aF)#SnVgia`C%|HV@;G9aijfkpKd0T-D7OgSFL_T?)dd z$&o3_AGDzl?Jey0|2P}~Qbe;RKp63ip_&9jVJ72!#544Rd zpQ+q!D1bwpzMoN0^RuKXD`{vhyfQD%%*{0BpF;`ATMdx6So-JZE^~okoI9ZW8NYFY zJ(%q^Bg@O;l8U_QJj0So)27DTAfvd*haaf`R2=|~57&MF{92R1;n%zRe2JPY7L>b* zlaIn~YckRP&YZ#F*S-3U9ei@!M51&}wfAsMxX{!H2tIN8pNRwLy@h`tq404K?H{DP z_fv+le`0Dtv|@vo(MN3)O;1Nt)k_VJQwPHZ{C~?E=&86m_;-{l`pp<`uwvL}@#G6Y zJ8?l-m3w9$JWU`#=wiyi-kEGKt;)l6EhRK{RZWed8amSsqI>_3Pmx~g|M^trshJM( zzdv=*+ub?J1Y@IO;cj8Bud2>+EUB|^YTfvMNao3(9sRIySwr;i9erJUV6%^L8YUGY z&DLMI!)#4fyp>Y6?MjtsY~&r+`?nx4*|{1_c_F5=H%{UJ=_QTO@pHiRp)AJ$%nf1| z;&&;QBc2~`tnL(78?NfCFpU(99C%ap?vLRyYe$?2iQ=|om2H^G(=~y_)F;qR8E5iy zl!oabkDl6*C>DI=EZ<$S%qj>uhD{LHO;;*e8@+1R2Ho+BJZFG7p{@b{Nc9pD+*IVh-;8V6Y6)efo zUn!gX6`ub@xcXmywFffA>JsCUCc~z>%YS6WW3(C%cv);(b<|Nhb4Z#RP~UOz(=oj2 z{az=_K6dR=WIaQ zywtpUPP48jBws%0vA}@+kY~;C-Gn9Hm#DLA0(k&;Oy-rw*A}4D}^caKRSa21t ztKz1qCT?ohuc6xGAb)Z0#9pK(k4H3L?L`dSnMC6vW>(z|=N z?t7gc-EC+azV1c6YRldv#o-?bt6Z9c$y#+mF8-cf<62YXQIuz) z_ScGpK4wAx=U|V%{E2wtJ?T0Xz1no~ZT5nLb$htM=dqUkL}!(`kGlh-8;WK0)~`5k zopYyjg(1X=B#cYfxx@2Xv;N5j%vDgRdHIK52_iQA*K@iX>CtW1KBK`8Oj2-{zSD6` z-ED=rXs@(Wm`T$4VCOMg8Jd^dJigL&`pFfGVS*7Bc<*)m(R1}Ax}AnudV}`d+M@AB z{GUH-*RJ$G2ub`x97712#HIvL8)Ib{|M&8H8Z+c3mbt? z(JYtXiq(%Wpup2eMuVq1{+uQG(`bMo6&OBa)d|zJuA1%+5rR?}BV1DI;moEXwufw$ z9zQEvo&{Duo-vbF`_5ZGEezMq2|5Ax2T-h+X;tG?6dk=J2|8=FS<+8WO8S0(Jnj%s6q4jAk%97NI<;Qyrx# zLG(GuNba*RVChNzSo(rpPo*F*&M2Ntef;wE`6Q)NJAr$s)%lW&n@9EAUjweqn%rDG zKF|=i&!>Z(4kr>lWrs5Nbr`op+;$#dM`=*Sq4LG!;nQk5Ru?zu3W_`3uXmn5CynL| z`k;k=u^4#QnqiABU+1*zG}>HIg>(U%rd6JR!45*6u7iXctNyfRgZ`fXMK&w<1f(a6RaZ)*)X70nE0iN>U7Cp zHzaVd7DoirJyk{>Wh!b;Q>nW%AilxS74?dp-w&G7BO`_m4x954ZIy*hARF| zu%o^@WTnrkqAu3IhkSf&vH^sgN|@~qMfDXmDaJ`GZzS1@ zogag$yRV00T0CiGMjZtrNSC%okm3-+IL48HCoHaBUe#&nZ)6h1p7{`PD2^a;z@Zc! zNsE&L4uxkQteBd2p)3d&;xl3ue9B}8G0)iq^F1_3$pyB#W((Y5eKYwa`quy|?%MstO_^Y;99~OZGK`EJ3%Zg@-3R#y7jTUGzKi+uixNP}= z0wH9kM8Hgu4ODCk5%w_ZuVyW##+f3ozFGdbPqgxCKVAb$9ZB;6%a9z{KoXz~3e_RE6=u9g?^B4X zm+CGf`GX@!=&CK+od^Y3FnJb2w4C{8-ek(Go~NB~al2l18`ZkhaB{z{qO=2BzgE%mj(?`#rmYY}&m;E+j-_y!>t3E6m)D8*6dBhV`?AALb zk`HtwG8bd|_&A!$XA_?=Rq@vd;w8Vx7BWg(or3dnwT6Q?O;r+wsv#sf*!vMt`U~zOy?q$z*k)5#}Mkh@|FqgukdepSN&Z8x>YZ#ZZxL(FMY&)%d z8CevbA8J$Q;K{)6A@3XeNTnevdGo>iZgyvc_hi5T;EB<1{R{)LGxn11Pk?eiH1-#* zifHKc-D^3-beo!ni3l$ATZB;B0TZ@?Or=0EWf^3d5cHNWfT{!IUcx^onXVN!<^$b! z52kbz7w?I#QUgvh_`OhWdyBPove`Od&60P2-r&x3w}=`SF*C|HoXGDWv*dcKix<6n z9p$iX1bx^DP)OUYt-NARx=uzYsG1sTE4`lup#M&P1}x&YuiK0W^vZ4Q85uq716`B# zu;XOAB;b23c{dKW9+nT6qqe>5tc-T9+9y{jh58zLS17Vwcv_@CPh1!TZiOl3XLETy zCKZlDbO+ zx^W7Gh6f$oILvyVy7%e3e`(46KU%UzrYHksb^Ib-h)Ti|vItBzBfIkVAFzJ%_k7dq zb&;=^bXTf1T)~=!e81Y&q&rlLS9gY}<~QicLfAjpZ*OR=Zh#}Ad(2`}Y|hxDS`V!` z#|0i}ld0&gBG2lXL?5p6eLaVf-_vY=>nu0~b!THs610>ET_TDi%R+;iWX@1Gv*C=5X@*mgC|c)h9n$8M)u+i!dEykh!5r=eV ze(Qi>JLO5SzccESyqfy`*RKlRo*I>XD&aLFKD`(46TxCRqyp338m!vtn_v10GqHQW zsx!`ILbC!3^Ib8Uir`K;Rk=3S1rT$GU$3id>g_P?F%_OjGs-gT_LftyfD;+5lK*P+ ztBqzNfL85#BwQb``3;arL!1>3=67gANT%{&_!NVYmE0C`eN^Q~qRtjLV9IXSly@TN zd#lkj+i52AQb2#hGSLRoGw?Z8`7DGz(!{C`nQ)TVTxoO?$zeb+1!r$^@ucgebF zCp$dr+HM9_2^X2Rh(B)jWWPA}A$IKmIwMuR`d54=V;(`t4`g&%qU(;3)${R=a>1mY z-kuEyO%1HZMxflHj9IVG9YLEcABx|8Z0X31tyoL|YQ{)1V`e<6sk~fNUr|&Lko9sE zv4N}*Iu8SFlU3o&YoXI(2!v>Ny6*A3NmAicWix#(&)0bokZ+$T=f)t=PKO(PLQr2? zy3WD$1mbz3rzh6BRj>=$YVDiALjf2%6W~+ z6miAM>8;ZJ4y6A{6j1VhTXfRDW&*sdvLdy@oCBQ`!ZsP_6g1<~=bSHo|E!uU;)pxt z=xj0mau3mha(iu)UKw>w3m9onTM#O29`I}ES{}Vv-^uRr-P=dA)b#2$9w%ES^YcM> zBK&p>#3|~4F%$6N&~mZDai0VZ6g?OSt`97f*Wc-WkFUN7Wtu>&D2KnN;cb$4?!yyi zct0fzOOt0p<@oUWOGTp4#*WM2MEhP~W`MMhUzoN%;01C=gbbHAV<*Uk9k2mx z<4FL-ayfU(Jn=w+oS@46Uw>!u{)3b(*UgIj0ZRhAfmM|~w1uz=GYCuP26Z9$9H}1; zMvMQ?RRQ^I9UYL*64Vb7asMGt3UdMxt20HjR)Y{PlVMg>U@Y-(KnY-l z{;>=IB*+Y8%o$K+>W`zJ{$vpJ=BX?|J38PmpRw+s2$0ibM{JqLa?JAd=EG%Veb!0L zmWlrbMbruj1Ce8aaa{)9zmcH^i=oDrwwSiBV_!RvJ4umO-F+SF&;O0^++pzOf6xI8 zEt8{vgM6U^>$~f$nF`(v_aEmT_#rg8s9nRN9}fQST?F7CqYwY5bpi0S|KLTKcW{wM zR)#S*&VO*3Re0Ll4dfdO2|H4{qh!KJO01JOD-+;-l~!cupcvttR97-O8vBlTGaZy)rCO4rh-1 z_mZ~+KN`jwu8^Tcktr8_-@E^ZNPv8&pV?=V@O+SC-zqdMJ?bD7*aXTVAa)#q4G!>4 zuv5;mwZ1CL0A;)J<{MCzn|=KEegZgKzx5xWE%19@;*0;NPhBFEI{!V|t%Z^8xxNfBYbgz!TdD{3Ab~&%LQV<5lG?J0`L$yGvC{f&5|^%r0x1Z1Of!;0fn%LEK899_iQwS5GJQj!+r@vT<g#VH0kr`r9Wcg#H$Co{}0S_@TN#zG5siyh)!?dN%OS67TPavEfJ+ zVaQtt4w!|p{gy5!87xZw1x|I{_wFkJ=effDpAJtLk0lgVMDN%?&B2)cNjF5=TJ zLgdd?XNk4CzeR#kS2Fg8ItSt{(#F1pvDwdSqhCj~SyCnHtv&!Yu=gI;hvoC%c?Lgy zHe`!Qd`FX&*zaURY3^EhnvZ&3X4LDcoU#C|5DkJE1u5u!oUC1Ojuh-{x-d1K?DB= zfl(B@%2?UnY@4oAXM;b2YLzixK3<0zGq2}nvmPqHVDnYn~ZO!SylDF3Oqw?>AE)^Cd zmU|=Fdjay!%H1i$=0gQ1_YHdPSGTk+!rA-=F6EHNLP8V9w%-S53;Ko&xkr+lI={o* zD#>CR-W^m*VdLK|^4l6Z(9z^2x99}9cP^9k5Q^;duH6slvc_#o>3}up0#9zH;QI0J z0a{;q24&l!@gQ>9Hlu`xEVi&qqSDUZm2`g!4<_CY-6PRdBD!REGDeZkL*7WI|W{<@?MuLtcyJyf^s;HX!Y^;fTzbm24E!WW9A zNm9jWa^-1M6LOeVRAzTfYv4fL?d+R2PqTD~eWw>@T;u1B@~U{F2-a>7951T*-Cbhp z2rtwC&L!uFXU(XmJVAvT`F$Ay`dX5R2>e^;HH3Hab`v>8@rff#=&%gSZ}~?@>Rgc@ zL5XT0@q1_k^@NmW5`PEszEdHl=qk~2bs}T63AA%3tuz9tK!vcr|10EXm?`5Jk$b8B z&BdOTm2IouQ^NGbg(M|D3AW2I%vP6L;y;s({-cJfM4L@23Ln&6EzR@cvA_h{mcl+# zJUeZDtShO(mKM#My)A+j5@>Sy}=0>}e((?mM&nTxqg(We%JN3t2 zmlGN@H?0b3D(dWnQ0zXud}DcV)Nq+wD3!d0%Cnj)cLpb`ear2#QSF^LBe4*Kg63ugX)?>Rzs$3cVl*jjT zuTesy{^f5NIi2a0FG7}?LcZvQVqqGAAjO=}oq$Fk_YWc_hgxY9*Qigt=TUg3pFFoF zb8hA&T;V0#^Y862DmX8gylGFSa7-i{3Xut8BA25l1D=jjEKHIsO_C{2y#MNsZ35II z>okSIIPSV3$+L^G_3e>zkCLQPFsO+2GukC^=Fdw`cjLZi>?ioNo<%L?99FLWdVK8u zXZFW;5>ewh!pNCYm_~DZ0@KD6vS#dXHezG zjVjmeO|FT|n4~qi&D2XE(2;t?;8XGfIPcjw5OZt~1KryeYk&DCv?vr(JLpxYp?ufe zF7}SKE1eZ3$ONDHuVYKEkYhqy+ZXfq76b1ce#K~Xk^e$1jw`l-E*gcU81~jZhWaCC z0iGE5S@nlb{6j|#6R={#f}SX&VKi{SLAy?7{6mDJgvv`(oj6aL!hVEF(}xZ0g|m=L z0W$WF(B~Z$AGTq(*gOxS3>3oG93W7mUbT7_P3UQ;AxDr+Pu-kNv^iU%)d9xY2 z7bmDpsd?X?>1GZ-j>NuyM@R^V>lSZ!wkH?Ui4M@Lql`YzR=Y$4yA$9?;w8-z#V(*w zG{Z!jt$mh!MKd<&d?+ul+z-WwkzKJ^v@v1KmS?~tJAvGREaZVqOY_=~sx#xBQ2eWG z*aKfFe@r+UDh4~ zZ^hwZYXlQ;l}2mcK7O!u=97XVHaHXF=LL`1s6E5%VT)4!GD z{2dS2-gqdd%Taa^Zgn9qu~_-D%DL&Y{Q`*5WA`12wUaMPE4rf{X_Gp6@21tOBv#R;p;|LDVY-oPq(hN?DV`(sd(2$REwV5E!Gr`-TeNmu084j zMs+=LSTyaX;FFphp7@9F5k^4xk+m>_=XP1SCz?-B`orOLvudOyydlcqY*pI7Jjou7 z>u$01ic%Y&wQjK@5)L0KNc~eucUVC(c2J{PmqqeoiFrMHk#0k5TzW%9GumK?5|;b2{i0rA$cOhgB~7fLih>_b>dh zmnm;w_H_gx^F;pCnPqvv<*ymio1-k~*q;Zcy*7t5?5+3s$K6DLo|1_ky5n0=AGtmK zC9#C>#K*dKm)cwhgpU-{g7-n=V**`VS2hdFqzpV&P7E>LZNrO$+!yZ)sMZ3*&;k?>=01Y9-3t z5(TFU7Uh7hL+I|!2Zel27Ek^5pQ>x&_t)=5WG0Pt&HKI_glCdcDENPr>*9Us)>VLr ze3>mzcKV~`pm)XFu%XsENz%bg!%0%m^^NlW%rEg zr9AD{<_}n(PrQy;43wz(mGz%(SVbxYqmf_puDh7eY;N~SX$3*wIrKL4sM;*8r17*N zbRe51JGdr@=-=e3Pm?AUhVAYG@y{syB7l~=b^MPnZ6VvVLN#tM{H>{aRV;aNb=cSK z?w61|0G!ZkZ0cp?E;Qidc~0Q}?+1XJW?Qu!n9(1(5*1MEhb_0Pi1#J?WJ(#Bg^l z??)!}F$quOM_0O#w@ymM`LBFQ*70790&mVtJZAWZc(Ds7KOxdT^Otv$^A{rGrjmWs z;)V&v5u|_vsGRUO8vpS3Ko*czQSfiO0B;11Q{-ilJ*1_!l(51Ejw z+yU*YwnEnPb*cN!lJI$yA%v?KVSsThO$>IfN?88%zlP1aJ0!rU+c-L52+{fro(Mu?S-aS)4~0Ow};OHWU#Vc>K}eKwA;@6 z@g*@DRq8Gg?tLoyzoeu9*NyR|l|xOaSfj7-Ao>y7tdodUANLbTCh|zD-}cF+&7LOl zz`wHHkt^Z|{+B++c|-9j=ey2f6@A!tk<*(N6<=0#>qpL|6R_CP)Y0a#2M(An4eykh zncd+lu&U#)|2c+0k>|~}2@!3JTNSVgm+FRZVCJyx^@71ngY0tNjZ?xaz-PNs0r%+a zXzrD=FF~9KZh$Bt(c|s9JJRtZ${W;r=gx`2pD!o6>AE}caK8|Hx z;7ss60rI6y9*3_Ts~2CAwE-D!{a=+(^= z{Wm|c23V_|{kIDj)~5E2j+*aSJDQ(1(ZvBg_HhXROXI&p5TN2voUWO0oYd#TISWfe zwGrtMA=WuZ!R)O< zokv4fbo(xK+#En6?ws4Eqq3(Rp~p_nw1V^_t^sP^EWFaH{~VFjrWUD78vQpjmK_0S zZ}rdGoy-$9-JV_9|6C?cLS-lD+nw`Q!^wyXS3PWZYWgf0N~Ur+dRmd{(wtjFPVg11 zxMwEw%;RRc>*%Jc+Zw^BqJ(FZDEz;a1kmeZPZNVT=CqiJ(CYD*_(INK*z>DDMLc}Z zCY2JmMh%pv$-}bs{u=Ff%FTLHOY8D49X0VsPHT+!(W_E2sE_>%i-SA@pYSwdPzXG) z{iFH4q&!)8*PlMn<@`fKW12>^5bSGB;3;*(Ssza!2ysmxO8pw+$?)Gq5_vm2bDXgT zr75b%oS;goTUafXG8mxBs2-bid09QH9jDTxd52TTpDIwO|KzxaA>SmzDp4jh;dgT5 zN;K!yxsize^Q1YRXaA-0V>p7deqcrD45!Y=Yk`p_U-_|D*AL%$j}RXME(H)b|xt11!@5mh7m zTNt0u;oP~8^hav#^G5N40Y{7fk3;lW>|?P4`qTOK6(lmsF$ve_5ATDA;Xhx7+CymY zW)afHoo18xiHGUY>-jdp0uId2oKJ9koPx<2b1-(`IJ(l zlhencoQ6RWodAvE2$g#7XJNJvbDt1P#GwBk;m-`&2diJg-`h1;c+m4SGQM?sW4R|(zv7NTSJTF zE)H4e&Xv;lPcl^YbJ6_);}*1wmjOAVClm$t5{Rb_E#By&*{W!A)2S7=XEB`sG+oR_ z7i%-kLP$m<**@OeOkXPp*X<)PE4opNfPFaZ5nJ;Wz-unSm{ggsx>gnchUl@jKJ|-)nhROX&ca zdjwD09j${x$$DYBIgwicQDs3;ZUG$kgkw3cImkJrTl!ZuZFBO?&+$NKR4;1E`7)x( zUO#x+oS>f^J@CwLlvMC5|HH8_eCS}dy%^Q=XXh52os(MdL*2>3l*gZ5(~??Kgs?76 zA=?lhwji-V#=-{dBURBVk0t$J+-jR=l;H&5e!d4f`5Lq?p4Z9Zb`S*;&NO%~#x5$ua@E1v2=1c=|T7h;n4>d7c{-?|s$fyaMso-cIjFHgZZUmyo*F zPt(hf>2;4HSRUmjR)FwV6J>n6+eSCy;P>ZxZ?~-N+xJu=Ty0OPJgtJ{PcD=~Wt&=6I&O} zAM7Cqa-@?!O}f|;ZXl67GSSDxLkNUKef~>EaD<+FRWar!tM=Dy2KNMfU^z#>`;7pB;7|AX}#&bEISGms^SpPfT5S6>@|6oUALQGriR0QH90%UyB*DMZW8goMyFGHS&^g zxs_k5p4h{6(;n7Z1Rr3jFGPfExZAS0G;3zcZjbks?QYJvIMS?Buq$NM8t-D*6|)F> zzzzX!#9RJdQ!QyCcYD(+yY95uJ2Eyj=j}M0)$@b|gHjj(c4Z2=sC2%jrJorcvLn<-KKI%!eA-<|^~KZ5oBb7l&@r8yLl`-hj$HNIz34)B3Rs^* zzFu+pg>F%Hf$_m!6=TqGUl_xAaXCLWT?9Jcyi&Vf&?)`H?V}=NmyPuo(^bHJr9aCj zutU52R5Ux!>C>R~NuyXH=dh)dxc=f>Se3JR^#rlHmVw1uJJAQP%Oo=K9)v7YI+>$G2cUFCsvHT(5k*yfBlHr zpzOxOForGUxpVU(xL)pxY6W^(dL>#H^&QqjDAMg5iAjKGX3$ zojmX$K;-7KHgt*l>0EQV4lj#^W%jsqme-Ek%e(K0QjWf4Z@s=nv-3tRE!X-r)bK|_ zk9dl+hJ8bG1sXf$u*BVuUXy*NzDK?my`T+n628hUTGQKFd?sc(C?Ym}(LW1&J8R@} zj5ly$LjX7uPmgj+!w12XJOdtfbFS4NI>6gS`pZIXd8^M}ynYBhm^J<(@BB%+E^TmC zNKib!oPqaC3Lh~j7Er==Nj>cd_xD5B_TR@gtKttou|f`h88wAHoXL~#Ha31*FIg59 zFVd)Q&y#Y58@^3?(@-)z18yajv~{`N1xo zt!odI>sPCnQZDm1KtI0YbvwR~(jn8N@c8)rWRd~xGiwyxsqS`V)I>!4@r&x4E17$o z(?sdqV-JRtm~j?vkF!nzZgOfIp}W1YFK}xc&rD;H31>=MNJ4i+8*p=nNX)BG`(=7z z?d8#|&E&2>Vpt{_9x?9fRQf#f9(tHu+gI#2f0nSji6!3-C;T`ZT+Ei$CA{~p{~Pu) z1TEOtexR*PL`55SMp+5Q=lr>EaK2Q#Ze(uCCQc-Or;c^rM7PtiU9R#n8wcQ9oYjm2 z3^af*azPoZ#~gG2zk<)GgZw*sAJ-78oElu^gFiPs?N*hkeS_h|y10(Q8f)!=NV!%E zi$)FK#dQ-!aN(?5B9yfL{Kl|OI_tK7aYi+ADY*yXHy<)rHs5l+yYRN6$}=Yv%S*+5 z2PKzUC6Wl9me^dVoY3MG>})Bm0*1(R*+?M7oH|4Q23{ucrwt&-q~Bo`b-ErSSa};j zz`poF-yE%{O+Jfe@%0yk5LpXu;pTpmiLjcoK5bq(Lt;U*$D&ZBCTtmh2YA1r&~4k7 zU`D5=j@ao(Li4tH(?b7G&&m7BK+Dj}2W1vLD}wZRH?q5e)hyJG`v@vRH3zqaD&GNT zt@x^^Xfg`BkbQs$YiEm3g-ELEO&Y_9jV=({kG!4ib#5zb16pI<_obcLo zaL|HMP2P>o2o`g>w+@OUq{Xbg7$-7~W_PM?r@7a2c{IINlZ?w-l=`%$a-GDx9C!gG zQPe&XirT0Uu>J`%P6#`NeeKEVyS@VoaK~d5?5C~d-%LUmt323oZ7;FUT=pa1gJxR$ z%M$r3p0aI+#k=>NqO$#t>dBHrnAxt zN3yKFQW}k3#coX(^0ZhS=}sHlf3@AJ2M_;>lF1jsf9eQ8H|x~(0pXcWo_)&^sU;U? zeHs3)Vi0N);V*wP^;am$m}3Ah4Ejm{hr{y%pI!L&rfjK{)Wax5HGS|yr{nEG^FoWE zv7y2z5!PonH$N1}0IIg(uRY_BZWhS^g$jIo9h1raBT}NH`*wPSV2Aieq~V0a_U+lx zqv8-c+3V67iCfa8w=J?ALDZ`}{#wB>a;Umy--0lg!akoMnDaWal;Fly>rpz3HPdb9 zV*CP$Xd_&7FZV_SWBGgG`)?_skOd%0;xmV*eJWt$W?5OyM5EZ{nY9@*-1b%B=OS_8 zM2knN7c_2LP>!9kyRe}^8Hsn_lx1-l4&NVVE3+l;-$Z-Ve?j>>PH00s`j*sD7d2w^5K=&aNLNRn^{B8 zQ5O4)2Q%^MN)mhlHDB5kXS}4-n&@#EDMfxGodj8r5E*F6p8IO3FXrm8SzsaRY20EB z-tkm*eR&@y5%)1`jDEt=^uH`Nh=GSmu}0!~I@<1yb`#7;NvRoSMj8mHcdoGOJT}h0 z>U=@~8;tY;U4~|+Ehcb%X07_#-J+H! z_Zmj$$?l_osyM9hY{@FzdAA&3?C#LQcW2ZTFi_bP)GpiN%q9fVrnKR~G3$ptP>Tr7 z>Sd{Z&QWW;MP!=;m|cO2)X&ro)VEA^CjJr4HIteEfNkmiL86`~eEbIB1ogH~2356N zNEhp4I??d}`>3mOjZ#Q@Bj`l%*V)#sALzD6kyyen?5G)ZQV^uRg6!5o-o8s&^SZJb zwMkjv<=I*g5^@TYU3T`myi_tjq0gLdSd$K8s*@^!HV-y~(r2PJVaSQ#rGdGi6#wVa z0l(kA-zdqoff${v`RawXsp4WMc@O*EdIDD!Og@9R3Vw_2d?O)kpTMc}O_nUy{up@Q z?IYn4-$04;x+dL9dLN>XiS;FN(=V%h5%wG{kWL|_sWUzX{bnpmE1%&_MQH>X@Pb0d z>_u-|?T>G=(MhxMl@40{0KpSCfU%6lFdVv~HW7@SYx9ta-y_t+`6EFUDLikkbm;9B zV9V83j6CsxH`{dWwDFw70Nxb<`6zt{l2+)am;%m_opayJ-bD(PeJ$W zu_OYV^%;}M54oKKJo5wcr0sJxK^FjxYC@**d(*;dHPg-NVOdU^L>}o7gwcz$t1`6- zNpwe5=7cCa0uyn>YR>;Eb>j$;FIxs%?(m_In!?8*O5 zXdmSf9RnG#>-R{B3J}8-+pdh0Y-$f?q9(#`PY> z6A0;ue$l(#3IxSAfCBID(R1d_AUvFAabRitfuefK#i=@*0AfKicLdns(8+CT-)*I%C8;O_93C<84iXbH6YnB#|HecPA)NH`Cc902mR~&L^%U|6M#7!;Y8SXN^Ud?Yb&?*=f zxqEYZ<7OF8^TH$hG}t#ipm>7!H9*VgY!~k4s$JiwJvhMRrJTh}tOVie^Pp01s4P<3 zequ?^lE)czYUZrg!Fprd50D0R7zkpkF#HBSAUs(Xw%v>ii~A*#+t>N9GY z)p-xCZYSb^DLltHgJeYDTSShS4Z=RHAE5729{p3_Fw!>{ZgPYys;qW#uH@gMX^-5V zZCw>`N)L1{XYUnjaOzr|a$!WaZ}8Qh-aZrJBt#4?InSCSyhcDO$3IB5U$0WLxYW}b zHQUgfpDkGTq33B~wM^aY8HK3ax~?Nr5BTo(XPU(Ul9cTLSxtoL+bt2U8_usjuE-@8 zFW)f6f2{;i;B9c8uj&mxTMs3fO&!W!5XZK09+i(dbF*wE&i@`ItD7bmOR6k?L)4;k zzA~<$2ba+wHvgW$j2V_`Ee!3K**W@d^dJtM7BUn>q}{(-7B|M!_!BWX(t}O=@koK3 z`~LKUk%uoU@bu=<@nOl{9`@WG@sg@Lio_muAUQN;%pr-;pDRP+VNhz%a8U7q<)>h+ z3Cm$<_1^u7I6>kEL_o8X1D4qhSD>hYv(Fi|65L>M^&1?~d;mt+l77;9sTFeA#=7gl z1oMFWL_9pPV|(GLL_v7PeyaZlRaC2;VnjP#@A2XefvNwCj~e!>-8)OHbux1p8N*iZ z`g<3VU*}(T@!572BC*v|_R;s3VdQ+XfzW24$mx3YPvz>(>pysV!O@#Vq3b zCV2%u_Ue9rYXFq@?Fq%Bw}^flu8sQQxvGb-w4g)HZMOxaSQ z%0d#9?QPY?L2`+T5T>WYdPmf1-7P_&$HF-dkY=mxPiR3$E}735Wc!3Bpz6(z!k+t=dL~O7+R!C1i%P zhV3vHn*ufPUQX-#3Jl0c=L02h z_5Xo5+a`Q~K9flR-jknZ56PReftchN81exW(7ujOUX=K z^ei82AmYtd7Vc10FJ*6O_A!g4Zchh`c-6$Y>B}c z@R)S$DIBC?+h^ip#ly;08PV=(jL+#^MgDUB$O;p%>Y3eZWSK&!F0j&+cj1{azWgFY zT2_~>_mE%2I4wbl|sOoB8+8 z3t=}4itr}3d7)jqoq_ZlEAV&m71w#hV}p{Y+k?(?=*pEu+-gk(gjT&bajwTps}`YQ zxSt|b`eru>Y>h_`Ph)qj(4VgbH6OB^a_mV=^T-`a7`X8=HJ=US<{SrY0MCV|#mk@f z5z48K65~{VA4}>J#Y`a(g;yRFLKOJQ1Pq2-40F|1k=lKbQOo|i z;NENHAm^>FrKqodSjNwitm^n^vmjmdt>*FIt>}ti?<4`!&|bqXw870`GmVW?8}-EW zlT{OvFE1;KDRTvX-L%(IzDb{FkUA+T&*Y=6UWCyM1JF}6>1adtd+$cj#V&t4Lby&q zCuwWX+<}I-{CZL&k#ibRxn5g5W1#EKR`6*Ue0fIaWvNJ0w`DKlVL%PTJviqL%uH{ZfAJ+;zt)_E*NJ&d~3?VJuCEX<<-QC?ifOO5!Gc@P% zecye)@7sHy-}#GSJ+an$)>?Pp*F7t2A_xY_O(RB)%fl1 zitlg&@Ngp*=~@yW3?d6!Y9xuCb=55^#@r=NC9FUt_&bU^b@oPsoT9i0m(rlRB=VVGtZ=9?b?1-2u5900Pgx1rC^6bd-*UF_N32|; zakB`Z!#u&un_o4s(XsOl=I`&v5TeVb%|Jq6&@y*?#_cwWs&E`i>{Q^{CNBxusM|P^ zL%Y;GrbtK74dqW^1B_Wz(UA^8iP6myMVJq|`mUY!_4%vrLwl>=ly+&Ow(v}YilfF@ zxIW7q`2~F43yd(ApBx43_TIemm}Hp2^`zUy9_2$HNt;(4@HV86&Gbq?33txQ_iJnrb1Z#ZW^c z)Q?yoG&81JfIVm(7}7-X({hBLYayc%CR@(!7SAb{Osi-)7DbjE48H#e{E^5p<6@S- zn_-7ydqse44tf6(I^1bA0Ak$LNh6kFX7hcZzrmH!*UK=jn*$ke5jeDQ3MT*Fl=4cC zCJT-sPWwm9t2Q(O&=WY?%$*JF4+`E_@4(xO>dChV=X2L7QnqrB=$&vr-S$P)*t{ST z=z}KDWa!EBF<)dQ4jF!V&eo=JCUVr)W?VsP@0GmtXnM{^W|Lab7i%FqM~DgMy?Wsi zH;)6q!&8T6GAE&I!6O!m<>aGfDg73y(T;^lfPUyr=;C@J6W7I!I4@L5@UnDV6=QPrv5N+9&7qvx8G}Ni=5!gFp zL8i)Z{-VB}3vvUmwg^-nx3kH#N05y+ybauZi3?vJ#`=ifnJKz9pihX=h3L7^Puezc zM_>xBlCS(w@MK(j`e6DY|=9=}`Sle#yaRPBfp&< z)l)&i=PT_mk|mrOZLGJ{WVH?NXPWL1)4cr^yYx2~?&r$JIwW29PsEnJ@W{^T?G{Q- zC$mAJEM2&zz;n3x$vo}KXTc~DWjkdRzV}u$>W}ndg>z zOg)#smaKK%pG{Brk+3r?t1NqqISqYZ^`xxBKwTZEzl^n)SGEFW;m6u!rmJXR+)x%= zJVa8BuCA-U+S;4}@ON4=VCWY1*!^hrpjWWGK*c3%93)fpDK>F+l#ePs?HDB8-*7Is z4X*ha%#SC~9iCYF6uDqD6}-nE*0EgxoFLK9aXOCeMEc4SyaqqIwD${L~O z&l595ZS|U0&>yx2nZGTY)keLGn9lyDrIIDOY~D_hUx=0U{`tU+gZ0p3#&3&nb6UE1 zBWzEj_%gIpf1vM>64sWaM;$Bn8>N^tc+)a1K`*jiIu=3Ftvp%nz+>()pZ8EWJ*+N= zS=owzEYhCFj$`!b$tAqLSRP{ijY`23{OlU`ojx@?L-%n5k#_t9AF?&hEy%HPP*+R3 zp?2r+iJn+D6<4G2-;%Q|mH8j#R9`O&?F3{fGt0CJ2y*cZ0V_Egu@8NbrqX$`xQeuJI&q4m!|Dz?t?b51!o#m`&H?e zG)#SdcK3`B)y_lPQ5ss%9sT!#usM(SUd42HBJ2ViY=|mLi#?sBG|^tsHM^a|ejPUq zOqt;_bSxQPHQK%20DB}twdYvr9Fr;cVW+WyN;iOGvUOYc7W*Y>EAuxOpm0-ywz9fd zyLm00sVpv9NJ=^OI-S}j-RYM94I#3+V#_bx%kfw1wJ~%pxc>yQj0&;Ic-3i)i!^b% zVX4w51DWW*#0gE7LsUInT;g)l9jd^J* znLcf#W494Os-QG%OxtBLz3JUe{%7RRxVw*ec^tSMo;vvtsGa|cofG&=zz0YRTHRdA z;T4doS?l_&wWHQjTA$HH$E&eB5&SfyigdZrhW*wd)NT?0TG>1WAxI^EN&Cob>(m=> zKus3TTOT(*`@r>!DIgcfGp!}2M~U)toJlZNK}v3KJy%D*)UJHW!u%?c5H(Lc{*y%Z z^5er_xyfG;(zaf{Icg?76da`~T)LkI1N?a3qjEeZ2u$r6>f%9<2$&8BH=^Bt6B4Jh zq$?SUtVH6K#uypmed+NsThecADgQJM{ZNwh){gR0S%7^F06Do}SyV5M-gC2D2T!w@LFVr6FJF|36 z?KA}u__G+9);NLJoq;%z6*(Wp-g2xQQPHh-P^i8Xr7$&r*Fu@#mxk*o!P_%{>lo#I z_2HOhd6ML#zfLpa)E>t}gdoPaO%#2GJaREp`gou@pc#myyy%1?1JEJOLiHIY$?PYA zICc2DBS(+4vN0P|;>xAmMJLp$C{oT@9P3W64QH@UU%HO=D{jk(?i@ddD_kiQP^TYb%0%mz)Al+nkkeRV^NEYf zc)}9Xq%W%)EX^1Q)zFApD(L&!A;#w61$*)pZ|1Bgv}h%4y4pd*vqO#vi)zH7a%A^? zdtPBJ!?hM|kA8IkA|O@Sx?G{@=AQFY9F|-m4y|IZ2o;OMiv3H+0zH1j^i@>kFOFyA z6{V~WO~nVYX;0(_F^{B?=aElt)~({;*3oN1Z8{w&G$Q1HW~pY+5`rLfE`*#B399a zon;7BcCUFQ4gF>!SynNolgJFeLtjHiUiACdO6DGYc%sk+E-@$YSmR4Wp*Szh+h37g ziF|6yI=+gewEY}`Z#4&RTXuQ3P8_vah=qkcngqy%aIe~NMcrIiKU*jZkKBkv=P$O% zQ?xZw3?V|Ng6LlKKQf=S<$rOe0qsxHW;%k-l;YvH%|ZFO28u@Fvvo~0k$ zUe}#LcSiPHDUpyaOs@w$x(O7x2J>xfxhO1HbC2Ab)wzY7#U4Yl+2 zjqw)Vs5ntU)rh)odfbY6_*=Jkz`R)aCEv;1QgruOFeQQSb%qSd7VC7?%D!bGqif9w z0+&O&&Oy#)jInqvkX8N&YXo)F?-dO#S;(V7zr3Pi>KRhNv78AfDBH$Zi|KQd2 zk*N`MC$$d0-FUx#w!~c$=y1UJ^oNO=m`TYe(6>fVR(VZ$UOyE1OBW-ypU_U$k~aSF z1P8V38@lgHPg4$fGhgB}XgCxoF+Lcb^eK34RJ*==#2E?D`*=ljIl)^ z01zoe&!U%d&;$Xn7!$M+JDY638W#RzbD1OjyRQ*n>Umz?twUrgikqiOacDUvyhN4L z&LJ=UL~H(Xk6Ar}?dZ--Z#j+N{$$qF!CPK2O50kv(NApq4U?dgHd1wF4$?FjlVgbL zPN1XEs;8p#5KW+}KJkYDs)rx-wX=Kl(uN^J@fRQl>bI_!0xWdiO7)`NjP%k3quvf?^)%A`1`Wf^&cJGbQzYixZYs0hWz6e56?o|n}(vLyu5y52SyMAuu7$r z;*b^Dv%);(%?Q zxw+XP4H)q4VOY)7zx-DFaAFWN0DM`?VFw#(0(V^>!8t(ej3v$<^*}kt+VE$hCd!&G zONh;EtDpE^M-5gC{mfZw5fz1YYpbaQ={S#U++FtT;US+FR!@%=<(x~F70RY zq|Gs3lT2fAdz!Q$a5D&c{WjH@Jj_F1%InFoGNBDgymjQ5Gwn!7b7N}V#Nb=%3WQYn zyOoz5t_2+2rdGzQotn0%+}uk3i^dA_|0HMF?`lQ;$&d$3>ii1vCIC^gm|t8mba6=J zENI7nxQw~%^ZAg*=r}E zMJ#5>Yk;xKZ0Igm-Z`MicPFKgt8udd!g^B>r@S6Vh^v|6pFk54yHJ_+T^R8fRM@#m zhtLioOl^~mNsRIrwPNGETJl6*Wa$%=He_A1DXEp9$FA#8zW(EkQ1@)e;|AbEk8g_f9o~s0C#^z_XClT-FU~Q70cIFPeT_qr zC1eli1Gs5o%LsjlEVzP5-}n#6-=4xV0i3Nb@uu3N%}1IZvnd~}D`M+gRD-CzyY9Sx z71nb-%D5(WucKn@5tsX>an5INUb(5=^dqqeRAH>qJOJ{g1xnJ5%lZ5`tYls^`C+5N z*Q>TI`!?we2vYF+KU+ zC=phl@m=c=dRQN6mTdjLF}hQ{^~Z=rFN?d)9qEyF=X?B@I1B7NXbF3>e##c{bD zP`jKTut<7k_Cq~Q+K6NV0MXn01%!wJLG628vTOd|Unn>F3lYIEa`awF$*HU>W>os< z+xlnd$c9kTH91&-Ib6Wsd~^gaBS#V>TQx_*4~^Ml^CUKvVUXFa(UH`pgE6s&BV>Vi z0QySin+mm}N|f#D3QGehP^U+s4$kle(O(|iE&-J#UjIC8>z_5TxWRYsLP2lYh&Ob& zH?*AY^VWgSJ8=a-7Q%W1ZWscvEEB1GtLWxFWsPF~gz9)4129rRVu6zXZwP<|BcUh5 z{6t*)_1mJ#CWe0^E(BTs;6P@h*I0Ap{e0+a@)_^Bwz+ua`}<6$5J*j-cE_g3YP1Kp z45Y7>&6nB~*ADz@N&Q4y`Kkt<#4A9sjyZ5Ns%DFTGV!>8QDIo3`d|1~$08}$!sIP_ z?@N4yhtJ9g93qnyK9W*$12{+Go(06OeCx6fu~^Hu;NNL1HemLu=X4F89*gEpiWoaB z{UC>fu||p7wcp#NT|>(&b?}+|ndP@McmU?9fN0^jr?ETC&#;qiUU;c|1`wmbH@aa3 znkf<#?V81uKTZ=QN`fpRv?k^#i^_MFDR@o)@!}YmO9(lFSLM+_Z_Z<%AWG5@+x0E| zhuc&zRPhIPq7vyB&oaQDd4cpl9js%bTS^oBF{gSA55|08KVZOUE9c#eT#_IqnUVo|VUNS#x5s0B7Vr_S3 zY+zf2N(8TQ1tY6Ssh=FZrl|#Tf=!iQir_TuR8P%fFfG$>3p(ky!+;&LS;Mg$is+q! z8genx>;yY%%Y9)PsoXK4b${QLl{}NhwS9x@#s1l>LpPQ@(ZRlJWYeq#5%t51f>?BMI zkLvpPA!or}usKnNVrwd%K;Jm|QUGtOrle7at7qo7xs6)>1c=J)Sf}iQX8G*(80nCU zT}k@km9fegm-Yb?EHhJ07KEprFAExx5ys@zWc^R^sBW1315G2SC8)6l90_6j+qoT&8HnrpUEl%i+-!lO!d~=?k&Z4Ku6eQ zC~DYC&qN=xhzsi-R!~z3-KG-FTm_Yl`%4V6`s=`)&%b$B>x4dTHKB}}^R|xgsdR=&!?Lm?ca?{HG&IP%c#CL~+}QM)l^K(F**$VRv9`%vJGWc1%B~9{o>%`I zVIESNC)VF9girUBUQuV5E$++Oiteb_n>vop@AHF#IJ)B>@b7dr1~64G^%P2$ zjn(d{8;Xp+@fU^sj;XF*+8NMsPvssB3S6|(ap$b3$#)dj8q0Mxn~7}TR~TA@^9cNv zIT-QQ`i~g-gZ6sBe~F;Bc8Ami_M+}24D%EH=`3yhNyXZFbYuTS#6ou^!Zjp^>!_S zbQ_G@usS6*i@Ink3VOYb#HKxfK>M0Lt9j+mjEbmJ@sc#eTtVTs-vA$$hsU5qA=}4vQPDRC62}4?|+g_YgPt6ZIB4{be|xLP^gCwHmrQUJkK0KBLL8gtpOb$Py(V8 z+WdP=fc<(t-WImD#sU`@;X$egW};%XLmze*Em zRI7uLEHxV!GaLPwkT37~6ZL20=&soI2r?H0%BJ}2(j}+8*dw>t(7|H9#79YFFDokNc3jKQ`9DF5M+vx`I`J4-^$pc|oEt zR&$<9GyI~}*QOB3V=T%nvkm&YL;VeQWJGa?=Zd|t(p(U*3>98O~s4Vx&pRK z@K}Ldv!!SoF4Ag6fTH$kTFT9x>%b0&r9UU90RUi*bR6$FI{E!op!U@(T0Iz*v6W}k zH2~9mIjGQf&^6~0Q)NbkR2!A|*b5D1EkTO0QT1g zcD4=f{al*yX{tUm(Tladio53yv-0`+w zFiE_2R>@U)i<@u2#r!YXHhc{Prq8w#Z=-ttGesTl^YRbxS_JfgLbqa(0;BQGr6MFe z&%SgQFuZq?uKlPIA!HqJ6q&*$LV3JY?&|#xvO-`?*HOPW45qt$xMl9rXx0I?Xv?&l z%?=226pB`WN}oVSShF*YO~fPLop|nLw<7<5MOEcqW^Ox3P&bMXVDC*4q94Kq#*GZM zhRf?-?lu0P3p@4H*LYcDjms3s4eF{*HsPw0gsfD-`scAHrktnfTSv81_Zyl}GkB!j z9m+G*R*0?F7G~a^QYyMQ-iLhjYXm^>LmmM6;i_byhOnl%?JJH+8DweL_^ibhR+d>z zCTO_KVw$J&>?0Z3mG$dwZ*-(+9HBQyqT38}nSXR!<)LaK_Oh4C& z4R#(hoW7CX1zFoWVZA5xKE$v4fXV$B?LV+6P8V{}0OMFxVnYj4o5QTl9sl=Bs?`i~ zL$Vz^uqDlLTj}+^YnyA6Ze_)ipF--`u@54XDa4odyNB)yI(N z$>EdrOnCcW`q%W;4iwCZYM*yHt`wVgy3kYA;dl+MUzdd9YqsS;{4bE`DItID~ zG~@=;(Mnr>w*v2lCqE*yr*0BJn{N{l&kh4t^>FU5L&SD?58Uc@T74Qped@n8vYug! zqL5)Q9$TkOLip4oE%K#UhMZ$p-OINrUo(`!nqDT@3Qgp_f8$DZrN$zeI7d(gcqa@( z$5HwZ{_`-w{1m;+yPzP=r1kB+kW>{QNO;`k&>OHgd79&HaP2_75KWO@mk)J_6&tnB z4=XPBz7Azao~vRW4(U6~V@~M~VmrA>-APIFF-h;_TVDr*NO|EaJ%qyQjRcr7u`6ir zB=C#AycMEV$qjz`N~hgJHXZSUmm3T}#3FOFfuoBa9eC1Lnv4K#88x#OvvE4b@hFQ+ zc>~)`Y}a*)^KZS56u%3a7Rc6pl&juh8P}Z*xU{4hB!k7*n#8|+wcr*uRyKnsssKK1 z;Hw#XXY$42bk+cE-@Gzw^gJ%I2+QQhe$pv;^A3Mx$8>=_y}&e8U|{E3=~A|E)bz>y zMxE=3Ktk_0^aJ7T(7=bfFL21M*wb~B#m^GTKQcsIoNwLlG~r9~Aua-57oML7ZI9IK zs>j}0NLk94&PfU;PJWxv^1|IYxTtcj~^p*ur zarJ$1loxtt-uQ_v&m++jm#wBLDuki;i`Hi5iS+ZElzslMRIVcX?dzkboAgT_`Bi!^ zUJ0m=v*+fre*$aWj<;b$**;j}!;r;JmiEpe5lHYi!P)oAp|0t$>4d!@YvhB6pUmq>Qg$n-pvkG`ZEAk&##e6fh^hc&j2?Ua(-&?u zt-9r-yz?QurS%u*TlCtLFWz0RQy!%7n#69-vXb=1;-BCdLUzaU&v*Aa#}t{&#*~k2 zX2x1RvMhh}JZwYY-|)I8#_%|Y!qx2Jc3hV3B!vz`;P+R%=cIj9aDSG9JmXNeMpe~8 zP1Dj0Cq}Za=77btb3uBnGW)t%wb`<-)5Ow+lCkppx@ft|!*#EmxqB0yn3bQZAx4>F z&Br<>p+bt8EiaJEocATOUF>UbZgRI2YgF!c4o8Fu77i^GS;e^b+CCZB+9Tm~09jBZhx;bz%^_r&;vO7YH@368Y9Os>*2I|lwUWJ49 z5vEg+W2(BFu?YA4o#00H9eDAbGlhW|U)~XsDBU8M(sQ2j;?|21obt}xmU7*y@w_D8 z$S}E1>9?JMfvuXOu;v!DSSsAkUyElU7p5jo+T#)W^X9eBuq@b$20Oue&dq^1BmA*r zjVi}F_KJN%OWp~`hPt&m0iFx`(`tUxGlkMr+vA9K8-I>-Po9^IpTN-p4K@7L7(?xd zt`$sBFtTCtlrG}W-c9bQf-s{tKZ3eNnu@8WxCH!~%aC_@<9!Q>^h8<^)Y;N3;1+m8 zlG`F!h9-SfrCsOEyR%?<>O5$Hw^H&wr3p67Q($ybTaFDK3H7A$_*pJ^btsFp8@5qb zJ&6C)&FFYI_{a;9vY(V&OgFsBpI3^HHM3yJLg2YIoooJv5m5sXY{-KSy|Q7 zy&SySt9$#?m1vLqy!bDPU0xp80MuNum4Q=NHAc`!%nVQS_jaLpx_ibR4ElNJXU9U- zK>17$o4T$0c(;_6`J1+NZBn!w8-5Ur2hSM2bTp&&y}Hdw0j!3l$gR%LQslo4`z%?! zx1eQtPy-?i6exx#SYtsKiitWpmIxf2?60wd;m&6EA+_MzMDK`(P!zV_Qr#s%Xxd4{ zX+spg9Z2|f)hVnia9Fxjkbt5Xk6Bm(MO3YE?~rzUrQ>X%*fCythcz3d+OXzo06vIi z)POCEt^W|3x`O?jB57+BIUX!7N9IDVNryn1;q&hfzUz${-K}dfG|LUO4kWr?^;-UB zTq(aJf0ol`iyNHB-R z&Cb;6#bMCq9+0e&Qm6E+44^FTL5$2zX@{rIYB~Rnsv?raP4Ym`V*-{Wvq41K7ujof z3oL<{yKux+N^RZONf%Tvrty`0ijd)Dupz?}v2=8yXDV!!tZkIg4y0CDVULf&`P^n> zy^NCag%;T$yu}M2Q<5mTHlc%4OP9(yjRGq9v@S1aK2u|(3vO(W#{Hj9L`gf+^BhK| zvRfcD*E{gfXLETxG67C}kS8}1No9spHeb+_;hW_wJ7c06_}57-V;)q+YLP&rc9*1H3?3u5QQ%1?ow; z`z1&A*`kx-PHyT7S1YUsK>M>X<;$nk zDC2Bb&&A)1n)XPgsj-gQya5xMWrJefYb{_OcAD05pDcN_E!biYqk6Zj7%wv@t`QY} z&q_y?Vm&JY$69T)F2Nq43^+zN?vP{~zWVjmRp{d=Z{kN+rsQ%r28#2Sr7N+PWsVo` zyUR_h3IypN3^h1whbks%BzgkcQtL17M%PZXN2|)KWkQumpFZq~^Du{%o-IbKu3v22 zhaS2BFEE;0Ch4=e^LVv=lP0mM)!^N7|Fc=Ou;6h(2v+p!a&rJKG@7lu<*7_gl8rJQ zv*FNXb)v>aF?c7g4$=luG&{Pjl=sGaEuYmkmV9HemcJ#qQoDaU4F1A!r}ssQ4fqTM zZ9U|x1+lBRBj#hs)jN1wWYPF;AYrB|u9iZeN*r%p{nkGqw${;Q{z;3ul$-pym|EfYreyE*am;JRk2}ARB}spNv;shn2xRtf0fynT0`^s z#?cg7OQsS67XOiX^GO{CWbaS@i>FU3FfQ>w4zeEN7h*eYEFA0M2e@xF=T*YpJy>jT>hi$R;SSoSvb_lxpQ#7;l%Iy2O{+ zBNiGp2l=gRFVc-(wk7}Pv5@%)YzIosNMMT?*;4_OAsbW~P_Kb(j(^4$^3K@u1vL7C zxLU)QJIyTe0|VlJKAmu4&e687hLBCgu*|8_OnhHO&3g+TZoa@1^6Q)_qf6TGblMk45mN7O92*C0ld}_tXDkU4P&IkK2yoEf5 zA$va`1Rvy(CyFKp+?WI-kK%c@WwgUV{g|M*;rdFT*VALT$tfN7yX}-hS6` zDpV-kN(my5R8#{q#10UCS$Q*YmP&v=7y4v@Ni&|L2TO3Pbk_}-Pa-g#FaI_j?g?E< z?b)1dZA6BS;sBfI#Z73}gBhsptt929sB`SudSgot`#conI6ZQ|d1YAUQ|2|%kvPdt zze8^lS0LtL(DM0=GrMb0k94o8Zj+A3%Q~T)+!qiF@6>s}|5rbc zpdB9W997kOCiheR=hBHWXJ6jXG9PY>h#kwHE$~_)2labyB(5}(MGhBNQKosg-bpad zb@eSn(^?`kFr|Q$M_sHYdq&uH*YqK?t=mIOI3^yjUPIa=KU@F+) z1G-djrw}~YIV9PpbY0-5r4fOR##dwT+f%Kw{Tyf%jFyFAP#_i}Uj(`kbw)SXQSzXFUQ;^WX+8fh8 z!=T8<1xkdtIF$p|W+9R7>#NS1^La8vEccL)dvad*W7vHtAPZ6^TV8Fm#R0pC<{x31 zR+&WGBnOlf*|A_eLeg_#?lv=bl<-+$pvm^4%;uf1c6(l?1LYN*1&N*m+k4f+UC>~a ztnp$QoiEuGRJ`9FIcLcyER?pMYI@{x->>Oy8mWX@ZE9<&Ipbr%-)e+{J**nQv~A_>s<_@MGC`!?V-^;>@^*ye7=sI#8I-oKhh~D zEBIn=@(~9^22QZUStR`U848?Wo~^Ws^6s|1E?j{dSd6d2ZB>v5B+V^#g!~92(d^RQ zvv*}e#~Y9?77_9^%gBbMv|~q+EvREJqTXVSNj%*qPFg8U(bc1Wt2%U!dt>q`E-WE; zOH=`4=hrvufpW{P1?9Bzd$U6{l(2u>Pzs%E`y9{8_$yf^h_>SEzJw|9emz&1&K_WJ z`ZrQ52JPTF_Tj92Pj)0)*b=Q8AE%7I-F1Q$+Jd%y_M~Z>(su9g3Uib)%d22?#dcoB z*$mw*FjnuZ$e06ESCnabTtDJc9&?-yrAqX6m576mPAT*WZVC!yNcU5M4!kGXE~_;J z1je`pW;tkSE+?_5oj$y$6u^n{WO;b46K(`f zR&wgAQOJ$OWtAL@6(0k(BP+{_{+?@oQ&x}m z4k#Ip6eqYx>9PIOW&9+E|B(ODeLDH|lV=}Y^gsJSBT*jMteooH_Zn&--rf)PDMysk z%`;9qX9H+h*s9;E=F7DXCY~KxesgIONlmqkY+6b`u5f|d3-oLsN2Fc|d$Er%aGzIe z)Q6UfyBcT!gvOUWFHo<=;WZ66124zDg0j7do7T#PFiyHLejC8|2TPH5TACl~DGJ1$ zbg!E!RPK3cXnAt*)_LCY1bOX>XDbhFXNHzkMjp~YXh7ZLyq zKDBf?|GD~_=mD=?I5LX6T{z=0|3hf{p--~~vT|@oq6)|77QD11g4h`F#kOBJIIl=^ zi~o!gAm;(P+!#U%wCtQmEDBZPGAs}*Xh1}pS5+-I2*V=+zPZd3txK`5X^n5 zB}C1^$9uF``bJ#$J+OzYXCN43?IUX6`HY<;CILR4MyYJ+0?4mrFS1%l#Ou?|N1@HiM=fog46b_!&YTargv@ zOPY>WC5xFxKF`Gc_T(1BwQ~}Nm!*yDAZkY7?hZR55y?~l;&4<$A0)cBH z<2Vt_J0df$sazQV+4d%M0+QwMHi$4bCKU4{AgH@Ry8bdQ{$XUSY4Es&Uy)<*V175W z(?^3yX4YF8tNmq2xAZG4XtzGDw(jio#%IZG$1HWkD7qiukspv~uKab-(A-gVdxKF$ zkWm-jt-0B;KQ}|mu*F0%>G05fe%J%h0#c*daJ6K&C#k;$dJR~_6w?A^mO6XA+%h+1=+cn_<%Ym4i0h>X6a$R_)_+T>~qV2?uhY z!^yzqN(OQ~@??~5V>L2td@-})mx40GIcOND7#MSp1i}P11cn4KZ+|u*l@AzIYK{nh zI1k#rv!w{7B%3?louBaAgX@@0?5>VyPjuzTNoxcXhAR-zD}^$U_54wv>)R$)rZhY^ zIvFXJaf+9I`}SF(sc{@>)NX6kZmRL@B=8%HeeGvcz9Y^=zme7r608nRs5D?pO8l0sMExE+vME3wN$8iLC6CbS zGkbf!ul8F~x}O(4r`hhE4LTvf$x)dW`slR>^bYnNJs~HMb_+|e{qEDmQB>C{PoGO0E>g!ScTnggW#&|=~RH2 z(u<%rFph=s{UZ@O)b55jrsoihB=Ig^bA*o{H7D__-iGJsJhpx>NEjGQ2Dh0!n8u!+ zIgt$f0+%C{xpo9CA8U6zOE?uGHIb!^v||&fR#FtFY2K#(hUB0}xXkm?|F-LojSSp> zg=Ml~wzjrr`}=UCecfzhZDYD3Ha&AjDo}|gl^auFQODAotP_tasCu~Y_#x&_+v|V zNB4`~*L_U-j1d_efVTW(v`CyWSoZ~pMo8Szy*X5s*VOut{?Wvbe6Gnr8Veov7OTBu!Ay)&s4cc$E^eVl%-(WVK4MQr znK7r09Z1k$0i9Ya&G@Trvyln{pHY4%9b=R1huN6O_MMF4@YPS25-t}*HMD+)N{@Cm z(~u7g+P+(a#a|nAG)K#sgFf(uY$2(lrB6Us&5jmWxRO5rdbg4N7-Y<>{BnWH=-m5C z=?pv|UE>`E4CK$-!PbEO^j9~VK9>LbdFUktHva$LbuR^W`q!&qz(ZTW{}|sKhDgoPMWh8*zz||2%egSN44BB9JadR!!w33{h5G2)1Sgc^L_2-u3u z>2g+59j-W$sRnXUpgt?E6&K^g58vT3cOO&XCgg2-A^X;0!|%X!Ip579>D~vpFQa1c9GUVh(ufu?lcC204JP;#ltseR8w_hNli$1p=St9LgJMV| ztNG`RpI_8Jxs;J2nxHgS0$ySy^#Y3Z_2Tc=UV?vb)xCK7_r1W&{&lZP3;Mnt-f?so z@XE5 zk{_5Gkh-TqVQiF5GoaQA<MfaQB zHh10%<$>n8QU zy1vmAwp2>Nk3z*8rS!9L=WtpC3QFre-9L+c+@p-s+h2T86d_xDp9d~c-=S<9A=(1m zwiD?Q-KW9ucNa|1Usn|so!g^rLM7{UXPP|GbwZesfHp?U$a37vpL|{ijI0tO0#*Sq z?)eOxG2u=IRNl1<_^hjx_KylC3k5M+R+Xsi=Ic)fmtTFb$u{bqnlVy0Hgi%GTzz$1RMEGuhzd%#NJ&VCba&^_9nvXC#}F#r4N^l& zH$!)KcS}nQ%?!;OyubVIyO00)>~r?)wO8!#ioFh;YLriBA7dZY)wL+p$w_4%B&f3l z8~HV40e)6W`!0SqqbMc#HRo=dG_JOoe3tFVka9iBh?nGH_UI&qpwh^|vmZ;Z-?%+| z3~;F`n59Dc83KJ%YZwiM2P;Dk-3!*H)|PYoqT-fIKYEr+VnFs+?y;!=nIf%iK5u3| z@P|FL%P&pWt5`R^j;rT^%6K_jT59}qIy(6YZE6>%8JCyc9H2=0w0;sld(j;19}P|D z4&|$=(YcVx6ubXpRW8-k@CFlJ@2GU-$Z5lDii;iHx^~_xK}t0>I7N9g^>YSeCK%j5 zGpi9yIODuDeK+$e{(KUpd~Ek6%c{leR>AQS5pj4Q;Nun=O<8t)E7>MoGgU(hsNb_) z(ZPm@;?xD0^6Llp!-a6XyuU)xsU$u3Ul5Y=gD`>&`!-`LipkmI* z&XGq`utXlg&xA#z`#*o-ZOl0k7-c=DI8}a3SIr6@sd`D$3;S$V&Fi&k7P^Q74d%nl zJP%BlYO=zAkir`uRvjkKxhCW+9>~S3rM{l0vG!Jx0cq}e0e=F2&`UqzO|E4nNlqHh zyI0SEX*j=_8&Ox}wAKH9f~KhFv_-nH{tWBL`@(rfnw}%A4AWf72%N)2Cu|X?5e+@S zRs-y4M5kKk`N5FLA=ZMM`FVmjRRV;QV2mh_xu#>-Z`7m4j)SzWgklrzIER@b9Hyy# zoaojDFAVs1PHDm~ciG^t^}g{VQs5^f5lzN$8}K=&fL)7hRO>{zK@u@H$`6+Fba}lz z?zB%{zt8)~v?I=@n-F>8*Xu#)`VHPH{T^8VEWvxfK1vHU%3nA?UTOy>M}PzS5w~<92)&-6&T48 zPvf8jGb`HFK@+a0K@t%BJ>Nd71x5-rX8AO1mzUtJNP+Z=G5d-2@^i$lVSw0@yUJBD z!&3ZG#@q~#R>A#ayvO7xPKu1?S*!1Q1lFL7X<=;{g4u&|!-LkUyYZ$}p}+0$GiZkG z6GT>x`oLbM;O6Q@i?rIW;$040GV>=DFe;$&fhg*`9{#BJc zJbRTa08A4to=P4D+fvO6gI#i7P)v2Im@BVv?{QSTBXW#L2vX%Gy*6+iZTabaq=A9= z*ONx;0=3YF;LV(~B%T>)aDPL?|R|XMrpviYm;S&2}OdNA)9H=njEAUm3)^h`Cf(qvOUC<6%NJ_{V3HQ-oO zeO_vb=^ZwbJVZzg_zHpsd0Wyl31Npw$S%45m3uex(~GCRU{;M`)~CL(w7^Z}jk_P_ z6zCWR-KGIHdB2c(_xS-3C2v~5XQw_5Tq4g-aM5*Ldn9CYIJDWg9LUb8$Ly8o&3pWa zGX?V9ZwdJ*u#oM0sIL}+4dNi+HCV~Si&dEnlqq@NaJMK~Pd%0Rc&s&T{x(qlK?gv+ zcG>b41{Da#T-9>lu~+Ni_bhk(uCMm2_bG8u4h-WK!SS0q56M{-pJknNf>{2yj+N?T zgTsemkvfvPL7B^H-H~Gub~^vIWlIAWZWF=gR;NT3B+K!%(Z_5LUli48LoE@;Ls#qZ zKgSqiOKAj}8W~;z;%T?00%7|cZG|8*<{kdA;`J$IfsVXn!HucvoVqMU< z#P)r#LDBH+VE#0Mjq6y`!61{VJi)UZhgxGC;2wVu#gSJyaufMEr}i=R?Y+s3P{n~% zA~S@Q@R})dZAGa2^`Y&3Qc!hLlU>2EpDufd6Krynq-j21u<&k`W~qkQHE=f!!#(~@ z02~T8MYfjIb2Mef$0H`fx>bkSP7^@oO*V0P=4@VwnALM4S4KHwmJeW#Km#m~Fz5{_vjd zVg+}D}%6KdwZYVIh`+M9iAGT@voJK+{E<0R-~AfqR4o;3i>MIBs*>tf(mIh+h);11S1 zUR|VLN`-Xt%Ku{zJnQ}p;Nj3a1`~&?y5b7xU){c0>jIPCWcgt0n<=7mzAV-mRv}{LtMPmI zza`J0!0f%AmayCv7}Kf8}+ z^StIlq3qUY^v@^*rt(QJdL&fbNe1@-%HFjnQc;X8o9>Oyev*78Dp+XfU{w)LM*63nVnPiLsSX#009$e;5gCGjT~kp$ zVGF*A|G0K; zp=(}9LoZWN(Uv8Mm1lMv>-P}qcV={3S-eXSzl}@o|HhHp4voP|Dq=A6B)Ob5?`;?P zMN}RIczZoMZYTi(1p&Wr_kshJ#%Dw`zqOvAk>JHeYDo!}$vKPKnIdJQNcv5@UwIbN z>~y~1Z(Qv@6x>BEYWACwn)9Y6cc)n}&BF_Sa82s^{#2(CFTlCHc|o|a{g}Vw|I%{% z6Dk#{VbH-)e%_qnZhYW7ClLJZbp{QOaRv!Yll{I! z?2fdM(UBU^mcp>shi5rYrKzg$C=2uK#f)8$><)*!CgHoh*Ru8D<_)oa69&N@R7=yT zCLBB`A;M@{74l1J_smHq)ynG9uD8D{KWpvNm+Zk;I+8GV5=nm?QNyuHnIE2rsP>Qo zZMtubWX^ks8g~QtlnZAGz%)jkwi7lv;$DJIGL%&U3x!DZ;x*LomTcP~9Rzf~%}dHR zVT~f_S?4RE`R_LA9mX%{zw{1Glc&a}T`nDjHwyB8mOw)Y4zwN}lPmaz82|1OzW4~8 zVq=BFIPuI&RG`5GsOOu$NzMVc1-ulq!3+NXE`d_5uk~ZaZWm9ldP5#)8nl+1{W6f0 zI0k|KKW@|W(h6FJl6}2(R}oz_3#0=A2ZaY{nUikAnJpFb6i4dZ{)lU72@jODd;45q z7JmryqklubZ=XEZq2R@IHRucsGeXvo>2gmJb!3NOTtymSi6;~^(|G5qWBid~S#Sja zTi_qDnnqDQ7c`-=Esp|Yek-xnmhkHRI@`24hu1t6pG)rll0{lq@`C!^q+v2VD?lg@ z_s?~GM1i^wZS+`_Rrhf3Vl|RjPL|M&E|@ugp4LcVTPIIcCK`NP5o;*#BL>v(DwEx* zC}5zIW6w;6-|j~W#mbT>XTFx|WL}zLKPuYT<+O@MD%&{NN1*E!)OSqEkO#?~Y@%Vv zl(-@vY+6~>7BTNaaXnoact4uIT#CnN*gX4NzsK8y$HkE80r%JCuXtQwCtmE?gC608 z+COdro4^HE5*M#FLM=Qgy}CeVhX0^SGW?@E=wDqiLS>yvkW=LI3j|ZNwqq51Z8dHp1$omxek!_rQNY3SGX&r_7RH_{dRyb=w30Ryz_k>6 zxImjmQb1Dh7kkp2vLTjiMu7})GcznJ$wZvfzhpp^t>XDahMS*>z|&X__KR^Nt62pD zY(|_-vKflrJa+bW>z@Lr#}%G1(aliXTG>#=Q{z&6NHHS>T7E13XBTf`b%r6MlH()4;(_8T?#;+Wsn%-cIfX`woen*rP~{er zO&GH5L7Oaia|FY2p1Hq10SYjA5Sas(~M*Ddcb zxcv80Iu(KEv&90r;?X--MewKdEX5bWRb$+PGE}BR6jp#U5$EXjK@EXR#wpM}bJR6^ z+&Kn`ET$~j((xJUepms|@A&&15OB#>ln_KRi8Pf9nAVRUPJ)Vwe^*I5E>p$vCcuMB zq^cEyl+*B7N@Y$l?VzJH&69BH_`z#P_7?kPdHpULmrm3A^0Zcng~juS zN4wetzSV87>}cyQy{8b^S9GPR$7Mx~Uf)HjQ@be;XDxnlxTZ!Dul}h6$L-a*;upP5 zO<5}TqOym?*(zkx7_Wy9@KRRp%x@U!7f;o`C2+YgyIi08!vep7DuxNsNq-i`38P;T z@TRLO#Mf=BN1W3)<@D)mD>VjAJP@pdSVoB#ZCBESryH9Rc;!;8VUinZ00|TEO=?*x z@n`bIl10JN2Z$-i*T`2gNp#Z)WZ9(qSI^52H1xNMp5bQWJAIx;C;x?znBbIcI2_fX zkRZW>!sBKVe<)`tb=o3OyaT-QxUt~8!@ot(5mYrAqV13_ls;f#!+(BvP5IgU{1t)& zIiFJQSMX_6pQh3fpMPld`FIQ@4S@d;%ypgu|%chR^FQYA>n(HFuT*%jsZYuz<<2 zC=09d2z?cO-u%>XU6lQIfRvyaj@HN4l%7J875Ma&g6j`euRr(<+45K|OKI>TcC)N- z!~g2*>gsB1f82EJ_{^!DqMd~!_zHeraA7Y&&i?&Ui14aXeT4gO;OXc2-^lBIXO>+AUJ~|{=5faprbS4GT2(~9`ehXk`=nQ@$3k4j-wZw5 z>gVL-WHD@c0d;k8$x8d|iqv`cQOJ9Uy{%(3*&jf+kCD(plS?|)OYComj2eKH>ATzc zHZ;~u?hH*O;e!^-0nt2PAj6O7T+r+!iZ+!6MQh5)tQjMm(LUq>$s#}@vvAkLKuQ3B zd3zp#lDwt z)K4I0$GX(KD_*BvA4FCpRQI!#zDiG5UZhh=03=_8;9335Bw56w~Pfe-nlbCpPf3#FxLR74)uSdKh753FvR|m7e zFKU;~qa$3o6;2JxZ7pTNX+E<)n3RuF%`$X#tu6kr&CQJ@^!92-ez4Celap{57oN=v z{H*%!M_`+3mY_p*ZxiQAQI{_?5QSiKYwKjKRZm-6TTSia{1Z_51C5G6trT8#q*jGt zHey%ZcP}{6b5$q4FIBY@Ww^@k@&~m` z;T83CYwQ$p-;pt!WRR-@hfSn_TCIclhjX6`oSJnyJ3FhYs<<827-?xephtvKJn5o1 zS17dj**{OM?CpK;uO02}?d9acT#p3U8flp6==Rh0EibJ@rjnA94h{}lS_CvW2euzK z+pO8}8FB=-3a?TDxqEX`<4kCzr@LM-MY;BGH7_BvWGRwd$wUV8MW;&UQouTPL_|bW z6O*Z_sq>4AOd+2oByhjOR#IZ(YMam9`OYxV)R!_IXcAE9E&B2!PVUe`TrL>C(3Y0_ zL;JVcp*_JJ+ zZ?Y){Z+S@2+uKV=N4K%D0W{f-8x(ZZ)YOD?sA!!yITzg4)&>T1aB^yBps_W!H#nq5 z^oCiD^Sp#05U9Tpt;5`!(Po6Sdf#A!VW%72Jv}|}gtj27^T0NUhmvv&u5<63_yXop zdkfj>5>&!$cW{@2b>B9oZp?!jS4e_g|c848CITCQM*%kS8JeK73)#(Ba}OiWB! zdE)rjqL~xG`(#ZJ)!ObKI ztW|=n#(%EDzZ0;xlLB9@9rKc!hQGow%QL>8$RuHTDx~+)xT(xNHwNDLCr2OGC+(t) zZQ0We0v&Cvr*9xk*-$g*#;fYXVFr*_2Ox75qvuryuk(KZ&OxS6yRCQ zk6CNs{_7m+`syrR*`#EdNT82t!z|E9gz};nN^ZhAtt82oG5>p^W+GXwZ}ueVc|PhT zAUGoiLi6L{58PM*3~<;Qjo_4+iB!;&ai!~Dvd#J1Rh7G^E@GQh$R$Kd4rIxx6MDiy zMx9Zr6g8}8H%IUv3r*nu6oRX|P$@jVWQXy7>F!}l9j**q1dyU)QEC_gynYi^CaX2@ z-%lc8LKMm2qI)q3YN9rCYKNB+4}Pawa;DKMJMdr>x+lg+tY6 zKf+6_LZLEmB*2z8q#|G#`}06FbcT~W{x0x&fNBy%v}nRK0V<P0?@Q*%; zCyD=`J}ih%8+`2#GS36Kg06~;GX$=x1OChKGa3=w`lK2@)2J28fMy~sQTThvejY=l zzz)}LLF?!w&Y;EVr-Bi;%g1qc`;j$|4YD-m$E>k0p8s~p*w}ExRrrF}p~6pSP)5%J zZxTc4Q=`K_?*4${x3qXi{o}$Uwps4~aAD}HFDpOf2fM<)4hi1! zQnjLrQ&40T%TjM(HJ=JhMkO`ERe2wspoNHNp@l7xll?+}?8&QQiWG;}or*S^b}_Fg9b0wd5nv zIN0BKWDJYCHtr5Q(FR#bBY0gF7j3q+a#l-P6Ay;L{ zT&6&H()Yd@?oK1OpULZt`oluP4$LKDnZ}=4U;=hG=^U2d8^AyG>L+CS!Bs4=s2zY> zERh)7k8L%6unEgQug!XQ)So$CZ91oTNYH7bnKZP2E>aW~pGa8k;A zepY=PH195KPjq`R7VWpjYf=Vd?CfMG4w9! zUdUy0F4}jc>UO0y2cN2rnxy8*yQqKRY6FL3_H#CO53;HAB1B`jrLP=?s3JbwRvzrW zb?+Vz^R6Cx(sO+?T=UPCpg4g|z4Z2sGBEtn{h;BamdGvUd+mKiE12YgwiT`9yN#GC z?wU-n$6K@^a=n262rq!gR#p)pl(nF8f>=8ItkiuSlXw_{iA2D!46EPlvt7MkBmJ zPT7a=adXtje4=V1i)cORNI_%Chq%08Kpvf|dxf({%94Q2d5j<)$w zoj>M7SUHEx6vbk(!d|vAD!P)vU;}7F@o-gm@q+edY$pAVs0>XImC}59D4RcK3Wh<{ zu>2%N*cKTWd3sMl5pU-QsTQ@3<{tl}rOL=`N-XyRy)X!BPtjf6&$X>_}tBCG>K!nnLrk@`USz+X$xN*QN09%xqu zzxN&UzYQ#xL?nAGH?_WRpM?;}LaJ2vnAO5(yM8lg!0~83_GtYu*KCPM_-UlDc0)vj z72~n>Tvv|$U^UL82O4j_W@O)#GGuZ0=>7ia^aevuSo;r~jpASKVw2cvE``{ITJBG; z;opt`l?sy?zKRR-tJzPgWUA$}Id>~ZdGr$BW+C12>f7B7<|^@NUy3RATeZ~Y{#L48 z9}Z=MC@!(P1g>il<@i>%W#|{|jkwR?^FmPHHy{6OP)mz5wYfq&xZD7K}WgV-@wi>6zR{q$(cTyJC} z+|w0GeCLj(BFRyi6oXXJMcyb?URt#fa<&GArdj9hY>-}5sd1-WY zyp_YsJv-%mkYAa86ZGdQBss&+75~kmFWtXtZ8rrWoL;*JWgO02(E zEt($NzZf+c33e!H0v3 zewH|RhQu`ue0O2)tMdDZHnAV{;cg3xQ9yd_(YY8arZmgkUNkBVJV^aD7u$~9LtR*Q z-M7Oz4fE#M0o(36_mO1)ykW?eWCcfB-0P~uL1SGVKHb#zcVEJ;CX6zISi%)8l4;9i z$1J5v-x3ZFlIG&o(PRKnlRoF>{3yd_s=QrY}^#lVJ8a{j!pu5}F?5RMee+AmA&6{dEl(q|Eav`Zb z?t&qm2jb5dx^UVhVSZV+YsXByXsO~bX4PFkP+kUp1)SH2udenhE=A4?8y)zy29+th zGi*v9u`CC?uP{mZTQ{yK$PlCVXc1Enly1dxGuyKi~j(qPwCLoEC`U46ZqVPj+bl z4yNC^+nVP=I>ABN#qp(D&F1*ECW-w*dg;=o=%mBt{px{a?}NLN?;krA?f_b^_jw=l z|AEF3DC0U}5Ohx3$CRQX{NAgo-$ALKr$Qv7td=fWm7p|QeLJ+enPGBGAR=nRbVu?h z2^auWx}VPdePp?J%6jfwo5$)Xv`pVTet2k%(ls20{eVET6woka0mD< zCwy{aH5NLq8SGsg8Av7Qim7`xF+dKX_lEnKZI6U+`jcROD`%aT-Q5bZTBrJ(s85)WIrpmas}wQlXOgZ)1omk(_k*k?|M8tx)xK7OcT-RV#c z=;wH%;$oVM^B9WE@JZkC6vBp(yyr4sS5EioIaMV~(?jh#un)R7O*tVD1CL`;qwuHI zzyPZ^

ITC@;z)yR2A-y)}b`v8+zc@5$=WI;C_{3ZzTJpq4bP51_rG*buZAm?n6R zoWqBkIN2|a3#4sKw#=)$$1pI32iWItoD;q~?KVf~6LpH0lb;+o&~6tPkWo}(F(FT8 zy8DHU3_rAqkPk$h$AEq#?YrgjI3^zNNTYRKWI%B^fH z&7!QP_%7(4I1;PYVE3-2ROX(Q2GAB~uKh2QueQq-%6$fE9LH3iz|erDTPXYl{Z>y=adzDaqumOxW_ z{wek7Fr!}1_aGxa4V&GOh=1mwFxNQc@P%QDpQ9c|D_e5Wm$)w? zlbV5Prr5LI6<}|W*BCS`zyI@LjO}AYMk*Z21#g5nr)z%cNu98!Awv#GX!R>vrWL{H z(iWIs+Y;U5DKn_zp`b6;3@KzldBG|_9xWu}T73u?l*-j4*(3V>;srCItc0j~ zi7Cr$C39sJmFv200l>3HjNDG;uTA!Emrrgneu8}7<`W!B3p^;L-x#vL0W^7rJpIda z-Txm9ODaW)!?$^;L2kt4LKY~0aN=jQA2*g#K`v~L(B!~qKxEA@z2;CLY(xT0oI6N= z&5wcz!$`AdH*rt;Mppc3(ta4|4DdnEnHpL_xj6LY8o3AWJm^RZ8DO2hrtij={H$#H zDc8O#m_@K9+Y@AfOIb%)*Ij9JNTFqfy_UroYVg_mL|VROAtJRQw0urb*na3STfSAg zBC--+77Y0Wo+uz|@EIXum!!t`3-^ZKJr>B)h#3Eq~EUZ08 z9-4n_d|vtaHp6z!jm2H95!N4C_PPVRM&h;6a+mbM1;s%{tz0IlDAMVuhmB%(rL7%N zdttP(5U~sdDWi8-n?}@mulUi8I=;yB9AOz%G$f7CR7H_J;5xRkGQBolzv;1D+=W?^ zk+so#B&KRTGB&wbw^ZWo-);>3v>Txq~6XEtpN`ff64y-0BT@ zup>k7ZQGv{3y`+4!qDOgZ@3|v`TRvCU#yx*iGn-8j zW8ChmeTS}#X-mL^Tv`_oVLPr5W8g?kmU?B7Nu?fr^;S%NU(8PkweHE~ye%3ZsEBR< z`a2XV8yJlxAEV?#_Al~60WlDeuhV88#`pg*O68sC77pl3y4|71H6P zDb2vpk<<)|`|GD-Vx@*nuJ6GF+bLGNgCz8xSUOvs6!EC{b@u>YYq6Ni{o7WZq@V3 z6Nx_!VVwzPla%+F)w~lSsqKwwo|vHMd&zf$7}%iwlI`GaTwz)ARZBNQmGzi)v#?oW zG&s>3Bl(*unz5mCQWUZg*6H+Q%S+BZ$6Bf-d#_{_hY$%M?;VZ3HwJj9{KfB~?*x{h zRf2>h@;0|S%d6D@Pq8)q(CKXi_+~tAa=mNt(aTEsH3(JFP@X#fa-kq@j z3tr{4vcnOv2oOmF9&D1y5_J8qU{kPh7K^v>QE?1Q@@*7|j7bSdTt(8<1H4Q{VT1Va z!)7c?#1;dRwyifmCf7P_-nvgDRz%>x(b_1=hwEu?NB+PH1EA7^#k+FDc_<3bCPH{G ztUvx%mbRm=fc3NYt-fm)8vr2eY!9kB?!$gHF#$K~GK)*{CcBi~CIHm!Fjw0O;Em$1 zYNOU;D%&I+e&(oD(3bDgRi|nuUYD+`wJ(nE0<t`!5tey%z~~ zENwai!Xl9ng7q<{wZqRxcT6Xvm1K1z?hzIS|5s;sf9^tea%zs=1r$`oS+Q&{>r3#CU%9mOa3M41RqxHID^K@FwVL#(<2`g{+ZU zOdJ^YAqtO9xq&(b4C^*0xYwR|oK=VZ86jl_@bYACBbCzKg?bF2OQ7mA2 zlMC0J3?UV+C(aEcV*u7TPCcMrp2_UO8xGLz8zl65i468dnkU^%m_4~Fz^vc{s%aCQvnTqeo#2I)H z`%yLBqZ#iJQOX2WecDb4dEG!L%_H-82 z{+-$Udcra_v6g3gl=dNG6a(X-W#?h=PFUBGsqwWRKIyIXFc62UEnG26#E#^t<5!rt zO_NHbRYfp3*pCtQ+!W)cmI@SRQSsMJ^Nw-(oU~k9^Q~z3)8+?6aj7;Bj|kmr-#4KVzEF2q`Rl`+62fcVL~YEOHt zjR_-zz|NasVkA1-j#wc*9PfwP*qJT73)V#_{HCA8QaB$xW5&L8Azb)B*7iBR&-os# zU=pLOwi<6M+ZgN~P8Xj(g%hBcjqAOJll-@c#7vdRx*TYIAM5o9STm7oIzohm_js=9jcWKI?M&XiCJ#sp96%Pr>X(cil*q8gBb zq5AX`Hb)02&6|gd8H;0k+z(>y{Y@>LZ^vyZTA++j69L*&F76P9>lNna^T69ZaNBlGez}Ryg>%qeQc?RbWE&$*bDalX{3eGY zxZ7m*J0zML40joQ2{xK2tmxaj5FiKxzK-`2VTRzW)G#M#DQVPT@r0~fy?u?tZY^~+ zUbJ`9X3n>Ts;xkTu{I-PY0bc>^~B9Ib{+PhPsoDX?P7ZZ3{s0Ih7L%Rf5rE z8gbn*{Y81Y7(0+eoV<#fPJO^A#5Om@Vk>-3J%wipq6$;9B2gQ-&TKD^TE2j7P++_u zE?{o8@p6H6h%s>aaKiBjURKGs%OiNd87UN4fy?DyO$!(e1>h6pm~44Gx8+Xt>D@Z^ z^jxN-3b`o(Fmlyx3v?ONPzs%c3iJG`J{uw1dVqfiAwZTuC4(v2Zay$-*_9?Y&6Ng% z=dPdA>fpD+Yc_bJQqoOL2U5@~-k&5XA-og5^_>PfE1??^UdC_vKo#-7awg(Q8nrww z4`s0gWRFpC5kdB6dh!fOxFC$V6hEL!es%8>KIVmEV1I{3`NGeg%hbw>ZJL|+kj6?K zk;WJe@~yg63$jSl14dK<9@IUbBA6Agc=9erLD(kN)h9W_4}{vK1;1VDgwPgTL;CxE z3Ep#3e|2qZXz*dTm4HJwCKTtUPs+Jf0Sx5mGS5^h1O}FjPRYmP4mUE2E1Sk zHbxa$6#WCU(Kzt%0-{upRua`woE9+a4jE;*J_3KXVd{2roGIDQ3F$M_zdKQT1`r`u z904l4cE0b0YLHaaR4}~nO5*%ZBaL#*weiB6v7HU zT21g5S3$$ArnmcXkpbLnnAh>y8%mdaul4{>AP|?;+OHg#9!0&^gY5~DF<-uKl*?&V zho`34m&6nMbPS-aDuZpg428LMn?r%}H3g&}ZdZ3UoPmrN1xp^4rO+yfiap3IpQFQ2U6-Pp)B zd}AjVW*B2Jd>V84@{U$wXd+ST)wr;yURa@U$w|*>r)+;1PZ_%b?6vuj5!-D^4eQ12 z=mP_~jftto-}{;rM^7}>a9ftPcnB&!ar?$h%HX%Pul>}a zSVgVfWJkfRghHW3oX%7`S3zOp_aeK;L9>2N?pY54u$MH;g`b+3WmJ35#erPZq z7zYYnThGV%+4-E@jh?`xR!sw@+e3d?G;5@tr4;!EE|+VcB3-^=+;^YYC7y7#-gVc( zRJu%9$P3h;F>QyGw)xN5=B@em?&^of#~#SZMO;-PFHJBDQW%|0&U&^HGnANj@V5Ic zkq-F+bC3e=>nATir~^3SiueqoaKjf@Jd2ZEnC z#-aB^s9uo*Z~>-RtE3n^8V4?3I9pK`zDY&>fNp{)8X_|t8p&EX#YXPyv7Lo^Pmm_{ z#+dml>N{zbb{=$ba)DiyF*xw8Bww4rOhLAg;L+?n=;D_uRmsXGms?cJKF=ipty5qH z!dqkCypSYca-^+vok8Ff4cyCkKt0R}T0r4I(%c{^?Xr5^A~X;r9yzN*I3p)C!xLxa z)3PvlC)CsA4d~_jGl0U7gCjyA{K4s~@f_l-%C5;$kKTkp*zf0nRFBok_5Iv{TE&k4 zqtO$~k5iYc3L^!BRFdt|nlRR*TJ@|})<;8{+3+_xha~x&cMz@rm3S|is88)<5O3Gt z=5&G%ZcN(=OSwO79bnr5hglr&5-2Lmm`{)zQXrDu62%N1Fq z(>7aUY;}+OCGpXv%Z;Xrs;QLtvsn2{0`-2ADhSD@%M@`V zAPd{H``8q-0F!95iSfhNygyZs-+~@Kn`s~PTlDLYcj3LJAPoG7C~(suO^c(5cUV1Z zAly$M53TvK`}N&MfQ(c^j==!fz57D1G`!H_tFqNctCs_VZfbn!R!bqChI-qg8nFmz zQr02fb|{_`x{lwJjn(xC!G)ifr^Vs++)#Grm23Pm34hC)s{A6&F=I*PGz|}33oS9X zx?cUM5c{)Hi4X-o*+Nf{c6ux-zCNM|J@F&8z1FkgNQtz}5e&S;fdu**iv@dEQCN+f zf1i|Zk!BVW#(pw5;C@F}Y$v0$EBqn6A^9eksglOt~-N>qf zm>5*VUbAS5hE-lJXSlnN(c;ePkhN~X+-bC1FAl2!dG~$bfBK!zCG5`l9*jXL%%Yta z8uMiX^)|9kc-yX81s$JUB9W$*M#@?{wx6m?9LG+~?n}5`EG|*8;)UxDenA?-94^J{ z0;lN8u=n+qV+f3g5M zf$j2O%#-|CU-1uyO1S%NnjNN7)&jMo%A4s@SPt^d{0aZqpS#q`q(NV(GFFv{nU%2p zwK%qMZKJ5SiJe-tJoGhCgSXu@6QO`e^0X&mgn;WI-)&Sb_IcOYKHfc{^YRwq6Lx~+ zC6+D(vJE*fN3F))GoLfHtV`3f|5Xa}jYQ!Xfc|I_O8`{;20sn1Pf+io{RE+drMa03 z^>-edQRM3mo(`#_6M>|ZF^a95M9a_NzBh|4hMW8c1O>)${4%@?^mNQ zgKz@N7b$QbVMT|a)1K4rB7Xc#&@J=uFsIr5{@26Wu&HhJImM!z%F333VdT4|pq-?A9w2x)Fa+?44^d)4}HuA-b)*zTXxZa5W zp(h>@=auH&_2oXLjJ1%U-min{+4fPxnp`PcgWwTP%1>izRs$Hxg3)1~5=%so6Hk4G zw=3Quxoh*z?1(?U)97`(XOI>rui<+3xVoo5-mdqUdtIJrBH8t%Zy>P%{G=7;;-H2B zCl_P|dRfOR2SsqJ&2^_+@_(HJkW(6=ML{cGr|AH^3vXlZ8YMx4-{bNkJhwp_^)x07 zyk3_r2~GYTD3Z(r+OtXr^Xf3m=LemtzVb>qCSqhE^uriilD zRY!b#$FFIdq%Q>dm@mO&c9O<-=l3!9wkMo4y(UDr<1t#qSx|8Lwi1TH zyF|x!$b%~qWcRcelk5KryH4#_%-uZ8u0wHb4ePRHIqAd0LB{AkAi9?V;z?|aw&3e^ zw0ymFV!CJXhFGgKXCA%i;t7N8ssElS(&XKGpx=Wgv;MaWI%Br;lXz9}-xBSdnttMO z$4b2B6{JJwN;($-51yrF%T^G@mLf^Gg6-j3185AaQL+W4P|ch${#TV?467BOVy$Ya zPAzT0WmN0Qz2t$*BrL>H9FXaxYBpV^04%6`R|tb2=z0d&`SFU;lDP2$sB^D1El8I5 zAI+XTg7QrXl4+|Qx%rfCF%&K6_SU7+-RiV0&#+}oTUk;$HpXy=*|fMaQgGxBcspw^R-p_NyA?)-3iz9 zSBLT;)VQ2~CMyxF<@z$5w`ixNq-RQy80MMo6p+$bALM;_;E^S%Z@XhGWW-}Ws>Yfo zn2CF&nNXh$lun0?+=XqrSN_{I>c4hAx?6M$kAdM(8ccTFuq==^@8&^q*^n2f?Qtq!&1Eb z^kj@*kJYbQBrx~oeER32kxIm(W!!|fFYA1Lc8Pev1fSy+jzdSKfPDW`Avm$-z|tMv zn)GRD*`};U#yV~0<|K5Y##PO_FumNcb#TMd(S96Om>`|G%9|Pa?pr;}8lRL%6AYby zf%crZ%=OoZ=r`!SWYMvb>TT>)S*|vl6+poecNZG-6+d&_)MPr|*6BXcwG!@H)|de7 z(rO$g3D4;I{BBGh`*dA{NE_FD<-*5FpG&*M-e}|u{i|{0_(Jvn*Er4)fC;MiKT}rw z)i1fr0Aszb@b`4K-oHl^+&U^8$TvlUka!X{u~?*jSMwvn`9rOifo$oQS$$j7f?tCU zIcs`&*qgyL=Q5CIK+j0b&7LJ)l9f>P$6XFYLWkT$Q^89xYv47OivKMyDX~!96)k(u zCnK;X#;T(Qt*T2wXSy6rF}>YO8s$k%7I;1Fm*$an{V-Ux8K4ip0+^ev05nlKv0JPM zF#eye&O9FKE&l)3>_nu+Ze+Xm?7JvST`Cb{85f~zZDec>vL##gN*K!|Ta+}mL6(Nl zDB0I6S?A6eOeWj+(C_#7e(ybh`NQMmbKdXwdA;A~bH*{gHl%ixbX|tw-CX!zV~4Lotyd<(XI;~ zc(;`|YKyBWUC^DpF^mTunm><-k@!V;l#iPx?4*X+T+_*&FyhXie6jOb&R0O-a51q= z*5cBWdkbaT8ZKHs^?8Jr)7eX=gr3FcVRf$j+2kT{l)Gd|pfTicEJL~1;wzkvi2E;CGP7<{>qdk=G5E5q@ptO$}DwinpjfdMj*cyf&VzRbr34QVK%7~lIDjO@``zzpk zG(k5`U>NBL$?PzdSh7857xXgQ=EEC}GnA*dW|*0o_j~y>B3RyIe6=*;lfbzT$e&8* z?Bj1NVI{4mvh9^(8@ha=WvdA@mziF`pA5z}%2};5S5MPrP8QiATuDC)cmsP8Hg={& z2S5FWuCSb=szrC=&}aC|Hs*!ewANqucb8vQlyc$fHM$yw5_A!~EptIz<+~eCH|5jP z(oph&tX#r+l~q+;BJqW<@tz8bivDkiOGhfBHa=MP|NE;^>c!Xt-%|TsGj^u<&wVV{ z<+R9OJi?aN#Q7MEl$4fm z>b>yrJz#0@JD)y%Qf#inU=BA64%g|&=^ZXWARsK{DEmo3eN>c{0XQ+4^Ul`6;l+P@ z+HZ>yVzoHTCs;BP+pP;i({A>%sIlz~LxuA+T}ti0;qJUcAWM%d5k=9_)!pCQYYTxj z)z@nb@Ws9U_U+qwb>9*+dI|&|g)p(q3A`?(8@jc%ax;(>Kt4vLu)E{)wHIDp_4Hg8 zE5ILh?yIQOHa0e*(P+R~0|20;1R^0}@-G0O=7c&yQ?Ks8rk=VxV^d-CV@Jz;CH`Ke zhdm3|=Kg*zW7mg!$jy4mcZh>M>g+5GH9b^e8-<{0T3=sp2DrlB-tJE#J(-n_Eio}s zRz@Z=^vr}}yUPoeZH@8a;W(eH>})zMaWOILsZ-A;v*7pc6kkTM+n@gjA^A1cl)&84=#Z&Y$Z;~o9<&A`9!wA4>$P4tm~ySTVg zlam>33&;5R_*}N=CT;=d;npo(783}BQGxQb z{CpvPe#}6a1`uNXU=r%(%Q)wZEyGMTRn^Zal7)hJ(;X~LBO#fi$#zX8^C2`n9 z+*ep$-w%IFPyEb`zKo2Fk`lMLjhB~n+dlxr5Rqed?SE)*Z%-5A<%enALGupj}r?k0Q7giqF0nVVa^@k84;nA*pb(c^Yb<@cFK2KuFu@s%t?;$e8`6kF=4V&f_R z8~O2$aUxA_7=`Wi5CjW&X9edLhG|2v@WX8ioHr9Za*V~&OiQBVi*!4{#Ok2Bm;m(x zyRn7ln5GW_q1Y+BqUoPoEnmw0Dy0O8ivnlQo)s1@c=pWh`t=P!GEvXVk~8%R`r;^M%x z{qwsKtO-k5$FKiE^!WAHvYbx{z+jSnU*9~_oG566-ye1@C)|l#BB%J&!vi6Lue>=g3qOwp^pJ`E;mG zMGd8u5~z$1NS|kC3Y_o!*qV%3{FGH+Uk{}2BM#@>iqr*@Q&LirmS#DVBPOM)x*dml z_wHS8y6;ru{iV-&Nl8hQlauivwusT33tuWg1#7B>4zV_%K2;-_x1Qa>hnL_C?0S*?HmP<1q zdqKGN^w2ggE-lTpMzo?(vr#A`!`TKg!>)95b90bSt(}~lZr$2mA5%#Qt&Z_~nOOSd z*xrWVZ+E175(iM*7Kabye9u3B!T)AVo16G!Qv1$*YUQQKoTln(g;qYcW;PCvERS`0 z=N9(&O`+Q|qkt+*h!#AgwkIXArv%Pwa>8L6{?Ibi+qcRnC|ZPOavqmj!KfQTUMPcD z30jMny?;*uDPVhh``TChJV}z$dDHZFq@4zl1`2DfQn}dy6xo6})$cKKQRrEhB&poH zbV;g?^W9DRHa^bU9X&oV!Ln_7w9;-I3FrwfLQl-ky;+P% zGi&b3vn%ROK>-WFOGF~Rppgya;-n;oiLQ?yov@*N-Z|;%?PLE;W5Wd2k4hE2@NUUf zkSHTTd_*lcH3xqVvm~HRa5NmsG5K$_O4v)j(fRrgJKACqkHjcTsDzB=Vg`aSDcaI_n=>)fVtZR${ zdzOH#ei+X9>d(tsoN(nH>6PT#bNsu?`H&P}-OS+j<7tUWABhirDkYGGIJ_})3m#lp zSQyz1kY6AoAaK`4s!K~sCL8asf%F65RORoW=3{tBT$8xN02KGRn%{9PsEprG;6JWNnO9A(yqPc4~mnJbE*0< zk~3&*5W)V&jT`p%<9Q&xPc`M_=0dHk+LlN%va*K3ppvNo;}|E-^dK$>OAWefbI(8$ zaK~B(NtXu1ip4}psW%s*bJ5v7*) zlzV&dYW~rJ__q2s(RDV2Yc{X7RlikVHsXZk&ueU0crYj{K&|BG=}Gf_1LIE3xt4h< zSZs!cCzbbDAtAls)2K_-9W5;_Q27DX25Q2f))=yR2RIgN)E0Ylioqx<5)%_^@93bt z_2s~6M90!;TO)wDK&1KbS1FoLt<`#B|AuQvi$$f9RKJUsgWpehG{G2qLY1r|Vj9wQ zF1Nt&J~{}#nNrmX_l74W-mF~XMtayB)Y+vV$f>tU)dIaSh_zuks^fTjd;8qn91t13 zWSn#DKv<5AN$^~u=uvDYxNRJ%X&cAwQY;qR&_Erl^?->R@K{L$*7tLsc4X<%UIT0w zE?jVGMG9ImvL+=bXBjFgE0Z6hYHAb>Zkw7id$JpM7d{!=*AQ4jUZwD1ifi^f9uY%e z0+O1blwy`Z38Vx{owbhVaDk6Xsr3`_MS6QG!F%d%R1eaQqy4&(yZa(2CwE4OJJ5IK znmX;;$2xx^?hz#v;?G6%h+de)+-K|P=m-+;@|R*T8DKjrYa|ls>no3vQBhIR)y<0* zfyn~LXliN#^jTCiYJL`MP-xw3Upvq~>td!u8|E<3j=OE}wq!0XD8}RbYSA$Z}>K4ct_V%m{;X5Qz7+ZH1_%=5Srf!eC8Dq0Kcw&PsAdfaDNazJxCr86Kvi1v`pg3q7YqY~9@@ zq-rWF*-zSlkb}IcsX6IyBf@OVY!lrUJFCV_gFDM(_6Mhrqgfxs><=S4ZTWx<)&$k#^pSA!5ja%=!NXn2me37E`RXr7 w_MgYPoKRv3(6-}HGo`ot-ydxw_O}n|W%>?M%1>oQ(|}=S@~81@BiO_L0V!{l<^TWy literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 36b2d3b..7346ede 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,15 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. -ETSI Catalog Project ------------------------------------------------- +Etsicatalog Project +------------------- .. toctree:: - :maxdepth: 1 + :maxdepth: 2 introduction - release-notes.rst + architecture + installation + offeredapis + consumedapis + administration + humaninterfaces + release-notes diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..6006353 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,69 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Installation +============ + +This document describes local build and installation for development purpose. + +Pre-requisites +-------------- + +* Python3 & pip +* MariaDB + +Build & Run +----------- + +**Clone repository**: +:: + + $ git clone https://gerrit.onap.org/r/modeling/etsicatalog + $ cd etsicatalog + +**Create database**:: + + $ cd /resources/dbscripts/mysql + +Run modeling-etsicatalog-createdb.sql to create database. + +Run commands followed to init database:: + + $ python manage.py makemigrations + $ python manage.py makemigrations database + $ python manage.py migrate + $ python manage.py migrate database + +Review and edit \catalog\pub\config\config.py + +MySQL default configuration is as follows:: + + DB_IP = "127.0.0.1" + DB_PORT = 3306 + DB_NAME = "etsicatalog" + DB_USER = "etsicatalog" + DB_PASSWD = "etsicatalog" + +**Start server**:: + + $ python manage.py runserver 8806 + + + +Test +---- + +**Run Healthcheck**:: + + GET /api/catalog/v1/health_check + +You should get:: + + { + "status": "active" + } + +**View API document**: + +http://127.0.0.1:8806/api/catalog/v1/swagger + diff --git a/docs/introduction.rst b/docs/introduction.rst index d7336d7..d83cc76 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -2,8 +2,8 @@ .. http://creativecommons.org/licenses/by/4.0 -etsicatalog Introduction -================================= +Etsicatalog Introduction +========================= -The ETSI Catalog project provides a runtime catalog service which can be consumed by other projects or components, such as UUI, VF-C, etc. -The catalog can be used to store packages distributed by the SDC, and also include a TOSCA parser service. +The Etsicatalog project provides a runtime catalog service which can be consumed by other projects or components, such as UUI, VF-C, etc. +The catalog can be used to store packages distributed by the SDC, and also includes a TOSCA parser service. diff --git a/docs/offeredapis.rst b/docs/offeredapis.rst new file mode 100644 index 0000000..953f85e --- /dev/null +++ b/docs/offeredapis.rst @@ -0,0 +1,155 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============ +Offered APIs +============ +Etsicatalog provides the followed APIs: + +- **NS package management interface** + + Provides runtime NS package management interface + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/nsd/v1/ns_descriptors + - POST + - Create a new NS descriptor resource. + * - /api/nsd/v1/ns_descriptors + - GET + - Query information about multiple NS descriptor resources. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}} + - GET + - Read information about an individual NS descriptor resource. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}}/nsd_content + - PUT + - Upload the content of a NSD. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}}/nsd_content + - GET + - Fetch the content of a NSD. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}} + - DELETE + - Delete an individual NS descriptor resource. + * - /api/nsd/v1/pnf_descriptors + - POST + - Create a new PNF descriptor resource. + * - /api/nsd/v1/pnf_descriptors + - GET + - Query information about multiple PNF descriptor resources. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}} + - GET + - Read an individual PNFD resource. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}}/pnfd_content + - PUT + - Upload the content of a PNFD. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}}/pnfd_content + - GET + - Fetch the content of a PNFD. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}} + - DELETE + - Delete an individual PNF descriptor resource. + +- **VNF package management interface** + + Provides runtime VNF package management interface + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/vnfpkgm/v1/vnf_packages + - POST + - Create a new individual VNF package resource + * - /api/vnfpkgm/v1/vnf_packages + - GET + - Query VNF packages information + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}} + - GET + - Read information about an individual VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content + - PUT + - Upload a VNF package by providing the content of the VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content/upload_from_uri + - PUT + - Upload a VNF package by providing the address information of the VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content + - GET + - Fetch an on-boarded VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/vnfd + - GET + - Read VNFD of an on-boarded VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/artifacts/{{artifactPath}} + - GET + - Fetch individual VNF package artifact + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}} + - DELETE + - Delete an individual VNF package + * - /api/vnfpkgm/v1/subscriptions + - POST + - Subscribe to notifications related to on-boarding and/or changes of VNF packages + * - /api/vnfpkgm/v1/subscriptions + - GET + - Query multiple subscriptions + * - /api/vnfpkgm/v1/subscriptions/{{subscriptionId}} + - GET + - Read an individual subscription resource + * - /api/vnfpkgm/v1/subscriptions/{{subscriptionId}} + - DELETE + - Terminate a subscription + +- **Catalog interface** + + Provides APIs to query/fetch package from SDC catalog + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/catalog/v1/nspackages + - POST + - Fetch NS package from SDC catalog + * - /api/catalog/v1/vnfpackages + - POST + - Fetch NVF package from SDC catalog + * - /api/catalog/v1/service_packages + - POST + - Fetch Service package from SDC catalog + +- **Parser interface** + + Provide APIs to parser VNF/PNF/NS/Service package + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/parser/v1/parserpnfd + - POST + - Parse PNF package + * - /api/parser/v1/parservnfd + - POST + - Parse VNF package + * - /api/parser/v1/parsernsd + - POST + - Parse NS package + * - /api/parser/v1/parser + - POST + - Parse package + +You can download the following API yaml file and paste the content into the swagger tool: https://editor.swagger.io to view more detail of APIs. + +:download:`etsicatalog_API_v1.yaml ` diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 2d6254f..8187b8c 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -3,8 +3,8 @@ .. http://creativecommons.org/licenses/by/4.0 -etsicatalog Release Notes -========================= +Release Notes +============== etsicatalog provides package management service and parser service as Micro Service. @@ -34,7 +34,7 @@ None **Security Issues** -- ` El Alto Vulnerability Report `_ +- `El Alto Vulnerability Report `_ **Upgrade Notes** diff --git a/docs/swagger/etsicatalog_API_v1.yaml b/docs/swagger/etsicatalog_API_v1.yaml new file mode 100644 index 0000000..fde0af7 --- /dev/null +++ b/docs/swagger/etsicatalog_API_v1.yaml @@ -0,0 +1,2716 @@ +swagger: '2.0' +info: + title: Modeling etsicatalog API + description: "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\n\ + The `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML\ + \ document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON\ + \ document can be found [here](/api/catalog/v1/swagger.json)." + version: v1 +host: 127.0.0.1:8806 +schemes: + - http +basePath: / +consumes: + - application/json +produces: + - application/json +securityDefinitions: + Basic: + type: basic +security: + - Basic: [] +paths: + /api/catalog/v1/nspackages: + get: + operationId: api_catalog_v1_nspackages_list + description: Query NS packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsPackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_nspackages_create + description: On distribute NS package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NsPackageDistributeRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/NsPackageDistributeResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/nspackages/{csarId}: + get: + operationId: api_catalog_v1_nspackages_read + description: Query one NS package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsPackage' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_nspackages_delete + description: Delete one NS package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsPackageDistributeResponse' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/catalog/v1/service_packages: + get: + operationId: api_catalog_v1_service_packages_list + description: Query Service packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/ServicePackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_service_packages_create + description: On distribute Service package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ServicePackageDistributeRequest' + responses: + '202': + description: '' + '400': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/service_packages/{csarId}: + get: + operationId: api_catalog_v1_service_packages_read + description: Query one Service package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ServicePackage' + '404': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_service_packages_delete + description: Delete one Service package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '204': + description: '' + '404': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/catalog/v1/vnfpackages: + get: + operationId: api_catalog_v1_vnfpackages_list + description: Query Nf packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NfPackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_vnfpackages_create + description: On distribute Nf package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NfPackageDistributeRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/vnfpackages/{csarId}: + get: + operationId: api_catalog_v1_vnfpackages_read + description: Query one Nf package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NfPackage' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_vnfpackages_delete + description: Delete one Nf package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponse' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/nsd/v1/health_check: + get: + operationId: api_nsd_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/nsd/v1/ns_descriptors: + get: + operationId: api_nsd_v1_ns_descriptors_list + description: Query multiple NSDs + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsdInfo' + '500': + description: Internal error + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_ns_descriptors_create + description: Create a NSD + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreateNsdInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/NsdInfo' + '500': + description: Internal error + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/ns_descriptors/{nsdInfoId}: + get: + operationId: api_nsd_v1_ns_descriptors_read + description: Query a NSD + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsdInfo' + '404': + description: NSDs do not exist + '500': + description: Internal error + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_ns_descriptors_delete + description: Delete a NSD + parameters: [] + responses: + '204': + description: No content + '500': + description: Internal error + tags: + - NSD Management interface + parameters: + - name: nsdInfoId + in: path + required: true + type: string + /api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content: + get: + operationId: api_nsd_v1_ns_descriptors_nsd_content_list + description: Download NSD content + parameters: [] + responses: + '204': + description: No content + '404': + description: NSD does not exist. + '500': + description: Internal error + tags: + - NSD Management interface + put: + operationId: api_nsd_v1_ns_descriptors_nsd_content_update + description: Upload NSD content + parameters: [] + responses: + '204': + description: PNFD file + '500': + description: Internal error + tags: + - NSD Management interface + parameters: + - name: nsdInfoId + in: path + required: true + type: string + /api/nsd/v1/pnf_descriptors: + get: + operationId: api_nsd_v1_pnf_descriptors_list + description: Query multiple PNFDs + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/PnfdInfo' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_pnf_descriptors_create + description: Create a PNFD + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreatePnfdInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/PnfdInfo' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/pnf_descriptors/{pnfdInfoId}: + get: + operationId: api_nsd_v1_pnf_descriptors_read + description: Query a PNFD + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PnfdInfo' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_pnf_descriptors_delete + description: Delete a PNFD + parameters: [] + responses: + '204': + description: No content + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: pnfdInfoId + in: path + required: true + type: string + /api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content: + get: + operationId: Fetch PNFD content + description: Fetch PNFD content + parameters: [] + responses: + '200': + description: PNFD file + schema: + type: string + format: binary + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + produces: + - application/octet-stream + - application/json + tags: + - NSD Management interface + put: + operationId: api_nsd_v1_pnf_descriptors_pnfd_content_update + description: Upload PNFD content + parameters: [] + responses: + '204': + description: No content + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: pnfdInfoId + in: path + required: true + type: string + /api/nsd/v1/subscriptions: + get: + operationId: api_nsd_v1_subscriptions_list + description: Query subscriptions for Nsd Management + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsdmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_subscriptions_create + description: Create Subscription for NSD Management + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NsdmSubscriptionRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/NsdmSubscription' + '303': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/subscriptions/{subscriptionId}: + get: + operationId: api_nsd_v1_subscriptions_read + description: Query subscriptions for Nsd Management + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsdmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_subscriptions_delete + description: Delete subscription for Nsd Management + parameters: [] + responses: + '204': + description: No_Content + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: subscriptionId + in: path + required: true + type: string + /api/vnfpkgm/v1/health_check: + get: + operationId: api_vnfpkgm_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/vnfpkgm/v1/subscriptions: + get: + operationId: api_vnfpkgm_v1_subscriptions_list + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + post: + operationId: api_vnfpkgm_v1_subscriptions_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/PkgmSubscriptionRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + parameters: [] + /api/vnfpkgm/v1/subscriptions/{subscriptionId}: + get: + operationId: api_vnfpkgm_v1_subscriptions_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + delete: + operationId: api_vnfpkgm_v1_subscriptions_delete + description: '' + parameters: [] + responses: + '204': + description: '' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + parameters: + - name: subscriptionId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages: + get: + operationId: api_vnfpkgm_v1_vnf_packages_list + description: Query multiple VNF package resource + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/VnfPkgInfo' + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + post: + operationId: api_vnfpkgm_v1_vnf_packages_create + description: Create an individual VNF package resource + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreateVnfPkgInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/VnfPkgInfo' + '400': + description: Bad Request + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: [] + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}: + get: + operationId: api_vnfpkgm_v1_vnf_packages_read + description: Query an individual VNF package resource + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/VnfPkgInfo' + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + delete: + operationId: api_vnfpkgm_v1_vnf_packages_delete + description: Delete an individual VNF package resource + parameters: [] + responses: + '204': + description: No content + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}: + get: + operationId: api_vnfpkgm_v1_vnf_packages_artifacts_read + description: '' + parameters: [] + responses: + '200': + description: Return the artifact file + schema: + type: string + format: binary + '404': + description: Artifact not found + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + parameters: + - name: artifactPath + in: path + required: true + type: string + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content: + get: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_list + description: Fetch VNF package content + parameters: [] + responses: + '200': + description: VNF package file + schema: + type: string + format: binary + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + put: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_update + description: Upload VNF package content + parameters: [] + responses: + '202': + description: Successfully + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri: + post: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create + description: Upload VNF package content from uri + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/UploadVnfPackageFromUriRequest' + responses: + '202': + description: Successfully + '400': + description: Bad Request + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd: + get: + operationId: VNFD of an on-boarded VNF package + description: Read VNFD of an on-boarded VNF package + parameters: [] + responses: + '200': + description: VNFD of an on-boarded VNF package + schema: + type: string + format: binary + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/parser/v1/health_check: + get: + operationId: api_parser_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/parser/v1/parser: + post: + operationId: api_parser_v1_parser_create + description: Parse model(NS, Service, VNF, PNF) + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parsernsd: + post: + operationId: api_parser_v1_parsernsd_create + description: Parse NS model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parserpnfd: + post: + operationId: api_parser_v1_parserpnfd_create + description: Parse PNF model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parservnfd: + post: + operationId: api_parser_v1_parservnfd_create + description: Parse NF model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/catalog/v1/callback_sample: + get: + operationId: api_catalog_v1_callback_sample_list + description: Callback Sample. + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + parameters: [] + /api/catalog/v1/health_check: + get: + operationId: api_catalog_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/catalog/v1/jobs/{job_id}: + get: + operationId: api_catalog_v1_jobs_read + description: Get job status + parameters: + - name: job_id + in: query + description: job id + type: string + - name: responseId + in: query + description: response id + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/GetJobResponse' + '500': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_jobs_create + description: Update job status + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/PostJobRequest' + - name: job_id + in: query + description: job id + type: string + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + '500': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + tags: + - Catalog interface + parameters: + - name: job_id + in: path + required: true + type: string + /api/catalog/v1/mandb/{modelName}: + get: + operationId: api_catalog_v1_mandb_read + description: '' + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + delete: + operationId: api_catalog_v1_mandb_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - Sample interface + parameters: + - name: modelName + in: path + required: true + type: string + /samples/: + get: + operationId: samples_list + description: List all samples. + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + parameters: [] +definitions: + NOTIFICATION_LINKSERIALIZER: + title: Vnfpackage + description: Link to the resource representing the VNF package to which the notified + change applies. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource. + type: string + minLength: 1 + PkgmLinks: + title: ' links' + description: Links to resources related to this resource. + type: object + properties: + vnfPackage: + $ref: '#/definitions/NOTIFICATION_LINKSERIALIZER' + subscription: + $ref: '#/definitions/NOTIFICATION_LINKSERIALIZER' + PkgChangeNotification: + required: + - id + - notificationType + - timeStamp + - subscriptionId + - vnfPkgId + - changeType + - vnfdId + - _links + type: object + properties: + id: + title: Id + description: Identifier of this notification. + type: string + minLength: 1 + notificationType: + title: Notificationtype + description: Discriminator for the different notification types. + type: string + enum: + - VnfPackageChangeNotification + timeStamp: + title: Timestamp + description: Date-time of the generation of the notification. + type: string + format: date-time + subscriptionId: + title: Subscriptionid + description: Identifier of the subscription that this notification relates + to. + type: string + minLength: 1 + vnfPkgId: + title: Vnfpkgid + description: Identifier of the VNF package. + type: string + format: uuid + changeType: + title: Changetype + description: The type of change of the VNF package. + type: string + enum: + - OP_STATE_CHANGE + - PKG_DELETE + operationalState: + title: Operationalstate + description: New operational state of the VNF package. + type: string + enum: + - ENABLED + - DISABLED + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + minLength: 1 + _links: + $ref: '#/definitions/PkgmLinks' + PkgOnboardingNotification: + required: + - id + - notificationType + - subscriptionId + - timeStamp + - vnfPkgId + - vnfdId + - _links + type: object + properties: + id: + title: Id + description: Identifier of this notification. + type: string + minLength: 1 + notificationType: + title: Notificationtype + description: Discriminator for the different notification types. + type: string + enum: + - VnfPackageOnboardingNotification + subscriptionId: + title: Subscriptionid + description: Identifier of the subscription that this notification relates + to. + type: string + minLength: 1 + timeStamp: + title: Timestamp + description: Date-time of the generation of the notification. + type: string + format: date-time + vnfPkgId: + title: Vnfpkgid + description: Identifier of the VNF package. + type: string + format: uuid + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + format: uuid + _links: + $ref: '#/definitions/PkgmLinks' + JobResponseHistoryList: + description: Response History List + type: object + properties: + status: + title: Status + description: Status + type: string + minLength: 1 + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: Status Description + type: string + minLength: 1 + errorCode: + title: Errorcode + description: Error Code + type: string + minLength: 1 + x-nullable: true + responseId: + title: Responseid + description: Response Id + type: string + minLength: 1 + JobResponseDescriptor: + title: Responsedescriptor + description: Job Response Descriptor + type: object + properties: + status: + title: Status + description: Status + type: string + minLength: 1 + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: Status Description + type: string + minLength: 1 + errorCode: + title: Errorcode + description: Error Code + type: string + minLength: 1 + x-nullable: true + responseId: + title: Responseid + description: Response Id + type: string + minLength: 1 + responseHistoryList: + description: Response History List + type: array + items: + $ref: '#/definitions/JobResponseHistoryList' + GetJobResponse: + type: object + properties: + jobId: + title: Jobid + description: Job Id + type: string + minLength: 1 + responseDescriptor: + $ref: '#/definitions/JobResponseDescriptor' + PostJobResponseResult: + required: + - result + type: object + properties: + result: + title: Result + description: Result + type: string + minLength: 1 + msg: + title: Msg + description: Message + type: string + minLength: 1 + PostJobRequest: + type: object + properties: + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + desc: + title: Desc + description: Description + type: string + minLength: 1 + errcode: + title: Errcode + description: Error Code + type: string + minLength: 1 + NsPackageInfo: + title: Packageinfo + description: NS Package Info + type: object + properties: + nsdId: + title: Nsdid + description: NSD ID + type: string + minLength: 1 + x-nullable: true + nsPackageId: + title: Nspackageid + description: NS Package ID + type: string + x-nullable: true + nsdProvider: + title: Nsdprovider + description: NSD Provider + type: string + x-nullable: true + nsdVersion: + title: Nsdversion + description: NSD Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR name + type: string + x-nullable: true + nsdModel: + title: Nsdmodel + description: NSD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download NSD Model + type: string + minLength: 1 + x-nullable: true + x-nullable: true + NsPackage: + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + x-nullable: true + packageInfo: + $ref: '#/definitions/NsPackageInfo' + InternalErrorRequest: + required: + - error + type: object + properties: + error: + title: Error + description: Error + type: string + minLength: 1 + errorMessage: + title: Errormessage + description: Error Message + type: string + minLength: 1 + NsPackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: csarId + type: string + minLength: 1 + NsPackageDistributeResponse: + required: + - status + - statusDescription + - errorCode + type: object + properties: + status: + title: Status + description: status + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: statusDescription + type: string + minLength: 1 + errorCode: + title: Errorcode + description: errorCode + type: string + minLength: 1 + ServicePackageInfo: + title: Packageinfo + description: Service Package Info + type: object + properties: + servicedId: + title: Servicedid + description: ServiceD ID + type: string + minLength: 1 + x-nullable: true + servicePackageId: + title: Servicepackageid + description: Service Package ID + type: string + x-nullable: true + servicedProvider: + title: Servicedprovider + description: ServiceD Provider + type: string + x-nullable: true + servicedVersion: + title: Servicedversion + description: ServiceD Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR name + type: string + x-nullable: true + servicedModel: + title: Servicedmodel + description: ServiceD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download ServiceD Model + type: string + minLength: 1 + x-nullable: true + x-nullable: true + ServicePackage: + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + x-nullable: true + packageInfo: + $ref: '#/definitions/ServicePackageInfo' + ServicePackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: csarId + type: string + minLength: 1 + NfPackageInfo: + title: Packageinfo + description: VNF Package Info + required: + - vnfPackageId + type: object + properties: + vnfdId: + title: Vnfdid + description: VNFD ID + type: string + x-nullable: true + vnfPackageId: + title: Vnfpackageid + description: VNF Package ID + type: string + minLength: 1 + vnfdProvider: + title: Vnfdprovider + description: VNFD Provider + type: string + x-nullable: true + vnfdVersion: + title: Vnfdversion + description: VNFD Version + type: string + x-nullable: true + vnfVersion: + title: Vnfversion + description: VNF Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR Name + type: string + x-nullable: true + vnfdModel: + title: Vnfdmodel + description: VNFD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download VNFD Model + type: string + x-nullable: true + NfImageInfo: + description: Image Info + required: + - index + - fileName + - imageId + - vimId + - vimUser + - tenant + - status + type: object + properties: + index: + title: Index + description: Index of VNF Image + type: string + minLength: 1 + fileName: + title: Filename + description: Image file name + type: string + minLength: 1 + imageId: + title: Imageid + description: Image ID + type: string + minLength: 1 + vimId: + title: Vimid + description: VIM ID + type: string + minLength: 1 + vimUser: + title: Vimuser + description: User of VIM + type: string + minLength: 1 + tenant: + title: Tenant + description: Tenant + type: string + minLength: 1 + status: + title: Status + description: Status + type: string + minLength: 1 + NfPackage: + required: + - csarId + - packageInfo + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + packageInfo: + $ref: '#/definitions/NfPackageInfo' + imageInfo: + description: Image Info + type: array + items: + $ref: '#/definitions/NfImageInfo' + x-nullable: true + NfPackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + vimIds: + description: A string for vimIds + type: array + items: + type: string + minLength: 1 + labVimId: + title: Labvimid + description: A list of VIM IDs. + type: string + PostJobResponse: + required: + - jobId + type: object + properties: + jobId: + title: Jobid + description: jobId + type: string + minLength: 1 + ProblemDetails: + title: Onboardingfailuredetails + description: Failure details of current onboarding procedure.It shall be present + when the nsdOnboardingState attribute is CREATED and the uploading or processing + fails in NFVO. + required: + - title + - detail + type: object + properties: + type: + title: Type + description: A URI reference according to IETF RFC 3986 [10] that identifies + the problem type. It is encouraged that the URI provides human-readable + documentation for the problem (e.g. using HTML) when dereferenced. When + this member is not present, its value is assumed to be "about:blank". + type: string + x-nullable: true + title: + title: Title + description: The HTTP status code for this occurrence of the problem. + type: integer + detail: + title: Detail + description: A human-readable explanation specific to this occurrence of the + problem. + type: string + minLength: 1 + instance: + title: Instance + description: A URI reference that identifies the specific occurrence of the + problem. It may yield further information if dereferenced. + type: string + x-nullable: true + additional_attributes: + title: Additional attributes + description: Any number of additional attributes, as defined in a specification + or by an implementation. + type: object + additionalProperties: + description: Additional attribute + type: string + x-nullable: true + UriLink: + title: Self + description: URI of this resource. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource + type: string + minLength: 1 + NSD_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - nsd_content + type: object + properties: + self: + $ref: '#/definitions/UriLink' + nsd_content: + $ref: '#/definitions/UriLink' + NsdInfo: + required: + - id + - nsdOnboardingState + - nsdOperationalState + - nsdUsageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the onboarded individual NS descriptor resource.This + identifier is allocated by the NFVO. + type: string + minLength: 1 + nsdId: + title: Nsdid + description: This identifier, which is allocated by the NSD designer,identifies + the NSD in a globally unique way.It is copied from the NSD content and shall + be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdName: + title: Nsdname + description: Name of the onboarded NSD.This information is copied from the + NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdVersion: + title: Nsdversion + description: Version of the on-boarded NSD.This information is copied from + the NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdDesigner: + title: Nsddesigner + description: Designer of the on-boarded NSD.This information is copied from + the NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdInvariantId: + title: Nsdinvariantid + description: This identifier, which is allocated by the NSD designer,identifies + an NSD in a version independent manner.This information is copied from the + NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + vnfPkgIds: + description: Identifies the VNF package for the VNFD referenced by the on-boarded + NS descriptor resource. + type: array + items: + description: Identifier of the VNF package + type: string + x-nullable: true + pnfdInfoIds: + description: Identifies the PnfdInfo element for the PNFD referenced by the + on-boarded NS descriptor resource. + type: array + items: + description: Identifier of the PnfdInfo element + type: string + x-nullable: true + nestedNsdInfoIds: + description: Identifies the NsdInfo element for the nested NSD referenced + by the on-boarded NS descriptor resource. + type: array + items: + description: Identifier of the NsdInfo element + type: string + x-nullable: true + nsdOnboardingState: + title: Nsdonboardingstate + description: Onboarding state of the individual NS descriptor resource. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + onboardingFailureDetails: + $ref: '#/definitions/ProblemDetails' + nsdOperationalState: + title: Nsdoperationalstate + description: Operational state of the individual NS descriptor resource.This + attribute can be modified with the PATCH method. + type: string + enum: + - ENABLED + - DISABLED + nsdUsageState: + title: Nsdusagestate + description: Usage state of the individual NS descriptor resource. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the individual NS descriptor resource.This + attribute can be modified with the PATCH method. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/NSD_LinkSerializer' + CreateNsdInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User-defined data for the NS descriptor resource to be created.It + shall be present when the user defined data is set for the individual NS + descriptor resource to be created. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + PNFD_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - pnfd_content + type: object + properties: + self: + $ref: '#/definitions/UriLink' + pnfd_content: + $ref: '#/definitions/UriLink' + PnfdInfo: + required: + - id + - pnfdOnboardingState + - pnfdUsageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the onboarded individual PNF descriptor resource. This + identifier is allocated by the NFVO. + type: string + minLength: 1 + pnfdId: + title: Pnfdid + description: This identifier, which is allocated by the PNFD designer, identifies + the PNFD in a globally unique way. It is copied from the PNFD content + and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdName: + title: Pnfdname + description: Name of the onboarded PNFD. This information is copied + from the PNFD content and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdVersion: + title: Pnfdversion + description: Version of the on-boarded PNFD. This information is copied + from the PNFD content and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdProvider: + title: Pnfdprovider + description: Provider of the on-boarded PNFD. This information is + copied from the PNFD content and shall be present after the PNFD content + is on-boarded. + type: string + x-nullable: true + pnfdInvariantId: + title: Pnfdinvariantid + description: Identifies a PNFD in a version independent manner. This + attribute is invariant across versions of PNFD. + type: string + x-nullable: true + pnfdOnboardingState: + title: Pnfdonboardingstate + description: Onboarding state of the individual PNF descriptor resource. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + onboardingFailureDetails: + $ref: '#/definitions/ProblemDetails' + pnfdUsageState: + title: Pnfdusagestate + description: Usage state of the individual PNF descriptor resource. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the individual PNF descriptor resource. This + attribute can be modified with the PATCH method. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/PNFD_LinkSerializer' + SUBSCRIPTION_ProblemDetailsSerializer: + required: + - status + - detail + type: object + properties: + type: + title: Type + description: Type + type: string + minLength: 1 + x-nullable: true + title: + title: Title + description: Title + type: string + minLength: 1 + x-nullable: true + status: + title: Status + description: Status + type: integer + detail: + title: Detail + description: Detail + type: string + minLength: 1 + instance: + title: Instance + description: Instance + type: string + minLength: 1 + x-nullable: true + additional_details: + description: Any number of additional attributes, as defined in a specification + or by an implementation. + type: array + items: + type: string + x-nullable: true + CreatePnfdInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User-defined data for the PNF descriptor resource to be created.It + shall be present when the user defined data is set for the individual PNF + descriptor resource to be created. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + NsdmNotificationsFilter: + title: Filter + description: Filter settings for this subscription, to define the of all notifications + this subscription relates to. + type: object + properties: + notificationTypes: + description: Match particular notification types + type: array + items: + type: string + enum: + - NsdOnBoardingNotification + - NsdOnboardingFailureNotification + - NsdChangeNotification + - NsdDeletionNotification + - PnfdOnBoardingNotification + - PnfdOnBoardingFailureNotification + - PnfdDeletionNotification + nsdInfoId: + description: Match NS packages with particular nsdInfoIds + type: array + items: + type: string + format: uuid + nsdId: + description: Match NS Packages with particular nsdIds + type: array + items: + type: string + format: uuid + nsdName: + description: Match NS Packages with particular nsdNames + type: array + items: + type: string + maxLength: 255 + minLength: 1 + nsdVersion: + description: match NS packages that belong to certain nsdversion + type: array + items: + type: string + maxLength: 255 + minLength: 1 + nsdInvariantId: + description: Match NS Packages with particular nsdInvariantIds + type: array + items: + type: string + format: uuid + vnfPkgIds: + description: Match NS Packages that has VNF PackageIds + type: array + items: + type: string + format: uuid + nestedNsdInfoIds: + description: Match NS Packages with particular nsdInvariantIds + type: array + items: + type: string + format: uuid + nsdOnboardingState: + description: Match NS Packages with particular NS Onboarding State + type: array + items: + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + nsdOperationalState: + description: Match NS Packages with particular NS Operational State + type: array + items: + type: string + enum: + - ENABLED + - DISABLED + nsdUsageState: + description: Match NS Packages with particular NS Usage State + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + pnfdInfoIds: + description: Match PF packages with particular pnfdInfoIds + type: array + items: + type: string + format: uuid + pnfdId: + description: Match PF packages with particular pnfdInfoIds + type: array + items: + type: string + format: uuid + pnfdName: + description: Match PF Packages with particular pnfdNames + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdVersion: + description: match PF packages that belong to certain pnfd version + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdProvider: + description: Match PF Packages with particular pnfdProvider + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdInvariantId: + description: Match PF Packages with particular pnfdInvariantIds + type: array + items: + type: string + format: uuid + pnfdOnboardingState: + description: 'Match PF Packages with particular PNF Onboarding State ' + type: array + items: + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + pnfdUsageState: + description: Match PF Packages with particular PNF usage State + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + NSDM_SUB_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + type: object + properties: + self: + $ref: '#/definitions/UriLink' + NsdmSubscription: + required: + - id + - callbackUri + - _links + type: object + properties: + id: + title: Id + description: Identifier of this subscription resource. + type: string + maxLength: 255 + minLength: 1 + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + maxLength: 255 + minLength: 1 + filter: + $ref: '#/definitions/NsdmNotificationsFilter' + _links: + $ref: '#/definitions/NSDM_SUB_LinkSerializer' + BasicAuth: + title: Paramsbasic + description: Parameters for authentication/authorization using BASIC. + type: object + properties: + userName: + title: Username + description: Username to be used in HTTP Basic authentication. + type: string + maxLength: 255 + minLength: 1 + password: + title: Password + description: Password to be used in HTTP Basic authentication. + type: string + maxLength: 255 + minLength: 1 + OAuthCredentials: + title: Paramsoauth2clientcredentials + description: Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS. + type: object + properties: + clientId: + title: Clientid + description: Client identifier to be used in the access token request of the + OAuth 2.0 client credentials grant type. + type: string + maxLength: 255 + minLength: 1 + clientPassword: + title: Clientpassword + description: Client password to be used in the access token request of the + OAuth 2.0 client credentials grant type. + type: string + maxLength: 255 + minLength: 1 + tokenEndpoint: + title: Tokenendpoint + description: The token endpoint from which the access token can be obtained. + type: string + maxLength: 255 + minLength: 1 + SubscriptionAuthentication: + title: Authentication + description: Authentication parameters to configure the use of Authorization when + sending notifications corresponding to this subscription. + required: + - authType + type: object + properties: + authType: + description: Defines the types of Authentication / Authorization which the + API consumer is willing to accept when receiving a notification. + type: array + items: + type: string + enum: + - BASIC + - OAUTH2_CLIENT_CREDENTIALS + - TLS_CERT + paramsBasic: + $ref: '#/definitions/BasicAuth' + paramsOauth2ClientCredentials: + $ref: '#/definitions/OAuthCredentials' + NsdmSubscriptionRequest: + required: + - callbackUri + type: object + properties: + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + minLength: 1 + filter: + $ref: '#/definitions/NsdmNotificationsFilter' + authentication: + $ref: '#/definitions/SubscriptionAuthentication' + ParseModelRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + packageType: + title: Packagetype + description: 'Package type: VNF, PNF, NS, Service' + type: string + minLength: 1 + inputs: + title: Inputs + description: Inputs + type: string + ParseModelResponse: + required: + - model + type: object + properties: + model: + title: Model + description: Model + type: string + VNF_SUBSCRIPTION_LINKSERIALIZER: + title: Self + description: URI of this resource. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource. + type: string + minLength: 1 + LinkSelf: + title: ' links' + description: Links to resources related to this resource. + required: + - self + type: object + properties: + self: + $ref: '#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER' + Version: + title: Versions + description: match VNF packages that contain VNF products with certain versions + required: + - vnfSoftwareVersion + type: object + properties: + vnfSoftwareVersion: + title: Vnfsoftwareversion + description: VNF software version to match. + type: string + maxLength: 255 + minLength: 1 + vnfdVersions: + description: Match VNF packages that contain VNF products with certain VNFD + versions + type: array + items: + type: string + minLength: 1 + vnfProducts: + title: Vnfproducts + description: match VNF packages that contain VNF products with certain product + names, from one particular provider + required: + - vnfProductName + type: object + properties: + vnfProductName: + title: Vnfproductname + description: Name of the VNF product to match. + type: string + maxLength: 255 + minLength: 1 + versions: + $ref: '#/definitions/Version' + vnfProductsProviders: + required: + - vnfProvider + type: object + properties: + vnfProvider: + title: Vnfprovider + description: Name of the VNFprovider to match. + type: string + maxLength: 255 + minLength: 1 + vnfProducts: + $ref: '#/definitions/vnfProducts' + PkgmNotificationsFilter: + title: Filter + description: Filter settings for this subscription, to define the subset of all + notifications this subscription relates to + type: object + properties: + notificationTypes: + description: Match particular notification types + type: array + items: + type: string + enum: + - VnfPackageOnboardingNotification + - VnfPackageChangeNotification + vnfProductsFromProviders: + description: Match VNF packages that contain VNF products from certain providers. + type: array + items: + $ref: '#/definitions/vnfProductsProviders' + vnfdId: + description: Match VNF packages with a VNFD identifierlisted in the attribute + type: array + items: + type: string + format: uuid + vnfPkgId: + description: Match VNF packages with a VNFD identifierlisted in the attribute + type: array + items: + type: string + format: uuid + operationalState: + description: Operational state of the VNF package. + type: array + items: + type: string + enum: + - ENABLED + - DISABLED + usageState: + description: Operational state of the VNF package. + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + PkgmSubscription: + required: + - id + - callbackUri + - _links + type: object + properties: + id: + title: Id + description: Identifier of this subscription resource. + type: string + format: uuid + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + format: uri + minLength: 1 + _links: + $ref: '#/definitions/LinkSelf' + filter: + $ref: '#/definitions/PkgmNotificationsFilter' + PkgmSubscriptionRequest: + required: + - callbackUri + type: object + properties: + filters: + $ref: '#/definitions/PkgmNotificationsFilter' + callbackUri: + title: Callbackuri + description: Callback URI to sendthe notification + type: string + format: uri + minLength: 1 + authentication: + $ref: '#/definitions/SubscriptionAuthentication' + Checksum: + title: Checksum + description: Checksum of the on-boarded VNF package. + required: + - algorithm + - hash + type: object + properties: + algorithm: + title: Algorithm + description: Name of the algorithm used to generate the checksum. + type: string + minLength: 1 + hash: + title: Hash + description: The hexadecimal value of the checksum. + type: string + minLength: 1 + VnfPackageSoftwareImageInfo: + description: Information about VNF package artifacts that are software images. + required: + - id + - name + - provider + - version + - checksum + - containerFormat + - diskFormat + - createdAt + - minDisk + - minRam + - size + - imagePath + type: object + properties: + id: + title: Id + description: Identifier of the software image. + type: string + minLength: 1 + name: + title: Name + description: Name of the software image. + type: string + minLength: 1 + provider: + title: Provider + description: Provider of the software image. + type: string + minLength: 1 + version: + title: Version + description: Version of the software image. + type: string + minLength: 1 + checksum: + $ref: '#/definitions/Checksum' + containerFormat: + title: Containerformat + description: 'terminationType: Indicates whether forceful or graceful termination + is requested.' + type: string + enum: + - AKI + - AMI + - ARI + - BARE + - DOCKER + - OVA + - OVF + diskFormat: + title: Diskformat + description: Disk format of a software image is the format of the underlying + disk image. + type: string + enum: + - AKI + - AMI + - ARI + - ISO + - QCOW2 + - RAW + - VDI + - VHD + - VHDX + - VMDK + createdAt: + title: Createdat + description: Time when this software image was created. + type: string + format: date-time + minDisk: + title: Mindisk + description: The minimal disk for this software image in bytes. + type: integer + minRam: + title: Minram + description: The minimal RAM for this software image in bytes. + type: integer + size: + title: Size + description: Size of this software image in bytes. + type: integer + userMetadata: + title: Usermetadata + description: User-defined data. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + imagePath: + title: Imagepath + description: Path in the VNF package. + type: string + minLength: 1 + VnfPackageArtifactInfo: + description: Information about VNF package artifacts contained in the VNF package + that are not software images. + required: + - artifactPath + - checksum + type: object + properties: + artifactPath: + title: Artifactpath + description: Path in the VNF package. + type: string + minLength: 1 + checksum: + $ref: '#/definitions/Checksum' + metadata: + title: Metadata + description: The metadata of the artifact that are available in the VNF package + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + VNF_PKGM_Link_Serializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - packageContent + type: object + properties: + self: + $ref: '#/definitions/UriLink' + vnfd: + $ref: '#/definitions/UriLink' + packageContent: + $ref: '#/definitions/UriLink' + VnfPkgInfo: + required: + - id + - onboardingState + - operationalState + - usageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the on-boarded VNF package. + type: string + minLength: 1 + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + x-nullable: true + vnfProvider: + title: Vnfprovider + description: Provider of the VNF package and the VNFD. + type: string + x-nullable: true + vnfProductName: + title: Vnfproductname + description: Name to identify the VNF product. + type: string + x-nullable: true + vnfSoftwareVersion: + title: Vnfsoftwareversion + description: Software version of the VNF. + type: string + x-nullable: true + vnfdVersion: + title: Vnfdversion + description: The version of the VNvFD. + type: string + x-nullable: true + checksum: + $ref: '#/definitions/Checksum' + softwareImages: + description: Information about VNF package artifacts that are software images. + type: array + items: + $ref: '#/definitions/VnfPackageSoftwareImageInfo' + x-nullable: true + additionalArtifacts: + description: Information about VNF package artifacts contained in the VNF + package that are not software images. + type: array + items: + $ref: '#/definitions/VnfPackageArtifactInfo' + x-nullable: true + onboardingState: + title: Onboardingstate + description: On-boarding state of the VNF package. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + operationalState: + title: Operationalstate + description: Operational state of the VNF package. + type: string + enum: + - ENABLED + - DISABLED + usageState: + title: Usagestate + description: Usage state of the VNF package. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the VNF package. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/VNF_PKGM_Link_Serializer' + CreateVnfPkgInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User defined data for the VNF package. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + UploadVnfPackageFromUriRequest: + required: + - addressInformation + type: object + properties: + addressInformation: + title: Addressinformation + description: Address information of the VNF package content. + type: string + minLength: 1 + userName: + title: Username + description: User name to be used for authentication. + type: string + minLength: 1 + password: + title: Password + description: Password to be used for authentication. + type: string + minLength: 1 -- 2.16.6 From 3ae91013f198d512364579822e37fc35b5996f49 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Thu, 23 Jan 2020 15:03:53 +0800 Subject: [PATCH 03/16] Modify vnfProducts definition in swagger Change-Id: I1fba8b3081503d94dc7c0565c1ad9b9b3dce6143 Issue-ID: MODELING-288 Signed-off-by: hongyuzhao --- catalog/packages/serializers/vnf_pkg_notifications.py | 6 ++++-- catalog/packages/tests/const.py | 8 ++++---- catalog/swagger/etsicatalog.swagger.json | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/catalog/packages/serializers/vnf_pkg_notifications.py b/catalog/packages/serializers/vnf_pkg_notifications.py index a0fd495..72ae6fe 100644 --- a/catalog/packages/serializers/vnf_pkg_notifications.py +++ b/catalog/packages/serializers/vnf_pkg_notifications.py @@ -43,7 +43,8 @@ class vnfProductsSerializer(serializers.Serializer): required=True, allow_null=False ) - versions = VersionSerializer( + versions = serializers.ListField( + child=VersionSerializer(), help_text="match VNF packages that contain " "VNF products with certain versions", required=False, @@ -58,7 +59,8 @@ class vnfProductsProvidersSerializer(serializers.Serializer): required=True, allow_null=False ) - vnfProducts = vnfProductsSerializer( + vnfProducts = serializers.ListField( + child=vnfProductsSerializer(), help_text="match VNF packages that contain " "VNF products with certain product names, " "from one particular provider", diff --git a/catalog/packages/tests/const.py b/catalog/packages/tests/const.py index a67dbef..fc4869c 100644 --- a/catalog/packages/tests/const.py +++ b/catalog/packages/tests/const.py @@ -561,15 +561,15 @@ vnf_subscription_data = { ], "vnfProductsFromProviders": [{ "vnfProvider": "string", - "vnfProducts": { + "vnfProducts": [{ "vnfProductName": "string", - "versions": { + "versions": [{ "vnfSoftwareVersion": "string", "vnfdVersions": [ "string" ] - } - } + }] + }] }], "vnfdId": [ "00342b18-a5c7-11e8-998c-bf1755941f12" diff --git a/catalog/swagger/etsicatalog.swagger.json b/catalog/swagger/etsicatalog.swagger.json index de56410..862fd03 100644 --- a/catalog/swagger/etsicatalog.swagger.json +++ b/catalog/swagger/etsicatalog.swagger.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"title": "Versions", "description": "match VNF packages that contain VNF products with certain versions", "required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"title": "Vnfproducts", "description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"$ref": "#/definitions/Version"}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"$ref": "#/definitions/vnfProducts"}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "format": "uuid"}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filters": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"description": "match VNF packages that contain VNF products with certain versions", "type": "array", "items": {"$ref": "#/definitions/Version"}}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "type": "array", "items": {"$ref": "#/definitions/vnfProducts"}}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "format": "uuid"}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filters": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file -- 2.16.6 From a40cb469e3aa364fb2a0f016632bc642b4ecbdb7 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Sat, 1 Feb 2020 13:40:24 +0800 Subject: [PATCH 04/16] Modify Identifer definition in swagger Change-Id: I60a5800b091eeb2239f80b9f45a5cc67489a7b48 Issue-ID: MODELING-288 Signed-off-by: hongyuzhao --- catalog/packages/serializers/nsdm_filter_data.py | 16 ++++++++-------- catalog/packages/serializers/nsdm_subscription.py | 2 +- catalog/packages/serializers/vnf_pkg_notifications.py | 12 ++++++------ catalog/packages/serializers/vnf_pkg_subscription.py | 2 +- catalog/packages/tests/test_nsdm_subscription.py | 4 ++-- catalog/swagger/etsicatalog.swagger.json | 2 +- catalog/swagger/etsicatalog.swagger.notification.json | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/catalog/packages/serializers/nsdm_filter_data.py b/catalog/packages/serializers/nsdm_filter_data.py index 47d7680..59e1a08 100644 --- a/catalog/packages/serializers/nsdm_filter_data.py +++ b/catalog/packages/serializers/nsdm_filter_data.py @@ -28,13 +28,13 @@ class NsdmNotificationsFilter(serializers.Serializer): required=False ) nsdInfoId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match NS packages with particular nsdInfoIds", allow_null=False, required=False ) nsdId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match NS Packages with particular nsdIds", allow_null=False, required=False @@ -58,19 +58,19 @@ class NsdmNotificationsFilter(serializers.Serializer): allow_null=False ) nsdInvariantId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match NS Packages with particular nsdInvariantIds", allow_null=False, required=False ) vnfPkgIds = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match NS Packages that has VNF PackageIds", allow_null=False, required=False ) nestedNsdInfoIds = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match NS Packages with particular nsdInvariantIds", allow_null=False, required=False @@ -108,13 +108,13 @@ class NsdmNotificationsFilter(serializers.Serializer): required=False ) pnfdInfoIds = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match PF packages with particular pnfdInfoIds", allow_null=False, required=False ) pnfdId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match PF packages with particular pnfdInfoIds", allow_null=False, required=False @@ -147,7 +147,7 @@ class NsdmNotificationsFilter(serializers.Serializer): required=False ) pnfdInvariantId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match PF Packages with particular pnfdInvariantIds", allow_null=False, required=False diff --git a/catalog/packages/serializers/nsdm_subscription.py b/catalog/packages/serializers/nsdm_subscription.py index 140e549..826fc14 100644 --- a/catalog/packages/serializers/nsdm_subscription.py +++ b/catalog/packages/serializers/nsdm_subscription.py @@ -58,7 +58,7 @@ class NsdmSubscriptionsSerializer(serializers.ListSerializer): class NsdmSubscriptionIdSerializer(serializers.Serializer): - subscription_id = serializers.UUIDField( + subscription_id = serializers.CharField( help_text="Identifier of this subscription resource.", required=True, allow_null=False diff --git a/catalog/packages/serializers/vnf_pkg_notifications.py b/catalog/packages/serializers/vnf_pkg_notifications.py index 72ae6fe..c1dab6a 100644 --- a/catalog/packages/serializers/vnf_pkg_notifications.py +++ b/catalog/packages/serializers/vnf_pkg_notifications.py @@ -87,14 +87,14 @@ class PkgmNotificationsFilter(serializers.Serializer): required=False ) vnfdId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match VNF packages with a VNFD identifier" "listed in the attribute", required=False, allow_null=False ) vnfPkgId = serializers.ListField( - child=serializers.UUIDField(), + child=serializers.CharField(), help_text="Match VNF packages with a VNFD identifier" "listed in the attribute", required=False, @@ -168,12 +168,12 @@ class PkgChangeNotificationSerializer(serializers.Serializer): required=True, allow_null=False ) - vnfPkgId = serializers.UUIDField( + vnfPkgId = serializers.CharField( help_text="Identifier of the VNF package.", required=True, allow_null=False ) - vnfdId = serializers.UUIDField( + vnfdId = serializers.CharField( help_text="This identifier, which is managed by the VNF provider, " "identifies the VNF package and the VNFD in a globally unique way.", required=True, @@ -227,12 +227,12 @@ class PkgOnboardingNotificationSerializer(serializers.Serializer): required=True, allow_null=False ) - vnfPkgId = serializers.UUIDField( + vnfPkgId = serializers.CharField( help_text="Identifier of the VNF package.", required=True, allow_null=False ) - vnfdId = serializers.UUIDField( + vnfdId = serializers.CharField( help_text="This identifier, which is managed by the VNF provider, " "identifies the VNF package and the VNFD in a globally unique way.", required=True, diff --git a/catalog/packages/serializers/vnf_pkg_subscription.py b/catalog/packages/serializers/vnf_pkg_subscription.py index edcd6fe..8b98ca8 100644 --- a/catalog/packages/serializers/vnf_pkg_subscription.py +++ b/catalog/packages/serializers/vnf_pkg_subscription.py @@ -62,7 +62,7 @@ class PkgmSubscriptionRequestSerializer(serializers.Serializer): class PkgmSubscriptionSerializer(serializers.Serializer): - id = serializers.UUIDField( + id = serializers.CharField( help_text="Identifier of this subscription resource.", required=True, allow_null=False diff --git a/catalog/packages/tests/test_nsdm_subscription.py b/catalog/packages/tests/test_nsdm_subscription.py index d1e8770..862054b 100644 --- a/catalog/packages/tests/test_nsdm_subscription.py +++ b/catalog/packages/tests/test_nsdm_subscription.py @@ -476,7 +476,7 @@ class TestNsdmSubscription(TestCase): def test_nsdm_get_subscription_failure_bad_request(self): response = self.client.get("/api/nsd/v1/subscriptions/123", format='json') - self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) + self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) @mock.patch.object(NsdmSubscription, 'query_single_subscription') def test_nsdmsubscription_getsingle_when_catch_exception( @@ -518,7 +518,7 @@ class TestNsdmSubscription(TestCase): def test_nsdm_delete_subscription_failure_bad_request(self): response = self.client.delete("/api/nsd/v1/subscriptions/123", format='json') - self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) + self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) @mock.patch.object(NsdmSubscription, 'delete_single_subscription') def test_nsdmsubscription_delete_when_catch_exception(self, mock_create): diff --git a/catalog/swagger/etsicatalog.swagger.json b/catalog/swagger/etsicatalog.swagger.json index 862fd03..c3f545f 100644 --- a/catalog/swagger/etsicatalog.swagger.json +++ b/catalog/swagger/etsicatalog.swagger.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "format": "uuid"}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"description": "match VNF packages that contain VNF products with certain versions", "type": "array", "items": {"$ref": "#/definitions/Version"}}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "type": "array", "items": {"$ref": "#/definitions/vnfProducts"}}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "format": "uuid"}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "format": "uuid"}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filters": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"description": "match VNF packages that contain VNF products with certain versions", "type": "array", "items": {"$ref": "#/definitions/Version"}}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "type": "array", "items": {"$ref": "#/definitions/vnfProducts"}}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filters": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file diff --git a/catalog/swagger/etsicatalog.swagger.notification.json b/catalog/swagger/etsicatalog.swagger.notification.json index 104ac97..98ef9b4 100644 --- a/catalog/swagger/etsicatalog.swagger.notification.json +++ b/catalog/swagger/etsicatalog.swagger.notification.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgChangeNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgOnboardingNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}}, "definitions": {"NOTIFICATION_LINKSERIALIZER": {"title": "Vnfpackage", "description": "Link to the resource representing the VNF package to which the notified change applies.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "PkgmLinks": {"title": " links", "description": "Links to resources related to this resource.", "type": "object", "properties": {"vnfPackage": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}, "subscription": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}}}, "PkgChangeNotification": {"required": ["id", "notificationType", "timeStamp", "subscriptionId", "vnfPkgId", "changeType", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageChangeNotification"]}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "changeType": {"title": "Changetype", "description": "The type of change of the VNF package.", "type": "string", "enum": ["OP_STATE_CHANGE", "PKG_DELETE"]}, "operationalState": {"title": "Operationalstate", "description": "New operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "minLength": 1}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}, "PkgOnboardingNotification": {"required": ["id", "notificationType", "subscriptionId", "timeStamp", "vnfPkgId", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageOnboardingNotification"]}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "format": "uuid"}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "format": "uuid"}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgChangeNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification": {"get": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_list", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgOnboardingNotification"}}], "responses": {"204": {"description": ""}}, "tags": ["VNF Package Management interface"]}, "parameters": []}}, "definitions": {"NOTIFICATION_LINKSERIALIZER": {"title": "Vnfpackage", "description": "Link to the resource representing the VNF package to which the notified change applies.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "PkgmLinks": {"title": " links", "description": "Links to resources related to this resource.", "type": "object", "properties": {"vnfPackage": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}, "subscription": {"$ref": "#/definitions/NOTIFICATION_LINKSERIALIZER"}}}, "PkgChangeNotification": {"required": ["id", "notificationType", "timeStamp", "subscriptionId", "vnfPkgId", "changeType", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageChangeNotification"]}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "minLength": 1}, "changeType": {"title": "Changetype", "description": "The type of change of the VNF package.", "type": "string", "enum": ["OP_STATE_CHANGE", "PKG_DELETE"]}, "operationalState": {"title": "Operationalstate", "description": "New operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "minLength": 1}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}, "PkgOnboardingNotification": {"required": ["id", "notificationType", "subscriptionId", "timeStamp", "vnfPkgId", "vnfdId", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this notification.", "type": "string", "minLength": 1}, "notificationType": {"title": "Notificationtype", "description": "Discriminator for the different notification types.", "type": "string", "enum": ["VnfPackageOnboardingNotification"]}, "subscriptionId": {"title": "Subscriptionid", "description": "Identifier of the subscription that this notification relates to.", "type": "string", "minLength": 1}, "timeStamp": {"title": "Timestamp", "description": "Date-time of the generation of the notification.", "type": "string", "format": "date-time"}, "vnfPkgId": {"title": "Vnfpkgid", "description": "Identifier of the VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "minLength": 1}, "_links": {"$ref": "#/definitions/PkgmLinks"}}}}} \ No newline at end of file -- 2.16.6 From 3d10bac5ec6b5394d32dc6ad3b0a7e6294ea6593 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Mon, 3 Feb 2020 17:35:20 +0800 Subject: [PATCH 05/16] Remove use of redis db Change-Id: I714c9f36ef9d6710bf8e3e21c023435d6fcc2a0a Issue-ID: MODELING-307 Signed-off-by: hongyuzhao --- catalog/jobs/job_get.py | 1 + catalog/jobs/tests/tests.py | 21 +++++++++++++++++++++ catalog/jobs/views.py | 2 +- catalog/pub/utils/jobutil.py | 8 ++++++-- catalog/settings.py | 12 +++--------- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/catalog/jobs/job_get.py b/catalog/jobs/job_get.py index 32ee243..c59a060 100644 --- a/catalog/jobs/job_get.py +++ b/catalog/jobs/job_get.py @@ -43,4 +43,5 @@ class GetJobInfoService(object): "statusDescription": job.descp, "errorCode": job.errcode, "responseId": job.indexid} for job in jobs[1:]]}} + logger.debug(ret) return ret diff --git a/catalog/jobs/tests/tests.py b/catalog/jobs/tests/tests.py index 460c854..9499cd0 100644 --- a/catalog/jobs/tests/tests.py +++ b/catalog/jobs/tests/tests.py @@ -13,6 +13,7 @@ # limitations under the License. from django.test import TestCase, Client from rest_framework import status +from catalog.pub.utils.jobutil import JobUtil from catalog.pub.database.models import JobModel, JobStatusModel @@ -38,3 +39,23 @@ class JobsViewTest(TestCase): response = self.client.get("/api/catalog/v1/jobs/%s" % job_id) self.assertIn('jobId', response.data) self.assertNotIn('responseDescriptor', response.data) + + def test_job_normal_multijobstatus(self): + JobUtil.create_job( + inst_type='test_new_job_id', + jobaction='test_jobaction', + inst_id="test_jobinstid", + job_id=self.job_id) + response = self.client.post("/api/catalog/v1/jobs/%s" % self.job_id, {"progress": "10", "desc": "10%", "errcode": "true"}, + format='json') + print(response) + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code) + response = self.client.post("/api/catalog/v1/jobs/%s" % self.job_id, {"progress": "50", "desc": "50%", "errcode": "true"}, + format='json') + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code) + response = self.client.post("/api/catalog/v1/jobs/%s" % self.job_id, {"progress": "100", "desc": "100%", "errcode": "true"}, + format='json') + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code) + response = self.client.get("/api/catalog/v1/jobs/%s" % self.job_id) + print(response) + self.assertEqual(status.HTTP_200_OK, response.status_code) diff --git a/catalog/jobs/views.py b/catalog/jobs/views.py index dd5299c..8dbfc8b 100644 --- a/catalog/jobs/views.py +++ b/catalog/jobs/views.py @@ -82,7 +82,7 @@ class JobView(APIView): request_serializer = PostJobRequestSerializer(data=request.data) validataion_error = self.handleValidatonError(request_serializer, True) - if not validataion_error: + if validataion_error: return validataion_error requestData = request_serializer.data diff --git a/catalog/pub/utils/jobutil.py b/catalog/pub/utils/jobutil.py index 3d79c7a..5c35350 100644 --- a/catalog/pub/utils/jobutil.py +++ b/catalog/pub/utils/jobutil.py @@ -18,7 +18,6 @@ import traceback from functools import reduce from catalog.pub.database.models import JobStatusModel, JobModel -from catalog.pub.utils import idutil logger = logging.getLogger(__name__) @@ -96,7 +95,12 @@ class JobUtil(object): try: int_progress = int(progress) job_status = JobStatusModel() - job_status.indexid = int(idutil.get_auto_id(job_id)) + jobstatuslist = JobStatusModel.objects.filter(jobid=job_id) + indexid = 0 + for jobstatus in jobstatuslist: + if jobstatus.indexid > indexid: + indexid = jobstatus.indexid + job_status.indexid = indexid + 1 job_status.jobid = job_id job_status.status = "processing" job_status.progress = int_progress diff --git a/catalog/settings.py b/catalog/settings.py index 40c7565..c291c65 100644 --- a/catalog/settings.py +++ b/catalog/settings.py @@ -16,9 +16,9 @@ import os import sys import platform -import catalog.pub.redisco +# import catalog.pub.redisco -from catalog.pub.config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD +# from catalog.pub.config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD from catalog.pub.config.config import DB_NAME, DB_IP, DB_USER, DB_PASSWD, DB_PORT from catalog.pub.config import config as pub_config from logging import config as log_config @@ -124,7 +124,7 @@ DATABASES = { # 'NAME': ':memory:', # } -catalog.pub.redisco.connection_setup(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWD, db=0) +# catalog.pub.redisco.connection_setup(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWD, db=0) # CACHE_BACKEND = 'redis_cache.cache://%s@%s:%s' % (REDIS_PASSWD, REDIS_HOST, REDIS_PORT) TIME_ZONE = 'UTC' @@ -203,9 +203,3 @@ if 'test' in sys.argv: TEST_OUTPUT_VERBOSE = True TEST_OUTPUT_DESCRIPTIONS = True TEST_OUTPUT_DIR = 'test-reports' - - import mock - from catalog.pub.utils import idutil - - idutil.get_auto_id = mock.Mock() - idutil.get_auto_id.return_value = 1 -- 2.16.6 From dddb97b7f1d5ac85c4700a674e9cadcdb7ac2b63 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Tue, 4 Feb 2020 17:46:11 +0800 Subject: [PATCH 06/16] Remove redis config Change-Id: I419fb5d39a46a9ca2b9a74f2a4d6d4ff12101d03 Issue-ID: MODELING-307 Signed-off-by: hongyuzhao --- catalog/pub/config/config.py | 6 +- catalog/pub/redisco/__init__.py | 58 ------------------- catalog/pub/redisco/containers.py | 116 -------------------------------------- docker/instance_config.sh | 12 ++-- requirements.txt | 4 +- 5 files changed, 11 insertions(+), 185 deletions(-) delete mode 100644 catalog/pub/redisco/__init__.py delete mode 100644 catalog/pub/redisco/containers.py diff --git a/catalog/pub/config/config.py b/catalog/pub/config/config.py index 3f6592a..4ca1d5d 100644 --- a/catalog/pub/config/config.py +++ b/catalog/pub/config/config.py @@ -17,9 +17,9 @@ MSB_SERVICE_IP = '127.0.0.1' MSB_SERVICE_PORT = '80' # [REDIS] -REDIS_HOST = '127.0.0.1' -REDIS_PORT = '6379' -REDIS_PASSWD = '' +# REDIS_HOST = '127.0.0.1' +# REDIS_PORT = '6379' +# REDIS_PASSWD = '' # [mysql] DB_IP = "127.0.0.1" diff --git a/catalog/pub/redisco/__init__.py b/catalog/pub/redisco/__init__.py deleted file mode 100644 index 217a232..0000000 --- a/catalog/pub/redisco/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) 2010 Tim Medina -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# The original code link is https://github.com/iamteem/redisco/tree/master/redisco/__init__.py - - -import redis - - -class Client(object): - def __init__(self, **kwargs): - self.connection_settings = kwargs or {'host': 'localhost', 'port': 6379, 'db': 0} - - def redis(self): - return redis.Redis(**self.connection_settings) - - def update(self, d): - self.connection_settings.update(d) - - -def connection_setup(**kwargs): - global connection, client - if client: - client.update(kwargs) - else: - client = Client(**kwargs) - connection = client.redis() - - -def get_client(): - global connection - return connection - - -client = Client() -connection = client.redis() - -__all__ = ['connection_setup', 'get_client'] diff --git a/catalog/pub/redisco/containers.py b/catalog/pub/redisco/containers.py deleted file mode 100644 index d30c227..0000000 --- a/catalog/pub/redisco/containers.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (c) 2010 Tim Medina -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# The original code link is https://github.com/iamteem/redisco/tree/master/redisco/containers.py - -""" -This module contains the container classes to create objects -that persist directly in a Redis server. -""" - -import collections -from functools import partial - - -class Container(object): - """Create a container object saved in Redis. - - Arguments: - key -- the Redis key this container is stored at - db -- the Redis client object. Default: None - - When ``db`` is not set, the gets the default connection from - ``redisco.connection`` module. - """ - - def __init__(self, key, db=None, pipeline=None): - self._db = db - self.key = key - self.pipeline = pipeline - - def clear(self): - """Remove container from Redis database.""" - del self.db[self.key] - - def __getattribute__(self, att): - if att in object.__getattribute__(self, 'DELEGATEABLE_METHODS'): - return partial(getattr(object.__getattribute__(self, 'db'), att), self.key) - else: - return object.__getattribute__(self, att) - - @property - def db(self): - if self.pipeline: - return self.pipeline - if self._db: - return self._db - if hasattr(self, 'db_cache') and self.db_cache: - return self.db_cache - else: - from . import connection - self.db_cache = connection - return self.db_cache - - DELEGATEABLE_METHODS = () - - -class Hash(Container, collections.MutableMapping): - - def __getitem__(self, att): - return self.hget(att) - - def __setitem__(self, att, val): - self.hset(att, val) - - def __delitem__(self, att): - self.hdel(att) - - def __len__(self): - return self.hlen() - - def __iter__(self): - return self.hgetall().__iter__() - - def __contains__(self, att): - return self.hexists(att) - - def __repr__(self): - return "<%s '%s' %s>" % (self.__class__.__name__, self.key, self.hgetall()) - - def keys(self): - return self.hkeys() - - def values(self): - return self.hvals() - - def _get_dict(self): - return self.hgetall() - - def _set_dict(self, new_dict): - self.clear() - self.update(new_dict) - - dict = property(_get_dict, _set_dict) - - DELEGATEABLE_METHODS = ('hlen', 'hset', 'hdel', 'hkeys', 'hgetall', 'hvals', - 'hget', 'hexists', 'hincrby', 'hmget', 'hmset') diff --git a/docker/instance_config.sh b/docker/instance_config.sh index ebc785a..bc5c02b 100755 --- a/docker/instance_config.sh +++ b/docker/instance_config.sh @@ -20,15 +20,15 @@ MYSQL_IP=`echo $MYSQL_ADDR | cut -d: -f 1` MYSQL_PORT=`echo $MYSQL_ADDR | cut -d: -f 2` echo "MYSQL_ADDR=$MYSQL_ADDR" -if [ $REDIS_ADDR ]; then - REDIS_IP=`echo $REDIS_ADDR | cut -d: -f 1` -else - REDIS_IP="$MYSQL_ADDR" -fi +# if [ $REDIS_ADDR ]; then +# REDIS_IP=`echo $REDIS_ADDR | cut -d: -f 1` +# else +# REDIS_IP="$MYSQL_ADDR" +# fi sed -i "s|DB_IP.*|DB_IP = '$MYSQL_IP'|" modeling/etsicatalog/catalog/pub/config/config.py sed -i "s|DB_PORT.*|DB_PORT = $MYSQL_PORT|" modeling/etsicatalog/catalog/pub/config/config.py -sed -i "s|REDIS_HOST.*|REDIS_HOST = '$REDIS_IP'|"modeling/etsicatalog/catalog/pub/config/config.py +# sed -i "s|REDIS_HOST.*|REDIS_HOST = '$REDIS_IP'|"modeling/etsicatalog/catalog/pub/config/config.py cat modeling/etsicatalog/catalog/pub/config/config.py diff --git a/requirements.txt b/requirements.txt index 5959924..6e8880a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,11 +6,11 @@ djangorestframework==3.10.3 PyMySQL==0.9.3 # redis cache -redis==2.10.5 +# redis==2.10.5 # for access redis cache # redisco==0.1.4 -django-redis-cache==0.13.1 +# django-redis-cache==0.13.1 # for call rest api httplib2==0.12.3 -- 2.16.6 From 0c5f51257800d53f38bed548bf3d644b85793b96 Mon Sep 17 00:00:00 2001 From: dyh Date: Thu, 6 Feb 2020 14:35:29 +0800 Subject: [PATCH 07/16] update sonar property: sonar.python.coverage.reportPath -> sonar.python.coverage.reportPaths Change-Id: I3ec5bd9e63edb8c6b777c2eb45b573dfa1b658c7 Issue-ID: MODELING-309 Signed-off-by: dyh --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89dd68b..aeb8cc2 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ UTF-8 . xunit-results.xml - coverage.xml + coverage.xml py python **/**.py -- 2.16.6 From 40f1c48b6ea2036a277dc0b32b806216285fba7c Mon Sep 17 00:00:00 2001 From: dyh Date: Tue, 11 Feb 2020 15:11:11 +0800 Subject: [PATCH 08/16] Register API to MSB via HTTPS Change-Id: Ib87aa43a1991b3b7ba3a8874a1b59c442cddd127 Issue-ID: MODELING-291 Signed-off-by: dyh --- catalog/pub/utils/restcall.py | 4 ++-- catalog/urls.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/catalog/pub/utils/restcall.py b/catalog/pub/utils/restcall.py index 8f03259..1499f8f 100644 --- a/catalog/pub/utils/restcall.py +++ b/catalog/pub/utils/restcall.py @@ -84,13 +84,13 @@ def call_req(base_url, user, passwd, auth_type, resource, method, content='', ad def req_by_msb(resource, method, content=''): - base_url = "http://%s:%s/" % (MSB_SERVICE_IP, MSB_SERVICE_PORT) + base_url = "https://%s:%s/" % (MSB_SERVICE_IP, MSB_SERVICE_PORT) return call_req(base_url, "", "", rest_no_auth, resource, method, content) def upload_by_msb(resource, method, file_data={}): headers = {'Content-Type': 'application/octet-stream'} - full_url = "http://%s:%s/%s" % (MSB_SERVICE_IP, MSB_SERVICE_PORT, resource) + full_url = "https://%s:%s/%s" % (MSB_SERVICE_IP, MSB_SERVICE_PORT, resource) http = httplib2.Http() resp, resp_content = http.request(full_url, method=method.upper(), body=file_data, headers=headers) resp_status, resp_body = resp['status'], resp_content.decode('UTF-8') diff --git a/catalog/urls.py b/catalog/urls.py index 76c972b..466fed6 100644 --- a/catalog/urls.py +++ b/catalog/urls.py @@ -16,7 +16,7 @@ from django.conf.urls import include, url from django.contrib import admin from catalog.pub.config.config import REG_TO_MSB_WHEN_START, REG_TO_MSB_REG_URL, REG_TO_MSB_REG_PARAM, \ - MSB_SVC_CALALOG_URL, MSB_SVC_NSD_URL, MSB_SVC_VNFPKGM_URL + MSB_SVC_CALALOG_URL, MSB_SVC_NSD_URL, MSB_SVC_VNFPKGM_URL, MSB_SVC_PARSER_URL urlpatterns = [ url(r'^api/catalog/v1/admin', admin.site.urls), @@ -30,8 +30,10 @@ urlpatterns = [ if REG_TO_MSB_WHEN_START: import json from catalog.pub.utils.restcall import req_by_msb + req_by_msb(MSB_SVC_CALALOG_URL, "DELETE") req_by_msb(MSB_SVC_NSD_URL, "DELETE") req_by_msb(MSB_SVC_VNFPKGM_URL, "DELETE") + req_by_msb(MSB_SVC_PARSER_URL, "DELETE") for reg_param in REG_TO_MSB_REG_PARAM: req_by_msb(REG_TO_MSB_REG_URL, "POST", json.JSONEncoder().encode(reg_param)) -- 2.16.6 From 14eb438e920a9905e7254bf3aeb6bc4cc423e6b3 Mon Sep 17 00:00:00 2001 From: dyh Date: Tue, 11 Feb 2020 17:24:21 +0800 Subject: [PATCH 09/16] Call SDC APIs via https Change-Id: Idd3f34fa409d6df05c2594a2192a66d670be79d2 Issue-ID: MODELING-310 Signed-off-by: dyh --- catalog/pub/config/config.py | 2 +- catalog/pub/msapi/sdc.py | 2 +- catalog/settings.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/catalog/pub/config/config.py b/catalog/pub/config/config.py index 4ca1d5d..3b8a59e 100644 --- a/catalog/pub/config/config.py +++ b/catalog/pub/config/config.py @@ -91,7 +91,7 @@ CATALOG_ROOT_PATH = None CATALOG_URL_PATH = None # [sdc config] -SDC_BASE_URL = "http://msb-iag/api" +SDC_BASE_URL = "https://msb-iag/api" SDC_USER = "aai" SDC_PASSWD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U" diff --git a/catalog/pub/msapi/sdc.py b/catalog/pub/msapi/sdc.py index 4b50aab..86930f0 100644 --- a/catalog/pub/msapi/sdc.py +++ b/catalog/pub/msapi/sdc.py @@ -30,7 +30,7 @@ DISTRIBUTED = "DISTRIBUTED" def call_sdc(resource, method, content=''): additional_headers = { - 'X-ECOMP-InstanceID': 'VFC', + 'X-ECOMP-InstanceID': 'Modeling', } return restcall.call_req(base_url=SDC_BASE_URL, user=SDC_USER, diff --git a/catalog/settings.py b/catalog/settings.py index c291c65..0068dac 100644 --- a/catalog/settings.py +++ b/catalog/settings.py @@ -140,7 +140,7 @@ STATICFILES_DIRS = [ pub_config.CATALOG_ROOT_PATH = os.path.join(STATICFILES_DIRS[0], "catalog") pub_config.CATALOG_URL_PATH = "static/catalog" -pub_config.SDC_BASE_URL = "http://%s:%s/api" % (pub_config.MSB_SERVICE_IP, pub_config.MSB_SERVICE_PORT) +pub_config.SDC_BASE_URL = "https://%s:%s/api" % (pub_config.MSB_SERVICE_IP, pub_config.MSB_SERVICE_PORT) if platform.system() == 'Windows' or 'test' in sys.argv: LOGGING = { -- 2.16.6 From 9812671ef6df484b944355bf5101732d5cf9ea03 Mon Sep 17 00:00:00 2001 From: dyh Date: Tue, 18 Feb 2020 15:18:13 +0800 Subject: [PATCH 10/16] modify filters to filter Change-Id: If18419663f2c5154f1a461429916025cf6c684e0 Issue-ID: MODELING-311 Signed-off-by: dyh --- catalog/packages/biz/notificationsutil.py | 10 +++++----- catalog/packages/biz/nsdm_subscription.py | 2 +- catalog/packages/biz/vnf_pkg_subscription.py | 8 ++++---- catalog/packages/serializers/vnf_pkg_subscription.py | 2 +- catalog/packages/tests/const.py | 2 +- catalog/swagger/etsicatalog.swagger.json | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py index 8cdfd80..114f922 100644 --- a/catalog/packages/biz/notificationsutil.py +++ b/catalog/packages/biz/notificationsutil.py @@ -41,7 +41,7 @@ class NotificationsUtil(object): def send_notification(self): notification = self.prepare_notification() - subscriptions_filter = {v + "__contains": notification[k] for k, v in self.filters.items()} + subscriptions_filter = {v + "__contains": notification[k] for k, v in self.filter.items()} subscriptions_filter = remove_none_key(subscriptions_filter) logger.debug('send_notification subscriptions_filter = %s' % subscriptions_filter) q1 = Q() @@ -51,7 +51,7 @@ class NotificationsUtil(object): subscriptions = self.SubscriptionModel.objects.filter(q1) if not subscriptions.exists(): - logger.info("No subscriptions created for the filters %s" % notification) + logger.info("No subscriptions created for the filter %s" % notification) return logger.info("Start sending notifications") for sub in subscriptions: @@ -102,7 +102,7 @@ class NotificationsUtil(object): class PkgNotifications(NotificationsUtil): def __init__(self, notification_type, vnf_pkg_id, change_type=None, operational_state=None): super(PkgNotifications, self).__init__(notification_type) - self.filters = { + self.filter = { 'vnfdId': 'vnfd_id', 'vnfPkgId': 'vnf_pkg_id' } @@ -150,7 +150,7 @@ class PkgNotifications(NotificationsUtil): class NsdNotifications(NotificationsUtil): def __init__(self, notification_type, nsd_info_id, nsd_id, failure_details=None, operational_state=None): super(NsdNotifications, self).__init__(notification_type) - self.filters = { + self.filter = { 'nsdInfoId': 'nsdInfoId', 'nsdId': 'nsdId', } @@ -195,7 +195,7 @@ class NsdNotifications(NotificationsUtil): class PnfNotifications(NotificationsUtil): def __init__(self, notification_type, pnfd_info_id, pnfd_id, failure_details=None): super(PnfNotifications, self).__init__(notification_type) - self.filters = { + self.filter = { 'pnfdId': 'pnfdId', 'pnfdInfoIds': 'pnfdInfoIds', } diff --git a/catalog/packages/biz/nsdm_subscription.py b/catalog/packages/biz/nsdm_subscription.py index e2af6e4..652e9a7 100644 --- a/catalog/packages/biz/nsdm_subscription.py +++ b/catalog/packages/biz/nsdm_subscription.py @@ -76,7 +76,7 @@ class NsdmSubscription: for query, value in list(self.params.items()): if query in const.NSDM_NOTIFICATION_FILTERS and value: query_data[query + '__icontains'] = json.dumps(list(set(value))) - # Query the database with filters if the request + # Query the database with filter if the request # has fields in request params, else fetch all records if query_data: subscriptions = NsdmSubscriptionModel.objects.filter(**query_data) diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index 69ce2e8..6abe10e 100644 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -48,7 +48,7 @@ class CreateSubscription(object): def __init__(self, data): self.data = data - self.filter = ignore_case_get(self.data, "filters", {}) + self.filter = ignore_case_get(self.data, "filter", {}) self.callback_uri = ignore_case_get(self.data, "callbackUri") self.authentication = ignore_case_get(self.data, "authentication", {}) self.notification_types = ignore_case_get(self.filter, "notificationTypes", []) @@ -104,7 +104,7 @@ class CreateSubscription(object): if not is_filter_type_equal(getattr(self, filter_type), ast.literal_eval(getattr(sub, filter_type))): return False - # If all the above types are same then check id filters + # If all the above types are same then check id filter for id_filter in ["vnfd_id", "vnf_pkg_id"]: if not is_filter_type_equal(getattr(self, id_filter), ast.literal_eval(getattr(sub, id_filter))): @@ -151,11 +151,11 @@ class QuerySubscription(object): def query_multi_subscriptions(self, params): query_data = {} logger.debug("QuerySubscription--get--multi--subscriptions--biz::> Check " - "for filters in query params %s" % params) + "for filter in query params %s" % params) for query, value in list(params.items()): if query in ROOT_FILTERS: query_data[ROOT_FILTERS[query] + '__icontains'] = value - # Query the database with filters if the request has fields in request params, else fetch all records + # Query the database with filter if the request has fields in request params, else fetch all records if query_data: subscriptions = VnfPkgSubscriptionModel.objects.filter(**query_data) else: diff --git a/catalog/packages/serializers/vnf_pkg_subscription.py b/catalog/packages/serializers/vnf_pkg_subscription.py index 8b98ca8..1c29ba0 100644 --- a/catalog/packages/serializers/vnf_pkg_subscription.py +++ b/catalog/packages/serializers/vnf_pkg_subscription.py @@ -39,7 +39,7 @@ class LinkSelfSerializer(serializers.Serializer): class PkgmSubscriptionRequestSerializer(serializers.Serializer): - filters = vnf_pkg_notifications.PkgmNotificationsFilter( + filter = vnf_pkg_notifications.PkgmNotificationsFilter( help_text="Filter settings for this subscription, " "to define the subset of all notifications" " this subscription relates to", diff --git a/catalog/packages/tests/const.py b/catalog/packages/tests/const.py index fc4869c..79cedfc 100644 --- a/catalog/packages/tests/const.py +++ b/catalog/packages/tests/const.py @@ -555,7 +555,7 @@ sd_data = { } vnf_subscription_data = { - "filters": { + "filter": { "notificationTypes": [ "VnfPackageOnboardingNotification" ], diff --git a/catalog/swagger/etsicatalog.swagger.json b/catalog/swagger/etsicatalog.swagger.json index c3f545f..a9cb8e0 100644 --- a/catalog/swagger/etsicatalog.swagger.json +++ b/catalog/swagger/etsicatalog.swagger.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"description": "match VNF packages that contain VNF products with certain versions", "type": "array", "items": {"$ref": "#/definitions/Version"}}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "type": "array", "items": {"$ref": "#/definitions/vnfProducts"}}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filters": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Modeling etsicatalog API", "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON document can be found [here](/api/catalog/v1/swagger.json).", "version": "v1"}, "host": "127.0.0.1:8000", "schemes": ["http"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/api/catalog/v1/callback_sample": {"get": {"operationId": "api_catalog_v1_callback_sample_list", "description": "Callback Sample.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}, "/api/catalog/v1/health_check": {"get": {"operationId": "api_catalog_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/catalog/v1/jobs/{job_id}": {"get": {"operationId": "api_catalog_v1_jobs_read", "description": "Get job status", "parameters": [{"name": "job_id", "in": "query", "description": "job id", "type": "string"}, {"name": "responseId", "in": "query", "description": "response id", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GetJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_jobs_create", "description": "Update job status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PostJobRequest"}}, {"name": "job_id", "in": "query", "description": "job id", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponseResult"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "job_id", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/mandb/{modelName}": {"get": {"operationId": "api_catalog_v1_mandb_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "delete": {"operationId": "api_catalog_v1_mandb_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": [{"name": "modelName", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/nspackages": {"get": {"operationId": "api_catalog_v1_nspackages_list", "description": "Query NS packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_nspackages_create", "description": "On distribute NS package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/nspackages/{csarId}": {"get": {"operationId": "api_catalog_v1_nspackages_read", "description": "Query one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_nspackages_delete", "description": "Delete one NS package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsPackageDistributeResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/service_packages": {"get": {"operationId": "api_catalog_v1_service_packages_list", "description": "Query Service packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServicePackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_service_packages_create", "description": "On distribute Service package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ServicePackageDistributeRequest"}}], "responses": {"202": {"description": ""}, "400": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/service_packages/{csarId}": {"get": {"operationId": "api_catalog_v1_service_packages_read", "description": "Query one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ServicePackage"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_service_packages_delete", "description": "Delete one Service package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/catalog/v1/vnfpackages": {"get": {"operationId": "api_catalog_v1_vnfpackages_list", "description": "Query Nf packages", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NfPackage"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "post": {"operationId": "api_catalog_v1_vnfpackages_create", "description": "On distribute Nf package", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NfPackageDistributeRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Catalog interface"]}, "parameters": []}, "/api/catalog/v1/vnfpackages/{csarId}": {"get": {"operationId": "api_catalog_v1_vnfpackages_read", "description": "Query one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NfPackage"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "delete": {"operationId": "api_catalog_v1_vnfpackages_delete", "description": "Delete one Nf package", "parameters": [{"name": "csarId", "in": "query", "description": "csarId", "type": "string"}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/PostJobResponse"}}, "500": {"description": "error message", "schema": {"type": "string"}}}, "tags": ["Catalog interface"]}, "parameters": [{"name": "csarId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/health_check": {"get": {"operationId": "api_nsd_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors": {"get": {"operationId": "api_nsd_v1_ns_descriptors_list", "description": "Query multiple NSDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdInfo"}}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_ns_descriptors_create", "description": "Create a NSD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateNsdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}": {"get": {"operationId": "api_nsd_v1_ns_descriptors_read", "description": "Query a NSD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdInfo"}}, "404": {"description": "NSDs do not exist"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_ns_descriptors_delete", "description": "Delete a NSD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content": {"get": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_list", "description": "Download NSD content", "parameters": [], "responses": {"204": {"description": "No content"}, "404": {"description": "NSD does not exist."}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_ns_descriptors_nsd_content_update", "description": "Upload NSD content", "parameters": [], "responses": {"204": {"description": "PNFD file"}, "500": {"description": "Internal error"}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "nsdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_list", "description": "Query multiple PNFDs", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/PnfdInfo"}}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_pnf_descriptors_create", "description": "Create a PNFD", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreatePnfdInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}": {"get": {"operationId": "api_nsd_v1_pnf_descriptors_read", "description": "Query a PNFD", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PnfdInfo"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_pnf_descriptors_delete", "description": "Delete a PNFD", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content": {"get": {"operationId": "Fetch PNFD content", "description": "Fetch PNFD content", "parameters": [], "responses": {"200": {"description": "PNFD file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["NSD Management interface"]}, "put": {"operationId": "api_nsd_v1_pnf_descriptors_pnfd_content_update", "description": "Upload PNFD content", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "pnfdInfoId", "in": "path", "required": true, "type": "string"}]}, "/api/nsd/v1/subscriptions": {"get": {"operationId": "api_nsd_v1_subscriptions_list", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NsdmSubscription"}}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "post": {"operationId": "api_nsd_v1_subscriptions_create", "description": "Create Subscription for NSD Management", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NsdmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "303": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": []}, "/api/nsd/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_nsd_v1_subscriptions_read", "description": "Query subscriptions for Nsd Management", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/NsdmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "delete": {"operationId": "api_nsd_v1_subscriptions_delete", "description": "Delete subscription for Nsd Management", "parameters": [], "responses": {"204": {"description": "No_Content"}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["NSD Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/parser/v1/health_check": {"get": {"operationId": "api_parser_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/parser/v1/parser": {"post": {"operationId": "api_parser_v1_parser_create", "description": "Parse model(NS, Service, VNF, PNF)", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parsernsd": {"post": {"operationId": "api_parser_v1_parsernsd_create", "description": "Parse NS model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parserpnfd": {"post": {"operationId": "api_parser_v1_parserpnfd_create", "description": "Parse PNF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/parser/v1/parservnfd": {"post": {"operationId": "api_parser_v1_parservnfd_create", "description": "Parse NF model", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ParseModelRequest"}}], "responses": {"202": {"description": "", "schema": {"$ref": "#/definitions/ParseModelResponse"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/InternalErrorRequest"}}}, "tags": ["Parser interface"]}, "parameters": []}, "/api/vnfpkgm/v1/health_check": {"get": {"operationId": "api_vnfpkgm_v1_health_check_list", "description": "", "parameters": [], "responses": {"200": {"description": "Active"}}, "tags": ["Health Check interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_subscriptions_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PkgmSubscriptionRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "400": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/subscriptions/{subscriptionId}": {"get": {"operationId": "api_vnfpkgm_v1_subscriptions_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/PkgmSubscription"}}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_subscriptions_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}, "404": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}, "500": {"description": "", "schema": {"$ref": "#/definitions/SUBSCRIPTION_ProblemDetailsSerializer"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "subscriptionId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_list", "description": "Query multiple VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/VnfPkgInfo"}}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "post": {"operationId": "api_vnfpkgm_v1_vnf_packages_create", "description": "Create an individual VNF package resource", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateVnfPkgInfoRequest"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": []}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_read", "description": "Query an individual VNF package resource", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/VnfPkgInfo"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "delete": {"operationId": "api_vnfpkgm_v1_vnf_packages_delete", "description": "Delete an individual VNF package resource", "parameters": [], "responses": {"204": {"description": "No content"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_artifacts_read", "description": "", "parameters": [], "responses": {"200": {"description": "Return the artifact file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "Artifact not found", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "artifactPath", "in": "path", "required": true, "type": "string"}, {"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content": {"get": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_list", "description": "Fetch VNF package content", "parameters": [], "responses": {"200": {"description": "VNF package file", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "put": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_update", "description": "Upload VNF package content", "parameters": [], "responses": {"202": {"description": "Successfully"}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri": {"post": {"operationId": "api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create", "description": "Upload VNF package content from uri", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UploadVnfPackageFromUriRequest"}}], "responses": {"202": {"description": "Successfully"}, "400": {"description": "Bad Request", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd": {"get": {"operationId": "VNFD of an on-boarded VNF package", "description": "Read VNFD of an on-boarded VNF package", "parameters": [], "responses": {"200": {"description": "VNFD of an on-boarded VNF package", "schema": {"type": "string", "format": "binary"}}, "404": {"description": "VNF package does not exist", "schema": {"type": "string"}}, "500": {"description": "Internal error", "schema": {"type": "string"}}}, "produces": ["application/octet-stream", "application/json"], "tags": ["VNF Package Management interface"]}, "parameters": [{"name": "vnfPkgId", "in": "path", "required": true, "type": "string"}]}, "/samples/": {"get": {"operationId": "samples_list", "description": "List all samples.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["Sample interface"]}, "parameters": []}}, "definitions": {"JobResponseHistoryList": {"description": "Response History List", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}}}, "JobResponseDescriptor": {"title": "Responsedescriptor", "description": "Job Response Descriptor", "type": "object", "properties": {"status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}, "progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "Status Description", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "Error Code", "type": "string", "minLength": 1, "x-nullable": true}, "responseId": {"title": "Responseid", "description": "Response Id", "type": "string", "minLength": 1}, "responseHistoryList": {"description": "Response History List", "type": "array", "items": {"$ref": "#/definitions/JobResponseHistoryList"}}}}, "GetJobResponse": {"type": "object", "properties": {"jobId": {"title": "Jobid", "description": "Job Id", "type": "string", "minLength": 1}, "responseDescriptor": {"$ref": "#/definitions/JobResponseDescriptor"}}}, "PostJobResponseResult": {"required": ["result"], "type": "object", "properties": {"result": {"title": "Result", "description": "Result", "type": "string", "minLength": 1}, "msg": {"title": "Msg", "description": "Message", "type": "string", "minLength": 1}}}, "PostJobRequest": {"type": "object", "properties": {"progress": {"title": "Progress", "description": "Job Progress", "type": "string", "minLength": 1}, "desc": {"title": "Desc", "description": "Description", "type": "string", "minLength": 1}, "errcode": {"title": "Errcode", "description": "Error Code", "type": "string", "minLength": 1}}}, "NsPackageInfo": {"title": "Packageinfo", "description": "NS Package Info", "type": "object", "properties": {"nsdId": {"title": "Nsdid", "description": "NSD ID", "type": "string", "minLength": 1, "x-nullable": true}, "nsPackageId": {"title": "Nspackageid", "description": "NS Package ID", "type": "string", "x-nullable": true}, "nsdProvider": {"title": "Nsdprovider", "description": "NSD Provider", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "NSD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "nsdModel": {"title": "Nsdmodel", "description": "NSD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download NSD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "NsPackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/NsPackageInfo"}}}, "InternalErrorRequest": {"required": ["error"], "type": "object", "properties": {"error": {"title": "Error", "description": "Error", "type": "string", "minLength": 1}, "errorMessage": {"title": "Errormessage", "description": "Error Message", "type": "string", "minLength": 1}}}, "NsPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NsPackageDistributeResponse": {"required": ["status", "statusDescription", "errorCode"], "type": "object", "properties": {"status": {"title": "Status", "description": "status", "type": "string", "minLength": 1}, "statusDescription": {"title": "Statusdescription", "description": "statusDescription", "type": "string", "minLength": 1}, "errorCode": {"title": "Errorcode", "description": "errorCode", "type": "string", "minLength": 1}}}, "ServicePackageInfo": {"title": "Packageinfo", "description": "Service Package Info", "type": "object", "properties": {"servicedId": {"title": "Servicedid", "description": "ServiceD ID", "type": "string", "minLength": 1, "x-nullable": true}, "servicePackageId": {"title": "Servicepackageid", "description": "Service Package ID", "type": "string", "x-nullable": true}, "servicedProvider": {"title": "Servicedprovider", "description": "ServiceD Provider", "type": "string", "x-nullable": true}, "servicedVersion": {"title": "Servicedversion", "description": "ServiceD Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR name", "type": "string", "x-nullable": true}, "servicedModel": {"title": "Servicedmodel", "description": "ServiceD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download ServiceD Model", "type": "string", "minLength": 1, "x-nullable": true}}, "x-nullable": true}, "ServicePackage": {"type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1, "x-nullable": true}, "packageInfo": {"$ref": "#/definitions/ServicePackageInfo"}}}, "ServicePackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "csarId", "type": "string", "minLength": 1}}}, "NfPackageInfo": {"title": "Packageinfo", "description": "VNF Package Info", "required": ["vnfPackageId"], "type": "object", "properties": {"vnfdId": {"title": "Vnfdid", "description": "VNFD ID", "type": "string", "x-nullable": true}, "vnfPackageId": {"title": "Vnfpackageid", "description": "VNF Package ID", "type": "string", "minLength": 1}, "vnfdProvider": {"title": "Vnfdprovider", "description": "VNFD Provider", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "VNFD Version", "type": "string", "x-nullable": true}, "vnfVersion": {"title": "Vnfversion", "description": "VNF Version", "type": "string", "x-nullable": true}, "csarName": {"title": "Csarname", "description": "CSAR Name", "type": "string", "x-nullable": true}, "vnfdModel": {"title": "Vnfdmodel", "description": "VNFD Model", "type": "string", "x-nullable": true}, "downloadUrl": {"title": "Downloadurl", "description": "URL to download VNFD Model", "type": "string", "x-nullable": true}}}, "NfImageInfo": {"description": "Image Info", "required": ["index", "fileName", "imageId", "vimId", "vimUser", "tenant", "status"], "type": "object", "properties": {"index": {"title": "Index", "description": "Index of VNF Image", "type": "string", "minLength": 1}, "fileName": {"title": "Filename", "description": "Image file name", "type": "string", "minLength": 1}, "imageId": {"title": "Imageid", "description": "Image ID", "type": "string", "minLength": 1}, "vimId": {"title": "Vimid", "description": "VIM ID", "type": "string", "minLength": 1}, "vimUser": {"title": "Vimuser", "description": "User of VIM", "type": "string", "minLength": 1}, "tenant": {"title": "Tenant", "description": "Tenant", "type": "string", "minLength": 1}, "status": {"title": "Status", "description": "Status", "type": "string", "minLength": 1}}}, "NfPackage": {"required": ["csarId", "packageInfo"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageInfo": {"$ref": "#/definitions/NfPackageInfo"}, "imageInfo": {"description": "Image Info", "type": "array", "items": {"$ref": "#/definitions/NfImageInfo"}, "x-nullable": true}}}, "NfPackageDistributeRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "vimIds": {"description": "A string for vimIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "labVimId": {"title": "Labvimid", "description": "A list of VIM IDs.", "type": "string"}}}, "PostJobResponse": {"required": ["jobId"], "type": "object", "properties": {"jobId": {"title": "Jobid", "description": "jobId", "type": "string", "minLength": 1}}}, "ProblemDetails": {"title": "Onboardingfailuredetails", "description": "Failure details of current onboarding procedure.It shall be present when the nsdOnboardingState attribute is CREATED and the uploading or processing fails in NFVO.", "required": ["title", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "A URI reference according to IETF RFC 3986 [10] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".", "type": "string", "x-nullable": true}, "title": {"title": "Title", "description": "The HTTP status code for this occurrence of the problem.", "type": "integer"}, "detail": {"title": "Detail", "description": "A human-readable explanation specific to this occurrence of the problem.", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.", "type": "string", "x-nullable": true}, "additional_attributes": {"title": "Additional attributes", "description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "object", "additionalProperties": {"description": "Additional attribute", "type": "string"}, "x-nullable": true}}}, "UriLink": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource", "type": "string", "minLength": 1}}}, "NSD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "nsd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "nsd_content": {"$ref": "#/definitions/UriLink"}}}, "NsdInfo": {"required": ["id", "nsdOnboardingState", "nsdOperationalState", "nsdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual NS descriptor resource.This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "nsdId": {"title": "Nsdid", "description": "This identifier, which is allocated by the NSD designer,identifies the NSD in a globally unique way.It is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdName": {"title": "Nsdname", "description": "Name of the onboarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdVersion": {"title": "Nsdversion", "description": "Version of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdDesigner": {"title": "Nsddesigner", "description": "Designer of the on-boarded NSD.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "nsdInvariantId": {"title": "Nsdinvariantid", "description": "This identifier, which is allocated by the NSD designer,identifies an NSD in a version independent manner.This information is copied from the NSD content and shall be present after the NSD content is on-boarded.", "type": "string", "x-nullable": true}, "vnfPkgIds": {"description": "Identifies the VNF package for the VNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the VNF package", "type": "string"}, "x-nullable": true}, "pnfdInfoIds": {"description": "Identifies the PnfdInfo element for the PNFD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the PnfdInfo element", "type": "string"}, "x-nullable": true}, "nestedNsdInfoIds": {"description": "Identifies the NsdInfo element for the nested NSD referenced by the on-boarded NS descriptor resource.", "type": "array", "items": {"description": "Identifier of the NsdInfo element", "type": "string"}, "x-nullable": true}, "nsdOnboardingState": {"title": "Nsdonboardingstate", "description": "Onboarding state of the individual NS descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "nsdOperationalState": {"title": "Nsdoperationalstate", "description": "Operational state of the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "nsdUsageState": {"title": "Nsdusagestate", "description": "Usage state of the individual NS descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual NS descriptor resource.This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/NSD_LinkSerializer"}}}, "CreateNsdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the NS descriptor resource to be created.It shall be present when the user defined data is set for the individual NS descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "PNFD_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "pnfd_content"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "pnfd_content": {"$ref": "#/definitions/UriLink"}}}, "PnfdInfo": {"required": ["id", "pnfdOnboardingState", "pnfdUsageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the onboarded individual PNF descriptor resource. This identifier is allocated by the NFVO.", "type": "string", "minLength": 1}, "pnfdId": {"title": "Pnfdid", "description": "This identifier, which is allocated by the PNFD designer, identifies the PNFD in a globally unique way. It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdName": {"title": "Pnfdname", "description": "Name of the onboarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdVersion": {"title": "Pnfdversion", "description": "Version of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdProvider": {"title": "Pnfdprovider", "description": "Provider of the on-boarded PNFD. This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.", "type": "string", "x-nullable": true}, "pnfdInvariantId": {"title": "Pnfdinvariantid", "description": "Identifies a PNFD in a version independent manner. This attribute is invariant across versions of PNFD.", "type": "string", "x-nullable": true}, "pnfdOnboardingState": {"title": "Pnfdonboardingstate", "description": "Onboarding state of the individual PNF descriptor resource.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "onboardingFailureDetails": {"$ref": "#/definitions/ProblemDetails"}, "pnfdUsageState": {"title": "Pnfdusagestate", "description": "Usage state of the individual PNF descriptor resource.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the individual PNF descriptor resource. This attribute can be modified with the PATCH method.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/PNFD_LinkSerializer"}}}, "SUBSCRIPTION_ProblemDetailsSerializer": {"required": ["status", "detail"], "type": "object", "properties": {"type": {"title": "Type", "description": "Type", "type": "string", "minLength": 1, "x-nullable": true}, "title": {"title": "Title", "description": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "status": {"title": "Status", "description": "Status", "type": "integer"}, "detail": {"title": "Detail", "description": "Detail", "type": "string", "minLength": 1}, "instance": {"title": "Instance", "description": "Instance", "type": "string", "minLength": 1, "x-nullable": true}, "additional_details": {"description": "Any number of additional attributes, as defined in a specification or by an implementation.", "type": "array", "items": {"type": "string"}, "x-nullable": true}}}, "CreatePnfdInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User-defined data for the PNF descriptor resource to be created.It shall be present when the user defined data is set for the individual PNF descriptor resource to be created.", "type": "object", "additionalProperties": {"description": "Key Value Pairs", "type": "string"}, "x-nullable": true}}}, "NsdmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the of all notifications this subscription relates to.", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["NsdOnBoardingNotification", "NsdOnboardingFailureNotification", "NsdChangeNotification", "NsdDeletionNotification", "PnfdOnBoardingNotification", "PnfdOnBoardingFailureNotification", "PnfdDeletionNotification"]}}, "nsdInfoId": {"description": "Match NS packages with particular nsdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdId": {"description": "Match NS Packages with particular nsdIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdName": {"description": "Match NS Packages with particular nsdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdVersion": {"description": "match NS packages that belong to certain nsdversion", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "nsdInvariantId": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgIds": {"description": "Match NS Packages that has VNF PackageIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nestedNsdInfoIds": {"description": "Match NS Packages with particular nsdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "nsdOnboardingState": {"description": "Match NS Packages with particular NS Onboarding State", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "nsdOperationalState": {"description": "Match NS Packages with particular NS Operational State", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "nsdUsageState": {"description": "Match NS Packages with particular NS Usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}, "pnfdInfoIds": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdId": {"description": "Match PF packages with particular pnfdInfoIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdName": {"description": "Match PF Packages with particular pnfdNames", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdVersion": {"description": "match PF packages that belong to certain pnfd version", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdProvider": {"description": "Match PF Packages with particular pnfdProvider", "type": "array", "items": {"type": "string", "maxLength": 255, "minLength": 1}}, "pnfdInvariantId": {"description": "Match PF Packages with particular pnfdInvariantIds", "type": "array", "items": {"type": "string", "minLength": 1}}, "pnfdOnboardingState": {"description": "Match PF Packages with particular PNF Onboarding State ", "type": "array", "items": {"type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}}, "pnfdUsageState": {"description": "Match PF Packages with particular PNF usage State", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "NSDM_SUB_LinkSerializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}}}, "NsdmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "maxLength": 255, "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "maxLength": 255, "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "_links": {"$ref": "#/definitions/NSDM_SUB_LinkSerializer"}}}, "BasicAuth": {"title": "Paramsbasic", "description": "Parameters for authentication/authorization using BASIC.", "type": "object", "properties": {"userName": {"title": "Username", "description": "Username to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}, "password": {"title": "Password", "description": "Password to be used in HTTP Basic authentication.", "type": "string", "maxLength": 255, "minLength": 1}}}, "OAuthCredentials": {"title": "Paramsoauth2clientcredentials", "description": "Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS.", "type": "object", "properties": {"clientId": {"title": "Clientid", "description": "Client identifier to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "clientPassword": {"title": "Clientpassword", "description": "Client password to be used in the access token request of the OAuth 2.0 client credentials grant type.", "type": "string", "maxLength": 255, "minLength": 1}, "tokenEndpoint": {"title": "Tokenendpoint", "description": "The token endpoint from which the access token can be obtained.", "type": "string", "maxLength": 255, "minLength": 1}}}, "SubscriptionAuthentication": {"title": "Authentication", "description": "Authentication parameters to configure the use of Authorization when sending notifications corresponding to this subscription.", "required": ["authType"], "type": "object", "properties": {"authType": {"description": "Defines the types of Authentication / Authorization which the API consumer is willing to accept when receiving a notification.", "type": "array", "items": {"type": "string", "enum": ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]}}, "paramsBasic": {"$ref": "#/definitions/BasicAuth"}, "paramsOauth2ClientCredentials": {"$ref": "#/definitions/OAuthCredentials"}}}, "NsdmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "minLength": 1}, "filter": {"$ref": "#/definitions/NsdmNotificationsFilter"}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "ParseModelRequest": {"required": ["csarId"], "type": "object", "properties": {"csarId": {"title": "Csarid", "description": "CSAR ID", "type": "string", "minLength": 1}, "packageType": {"title": "Packagetype", "description": "Package type: VNF, PNF, NS, Service", "type": "string", "minLength": 1}, "inputs": {"title": "Inputs", "description": "Inputs", "type": "string"}}}, "ParseModelResponse": {"required": ["model"], "type": "object", "properties": {"model": {"title": "Model", "description": "Model", "type": "string"}}}, "VNF_SUBSCRIPTION_LINKSERIALIZER": {"title": "Self", "description": "URI of this resource.", "required": ["href"], "type": "object", "properties": {"href": {"title": "Href", "description": "URI of the referenced resource.", "type": "string", "minLength": 1}}}, "LinkSelf": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self"], "type": "object", "properties": {"self": {"$ref": "#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER"}}}, "Version": {"required": ["vnfSoftwareVersion"], "type": "object", "properties": {"vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "VNF software version to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfdVersions": {"description": "Match VNF packages that contain VNF products with certain VNFD versions", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "vnfProducts": {"required": ["vnfProductName"], "type": "object", "properties": {"vnfProductName": {"title": "Vnfproductname", "description": "Name of the VNF product to match.", "type": "string", "maxLength": 255, "minLength": 1}, "versions": {"description": "match VNF packages that contain VNF products with certain versions", "type": "array", "items": {"$ref": "#/definitions/Version"}}}}, "vnfProductsProviders": {"required": ["vnfProvider"], "type": "object", "properties": {"vnfProvider": {"title": "Vnfprovider", "description": "Name of the VNFprovider to match.", "type": "string", "maxLength": 255, "minLength": 1}, "vnfProducts": {"description": "match VNF packages that contain VNF products with certain product names, from one particular provider", "type": "array", "items": {"$ref": "#/definitions/vnfProducts"}}}}, "PkgmNotificationsFilter": {"title": "Filter", "description": "Filter settings for this subscription, to define the subset of all notifications this subscription relates to", "type": "object", "properties": {"notificationTypes": {"description": "Match particular notification types", "type": "array", "items": {"type": "string", "enum": ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]}}, "vnfProductsFromProviders": {"description": "Match VNF packages that contain VNF products from certain providers.", "type": "array", "items": {"$ref": "#/definitions/vnfProductsProviders"}}, "vnfdId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "vnfPkgId": {"description": "Match VNF packages with a VNFD identifierlisted in the attribute", "type": "array", "items": {"type": "string", "minLength": 1}}, "operationalState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["ENABLED", "DISABLED"]}}, "usageState": {"description": "Operational state of the VNF package.", "type": "array", "items": {"type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}}}}, "PkgmSubscription": {"required": ["id", "callbackUri", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of this subscription resource.", "type": "string", "minLength": 1}, "callbackUri": {"title": "Callbackuri", "description": "The URI of the endpoint to send the notification to.", "type": "string", "format": "uri", "minLength": 1}, "_links": {"$ref": "#/definitions/LinkSelf"}, "filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}}}, "PkgmSubscriptionRequest": {"required": ["callbackUri"], "type": "object", "properties": {"filter": {"$ref": "#/definitions/PkgmNotificationsFilter"}, "callbackUri": {"title": "Callbackuri", "description": "Callback URI to sendthe notification", "type": "string", "format": "uri", "minLength": 1}, "authentication": {"$ref": "#/definitions/SubscriptionAuthentication"}}}, "Checksum": {"title": "Checksum", "description": "Checksum of the on-boarded VNF package.", "required": ["algorithm", "hash"], "type": "object", "properties": {"algorithm": {"title": "Algorithm", "description": "Name of the algorithm used to generate the checksum.", "type": "string", "minLength": 1}, "hash": {"title": "Hash", "description": "The hexadecimal value of the checksum.", "type": "string", "minLength": 1}}}, "VnfPackageSoftwareImageInfo": {"description": "Information about VNF package artifacts that are software images.", "required": ["id", "name", "provider", "version", "checksum", "containerFormat", "diskFormat", "createdAt", "minDisk", "minRam", "size", "imagePath"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the software image.", "type": "string", "minLength": 1}, "name": {"title": "Name", "description": "Name of the software image.", "type": "string", "minLength": 1}, "provider": {"title": "Provider", "description": "Provider of the software image.", "type": "string", "minLength": 1}, "version": {"title": "Version", "description": "Version of the software image.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "containerFormat": {"title": "Containerformat", "description": "terminationType: Indicates whether forceful or graceful termination is requested.", "type": "string", "enum": ["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"]}, "diskFormat": {"title": "Diskformat", "description": "Disk format of a software image is the format of the underlying disk image.", "type": "string", "enum": ["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"]}, "createdAt": {"title": "Createdat", "description": "Time when this software image was created.", "type": "string", "format": "date-time"}, "minDisk": {"title": "Mindisk", "description": "The minimal disk for this software image in bytes.", "type": "integer"}, "minRam": {"title": "Minram", "description": "The minimal RAM for this software image in bytes.", "type": "integer"}, "size": {"title": "Size", "description": "Size of this software image in bytes.", "type": "integer"}, "userMetadata": {"title": "Usermetadata", "description": "User-defined data.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "imagePath": {"title": "Imagepath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}}}, "VnfPackageArtifactInfo": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "required": ["artifactPath", "checksum"], "type": "object", "properties": {"artifactPath": {"title": "Artifactpath", "description": "Path in the VNF package.", "type": "string", "minLength": 1}, "checksum": {"$ref": "#/definitions/Checksum"}, "metadata": {"title": "Metadata", "description": "The metadata of the artifact that are available in the VNF package", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "VNF_PKGM_Link_Serializer": {"title": " links", "description": "Links to resources related to this resource.", "required": ["self", "packageContent"], "type": "object", "properties": {"self": {"$ref": "#/definitions/UriLink"}, "vnfd": {"$ref": "#/definitions/UriLink"}, "packageContent": {"$ref": "#/definitions/UriLink"}}}, "VnfPkgInfo": {"required": ["id", "onboardingState", "operationalState", "usageState", "_links"], "type": "object", "properties": {"id": {"title": "Id", "description": "Identifier of the on-boarded VNF package.", "type": "string", "minLength": 1}, "vnfdId": {"title": "Vnfdid", "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.", "type": "string", "x-nullable": true}, "vnfProvider": {"title": "Vnfprovider", "description": "Provider of the VNF package and the VNFD.", "type": "string", "x-nullable": true}, "vnfProductName": {"title": "Vnfproductname", "description": "Name to identify the VNF product.", "type": "string", "x-nullable": true}, "vnfSoftwareVersion": {"title": "Vnfsoftwareversion", "description": "Software version of the VNF.", "type": "string", "x-nullable": true}, "vnfdVersion": {"title": "Vnfdversion", "description": "The version of the VNvFD.", "type": "string", "x-nullable": true}, "checksum": {"$ref": "#/definitions/Checksum"}, "softwareImages": {"description": "Information about VNF package artifacts that are software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageSoftwareImageInfo"}, "x-nullable": true}, "additionalArtifacts": {"description": "Information about VNF package artifacts contained in the VNF package that are not software images.", "type": "array", "items": {"$ref": "#/definitions/VnfPackageArtifactInfo"}, "x-nullable": true}, "onboardingState": {"title": "Onboardingstate", "description": "On-boarding state of the VNF package.", "type": "string", "enum": ["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"]}, "operationalState": {"title": "Operationalstate", "description": "Operational state of the VNF package.", "type": "string", "enum": ["ENABLED", "DISABLED"]}, "usageState": {"title": "Usagestate", "description": "Usage state of the VNF package.", "type": "string", "enum": ["IN_USE", "NOT_IN_USE"]}, "userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}, "_links": {"$ref": "#/definitions/VNF_PKGM_Link_Serializer"}}}, "CreateVnfPkgInfoRequest": {"type": "object", "properties": {"userDefinedData": {"title": "Userdefineddata", "description": "User defined data for the VNF package.", "type": "object", "additionalProperties": {"description": "KeyValue Pairs", "type": "string"}, "x-nullable": true}}}, "UploadVnfPackageFromUriRequest": {"required": ["addressInformation"], "type": "object", "properties": {"addressInformation": {"title": "Addressinformation", "description": "Address information of the VNF package content.", "type": "string", "minLength": 1}, "userName": {"title": "Username", "description": "User name to be used for authentication.", "type": "string", "minLength": 1}, "password": {"title": "Password", "description": "Password to be used for authentication.", "type": "string", "minLength": 1}}}}} \ No newline at end of file -- 2.16.6 From 6215857a5a88907c2ba522b862992815e47f4960 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Tue, 18 Feb 2020 16:11:50 +0800 Subject: [PATCH 11/16] additionalArtifacts is not implemented in the response of the Query VNF API Change-Id: I62e3338b038eec1a318841521c3f2dcd1c05ee5e Issue-ID: MODELING-312 Signed-off-by: hongyuzhao --- catalog/packages/biz/vnf_package.py | 52 ++++++++++++++++++++++++++++- catalog/packages/tests/test_vnf_package.py | 36 ++++++++++++++++++++ catalog/pub/utils/fileutil.py | 35 +++++++++++++++++++ static/catalog/vgw.csar | Bin 0 -> 24116 bytes 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 static/catalog/vgw.csar diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index daf2fb2..6dec204 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -229,6 +229,56 @@ class VnfPkgUploadThread(threading.Thread): logger.info('VNF packge(%s) has been uploaded.' % self.vnf_pkg_id) +def get_mfile_data(path): + logger.debug('get_mfile_data path %s' % path) + files = fileutil.filter_files(path, '.mf') + if files: + src_file = os.path.join(path, files[0]) + src_dict_list = [] + with open(src_file, 'r') as f: + data = f.readlines() + for line in data: + if line.strip() == "": + continue + src_dict = {} + k, v = line.split(':', maxsplit=1) + if k.strip() in ["Source", "Algorithm", "Hash"]: + if k.strip() == "Source" and src_dict: + src_dict_list.extend(src_dict) + src_dict = {} + src_dict[k.strip()] = v.strip() + print("src_dict:%s" % src_dict) + if src_dict: + src_dict_list.append(src_dict) + + logger.debug('get_mfile_data: %s' % src_dict_list) + return src_dict_list + + +def fill_artifacts_data(vnf_pkg_id): + vnf_pkg_path = os.path.join(CATALOG_ROOT_PATH, vnf_pkg_id) + if os.path.exists(vnf_pkg_path) is False: + return None + files = fileutil.filter_files(vnf_pkg_path, '.csar') + for filename in files: + logger.info('fill_artifacts_data filename (%s)...' % filename) + dst_file_path = os.path.join(vnf_pkg_path, "tmp") + src_file = os.path.join(vnf_pkg_path, filename) + dst_file = os.path.join(dst_file_path, filename) + fileutil.recreate_dir(dst_file_path) + fileutil.copy(src_file, vnf_pkg_path, dst_file) + artifact_vnf_file = fileutil.unzip_file(dst_file, dst_file_path, "") + artifacts = get_mfile_data(artifact_vnf_file) + if artifacts: + return [{ + "artifactPath": artifact.get("Source", ""), + "checksum": { + "algorithm": artifact.get("Hash", "Null"), + "hash": artifact.get("Algorithm", "Null") + } + } for artifact in artifacts] + + def fill_response_data(nf_pkg): pkg_info = {} pkg_info["id"] = nf_pkg.vnfPackageId @@ -239,7 +289,7 @@ def fill_response_data(nf_pkg): if nf_pkg.checksum: pkg_info["checksum"] = json.JSONDecoder().decode(nf_pkg.checksum) pkg_info["softwareImages"] = None # TODO - pkg_info["additionalArtifacts"] = None # TODO + pkg_info["additionalArtifacts"] = fill_artifacts_data(nf_pkg.vnfPackageId) pkg_info["onboardingState"] = nf_pkg.onboardingState pkg_info["operationalState"] = nf_pkg.operationalState pkg_info["usageState"] = nf_pkg.usageState diff --git a/catalog/packages/tests/test_vnf_package.py b/catalog/packages/tests/test_vnf_package.py index 5422361..8deb9ec 100644 --- a/catalog/packages/tests/test_vnf_package.py +++ b/catalog/packages/tests/test_vnf_package.py @@ -423,3 +423,39 @@ class TestVnfPackage(TestCase): self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) response = self.client.get(VNF_BASE_URL + "/222/artifacts/image1") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + def test_upload_vnf_pkg_with_artifacts(self): + data = {'file': open(os.path.join(CATALOG_ROOT_PATH, "vgw.csar"), "rb")} + VnfPackageModel.objects.create( + vnfPackageId="222", + onboardingState="CREATED" + ) + response = self.client.put("%s/222/package_content" % VNF_BASE_URL, data=data) + vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId="222") + self.assertEqual(PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState) + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + response = self.client.get("%s/222" % VNF_BASE_URL) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + expact_response_data = { + "id": "222", + "vnfdId": "b1bb0ce7-2222-4fa7-95ed-4840d70a1177", + "vnfProductName": "vcpe_vgw", + "vnfSoftwareVersion": "1.0", + "vnfdVersion": "1.0", + "softwareImages": None, + "additionalArtifacts": [ + { + "artifactPath": "MainServiceTemplate.yaml", + "checksum": { + "algorithm": "Null", + "hash": "Null" + } + } + ], + "onboardingState": "ONBOARDED", + "operationalState": "ENABLED", + "usageState": "NOT_IN_USE", + "_links": None + } + self.assertEqual(response.data, expact_response_data) diff --git a/catalog/pub/utils/fileutil.py b/catalog/pub/utils/fileutil.py index 9344f72..e6eb6f2 100644 --- a/catalog/pub/utils/fileutil.py +++ b/catalog/pub/utils/fileutil.py @@ -54,7 +54,9 @@ def download_file_from_http(url, local_dir, file_name): def unzip_file(zip_src, dst_dir, csar_path): + logger.debug("unzip_file %s to %s.", zip_src, dst_dir) if os.path.exists(zip_src): + logger.debug("unzip_file %s.", zip_src) fz = zipfile.ZipFile(zip_src, 'r') for file in fz.namelist(): fz.extract(file, dst_dir) @@ -86,3 +88,36 @@ def get_artifact_path(vnf_path, artifact_file): if artifact_file in files: return os.path.join(root, artifact_file) return None + + +def end_with(_s_in, *suffix): + array = map(_s_in.endswith, suffix) + if True in array: + return True + return False + + +def filter_files(search_path, suffix): + f_find = [] + file_list = os.listdir(search_path) + for file_item in file_list: + if end_with(file_item, suffix): + f_find.append(file_item) + return f_find + + +def recreate_dir(path): + if os.path.exists(path): + shutil.rmtree(path) + os.makedirs(path, mode=0o777) + + +def copy(src_file, dest_dir, new_file_name=None): + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) + if new_file_name is None: + dst = os.path.join(dest_dir, os.path.basename(src_file)) + else: + dst = os.path.join(dest_dir, new_file_name) + shutil.copyfile(src_file, dst) + shutil.copymode(src_file, dst) diff --git a/static/catalog/vgw.csar b/static/catalog/vgw.csar new file mode 100644 index 0000000000000000000000000000000000000000..927812a7635c919a8cdf280adeb7eab846635967 GIT binary patch literal 24116 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 H2lww^dkU52 literal 0 HcmV?d00001 -- 2.16.6 From ec917b25163dc63a6177cbe9ad68b345649cd8e9 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Tue, 18 Feb 2020 18:10:21 +0800 Subject: [PATCH 12/16] _links is not implemented in the response of the Query VNF API Change-Id: Ia5a7de02c05ef75f5dfb0729a25d4d86ffd1ead8 Issue-ID: MODELING-312 Signed-off-by: hongyuzhao --- catalog/packages/biz/vnf_package.py | 19 +++++++++++++++-- catalog/packages/tests/test_vnf_package.py | 34 ++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index 6dec204..1073879 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -25,7 +25,7 @@ import zipfile from catalog.packages import const from catalog.packages.biz.common import parse_file_range, read, save from catalog.packages.biz.notificationsutil import PkgNotifications -from catalog.pub.config.config import CATALOG_ROOT_PATH +from catalog.pub.config.config import CATALOG_ROOT_PATH, MSB_SERVICE_IP, MSB_SERVICE_PORT from catalog.pub.database.models import VnfPackageModel, NSPackageModel from catalog.pub.exceptions import CatalogException, ResourceNotFoundException from catalog.pub.utils import fileutil, toscaparser @@ -279,6 +279,21 @@ def fill_artifacts_data(vnf_pkg_id): } for artifact in artifacts] +def fill_links(pkg_id, is_onboarded=False): + self_href = "http://%s:%s/api/vnfpkgm/v1/vnf_packages/%s" % ( + MSB_SERVICE_IP, + MSB_SERVICE_PORT, + pkg_id) + links = { + "self": {"href": self_href}, + "vnfd": {"href": "%s/%s" % (self_href, "vnfd")}, + "packageContent": {"href": "%s/%s" % (self_href, "package_content")} + } + if not is_onboarded: + links.pop("vnfd") + return links + + def fill_response_data(nf_pkg): pkg_info = {} pkg_info["id"] = nf_pkg.vnfPackageId @@ -295,7 +310,7 @@ def fill_response_data(nf_pkg): pkg_info["usageState"] = nf_pkg.usageState if nf_pkg.userDefinedData: pkg_info["userDefinedData"] = json.JSONDecoder().decode(nf_pkg.userDefinedData) - pkg_info["_links"] = None # TODO + pkg_info["_links"] = fill_links(nf_pkg.vnfPackageId, True) return pkg_info diff --git a/catalog/packages/tests/test_vnf_package.py b/catalog/packages/tests/test_vnf_package.py index 8deb9ec..0b78cbd 100644 --- a/catalog/packages/tests/test_vnf_package.py +++ b/catalog/packages/tests/test_vnf_package.py @@ -150,7 +150,10 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": {'self': {'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222'}, + 'vnfd': {'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/vnfd'}, + 'packageContent': {'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/package_content'} + } } self.assertEqual(response.data, expect_data) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -201,7 +204,17 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": { + "self": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/111" + }, + "vnfd": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/111/vnfd" + }, + "packageContent": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/111/package_content" + } + } }, { "id": "222", @@ -216,7 +229,10 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": {'self': {'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222'}, + 'vnfd': {'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/vnfd'}, + 'packageContent': { + 'href': 'http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/package_content'}} } ] self.assertEqual(response.data, expect_data) @@ -456,6 +472,16 @@ class TestVnfPackage(TestCase): "onboardingState": "ONBOARDED", "operationalState": "ENABLED", "usageState": "NOT_IN_USE", - "_links": None + "_links": { + "self": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222" + }, + "vnfd": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/vnfd" + }, + "packageContent": { + "href": "http://127.0.0.1:80/api/vnfpkgm/v1/vnf_packages/222/package_content" + } + } } self.assertEqual(response.data, expact_response_data) -- 2.16.6 From c0fcb2e4cde1cd5338412e5ce83115626d068f7b Mon Sep 17 00:00:00 2001 From: dyh Date: Wed, 19 Feb 2020 09:57:17 +0800 Subject: [PATCH 13/16] return 404 instead of 500 if subscription does not exist Change-Id: I88bd100439ad37e7c14ae74e8f93bd9569875a9c Issue-ID: MODELING-313 Signed-off-by: dyh --- catalog/packages/biz/notificationsutil.py | 1 - catalog/packages/biz/nsdm_subscription.py | 22 ++++++------ catalog/packages/biz/vnf_pkg_subscription.py | 7 ++-- catalog/packages/tests/test_nsdm_subscription.py | 4 +-- .../packages/tests/test_vnf_pkg_subscription.py | 40 ++++++++++++++++------ catalog/packages/views/common.py | 10 +++++- 6 files changed, 53 insertions(+), 31 deletions(-) diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py index 114f922..72afe33 100644 --- a/catalog/packages/biz/notificationsutil.py +++ b/catalog/packages/biz/notificationsutil.py @@ -26,7 +26,6 @@ from django.db.models import Q from catalog.packages.serializers.vnf_pkg_notifications import PkgChangeNotificationSerializer, \ PkgOnboardingNotificationSerializer - logger = logging.getLogger(__name__) diff --git a/catalog/packages/biz/nsdm_subscription.py b/catalog/packages/biz/nsdm_subscription.py index 652e9a7..72eded6 100644 --- a/catalog/packages/biz/nsdm_subscription.py +++ b/catalog/packages/biz/nsdm_subscription.py @@ -15,18 +15,16 @@ import ast import json import logging -import requests import uuid - from collections import Counter +import requests from rest_framework import status from catalog.packages import const from catalog.pub.database.models import NsdmSubscriptionModel from catalog.pub.exceptions import CatalogException, \ - ResourceNotFoundException, \ - NsdmBadRequestException, NsdmDuplicateSubscriptionException + NsdmBadRequestException, NsdmDuplicateSubscriptionException, SubscriptionDoesNotExistsException from catalog.pub.utils.values import ignore_case_get logger = logging.getLogger(__name__) @@ -52,8 +50,8 @@ class NsdmSubscription: NsdmSubscriptionModel.objects.filter( subscriptionid=subscription_id) if not subscription.exists(): - raise ResourceNotFoundException( - "Subscription(%s) doesn't exists" % subscription_id) + raise SubscriptionDoesNotExistsException( + "Subscription(%s) doesn't exist" % subscription_id) logger.debug("Subscription found... ") return self.fill_resp_data(subscription[0]) @@ -63,8 +61,8 @@ class NsdmSubscription: NsdmSubscriptionModel.objects.filter( subscriptionid=subscription_id) if not subscription.exists(): - raise ResourceNotFoundException( - "Subscription(%s) doesn't exists" % subscription_id) + raise SubscriptionDoesNotExistsException( + "Subscription(%s) doesn't exist" % subscription_id) subscription.delete() logger.debug("Deleted Subscription... ") @@ -83,7 +81,7 @@ class NsdmSubscription: else: subscriptions = NsdmSubscriptionModel.objects.all() if not subscriptions.exists(): - raise ResourceNotFoundException("Subscriptions doesn't exist") + raise SubscriptionDoesNotExistsException("Subscriptions doesn't exist") return [self.fill_resp_data(subscription) for subscription in subscriptions] @@ -183,7 +181,7 @@ class NsdmSubscription: def check_valid(self): logger.debug("Create Subscription --> Checking DB if " - "same subscription exists already exists... ") + "same subscription has already existed... ") subscriptions = \ NsdmSubscriptionModel.objects.filter( callback_uri=self.callback_uri) @@ -192,7 +190,7 @@ class NsdmSubscription: for subscription in subscriptions: if self.check_filter_exists(subscription): raise NsdmDuplicateSubscriptionException( - "Already Subscription exists with the " + "Subscription has already existed with the " "same callbackUri and filter") def save_db(self): @@ -201,7 +199,7 @@ class NsdmSubscription: links = { "self": { "href": - const.NSDM_SUBSCRIPTION_ROOT_URI + self.subscription_id + const.NSDM_SUBSCRIPTION_ROOT_URI + self.subscription_id } } subscription_save_db = { diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index 6abe10e..c457bfe 100644 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -24,11 +24,10 @@ from rest_framework import status from catalog.packages import const from catalog.pub.database.models import VnfPkgSubscriptionModel -from catalog.pub.exceptions import VnfPkgSubscriptionException,\ +from catalog.pub.exceptions import VnfPkgSubscriptionException, \ VnfPkgDuplicateSubscriptionException, SubscriptionDoesNotExistsException from catalog.pub.utils.values import ignore_case_get - logger = logging.getLogger(__name__) ROOT_FILTERS = { @@ -172,7 +171,7 @@ class QuerySubscription(object): subscription_id=subscription_id) if not subscription.exists(): raise SubscriptionDoesNotExistsException("Subscription with ID: %s " - "does not exists" % subscription_id) + "does not exist" % subscription_id) return subscription[0].toDict() @@ -186,5 +185,5 @@ class TerminateSubscription(object): subscription_id=subscription_id) if not subscription.exists(): raise SubscriptionDoesNotExistsException("Subscription with ID: %s " - "does not exists" % subscription_id) + "does not exist" % subscription_id) subscription[0].delete() diff --git a/catalog/packages/tests/test_nsdm_subscription.py b/catalog/packages/tests/test_nsdm_subscription.py index 862054b..0d73afd 100644 --- a/catalog/packages/tests/test_nsdm_subscription.py +++ b/catalog/packages/tests/test_nsdm_subscription.py @@ -158,7 +158,7 @@ class TestNsdmSubscription(TestCase): response.data["callbackUri"]) expected_data = { 'status': 303, - 'detail': 'Already Subscription exists with' + 'detail': 'Subscription has already existed with' ' the same callbackUri and filter' } response = self.client.post("/api/nsd/v1/subscriptions", @@ -465,7 +465,7 @@ class TestNsdmSubscription(TestCase): expected_data = { "status": 404, "detail": "Subscription(" + self.subscription_id + ") " - "doesn't exists" + "doesn't exist" } response = self.client.get('/api/nsd/v1/' 'subscriptions/' + self.subscription_id, diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index bc7ee49..d2e2b5b 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -12,23 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. -import uuid -import mock import json import os +import uuid -from rest_framework.test import APIClient +import mock from django.test import TestCase +from rest_framework import status +from rest_framework.test import APIClient -from catalog.pub.database.models import VnfPkgSubscriptionModel, VnfPackageModel -from .const import vnf_subscription_data, vnfd_data -from catalog.packages.biz.notificationsutil import PkgNotifications +import catalog.pub.utils.timeutil from catalog.packages import const +from catalog.packages.biz.notificationsutil import PkgNotifications +from catalog.packages.biz.vnf_pkg_subscription import QuerySubscription, TerminateSubscription from catalog.pub.config import config as pub_config -import catalog.pub.utils.timeutil -from catalog.pub.utils import toscaparser from catalog.pub.config.config import CATALOG_ROOT_PATH -from rest_framework import status +from catalog.pub.database.models import VnfPkgSubscriptionModel, VnfPackageModel +from catalog.pub.exceptions import SubscriptionDoesNotExistsException +from catalog.pub.utils import toscaparser +from .const import vnf_subscription_data, vnfd_data class TestNfPackageSubscription(TestCase): @@ -196,7 +198,8 @@ class TestNfPackageSubscription(TestCase): @mock.patch("requests.post") @mock.patch("uuid.uuid4") @mock.patch.object(catalog.pub.utils.timeutil, "now_time") - def test_vnfpkg_subscript_notify(self, mock_nowtime, mock_uuid, mock_requests_post, mock_parse_vnfd, mock_requests_get): + def test_vnfpkg_subscript_notify(self, mock_nowtime, mock_uuid, mock_requests_post, mock_parse_vnfd, + mock_requests_get): mock_nowtime.return_value = "2019-02-16 14:41:16" uuid_subscriptid = "99442b18-a5c7-11e8-998c-bf1755941f13" uuid_vnfPackageId = "3fa85f64-5717-4562-b3fc-2c963f66afa6" @@ -247,6 +250,20 @@ class TestNfPackageSubscription(TestCase): mock_requests_post.assert_called_with(vnf_subscription_data["callbackUri"], data=expect_notification, headers={'Connection': 'close'}) + def test_service_query_single_subscription_not_found(self): + try: + subscription_id = "test_not_found" + QuerySubscription().query_single_subscription(subscription_id) + except SubscriptionDoesNotExistsException as e: + self.assertEqual("Subscription with ID: %s does not exist" % subscription_id, e.args[0]) + + def test_service_delete_single_subscription_not_found(self): + try: + subscription_id = "test_not_found" + TerminateSubscription().terminate(subscription_id) + except SubscriptionDoesNotExistsException as e: + self.assertEqual("Subscription with ID: %s does not exist" % subscription_id, e.args[0]) + class NotificationTest(TestCase): def setUp(self): @@ -301,4 +318,5 @@ class NotificationTest(TestCase): } } } - mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, headers={'Connection': 'close'}) + mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, + headers={'Connection': 'close'}) diff --git a/catalog/packages/views/common.py b/catalog/packages/views/common.py index c074faf..12840a5 100644 --- a/catalog/packages/views/common.py +++ b/catalog/packages/views/common.py @@ -18,7 +18,7 @@ import logging from rest_framework import status from rest_framework.response import Response -from catalog.pub.exceptions import CatalogException +from catalog.pub.exceptions import CatalogException, SubscriptionDoesNotExistsException from catalog.pub.exceptions import BadRequestException from catalog.pub.exceptions import NsdmBadRequestException from catalog.pub.exceptions import PackageNotFoundException @@ -108,6 +108,12 @@ def view_safe_call_with_log(logger): detail=e.args[0], status=status.HTTP_400_BAD_REQUEST ) + except SubscriptionDoesNotExistsException as e: + logger.error(e.args[0]) + return make_error_resp( + detail=e.args[0], + status=status.HTTP_404_NOT_FOUND + ) except VnfPkgSubscriptionException as e: logger.error(e.args[0]) return make_error_resp( @@ -127,5 +133,7 @@ def view_safe_call_with_log(logger): detail='Unexpected exception', status=status.HTTP_500_INTERNAL_SERVER_ERROR ) + return wrapper + return view_safe_call -- 2.16.6 From a8aae3166f06b86a609182b671d0e9a6ae314b44 Mon Sep 17 00:00:00 2001 From: dyh Date: Wed, 19 Feb 2020 15:26:33 +0800 Subject: [PATCH 14/16] update test cases if subscription does not exist Change-Id: I933c66c735482d2c8fc112f8d88c0a5c9e208300 Issue-ID: MODELING-313 Signed-off-by: dyh --- catalog/packages/tests/test_vnf_pkg_subscription.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index d2e2b5b..fd229ec 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -148,20 +148,16 @@ class TestNfPackageSubscription(TestCase): self.assertEqual(temp_uuid, response.data["id"]) @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_get_subscription_with_id_not_exists(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - dummy_uuid = str(uuid.uuid4()) + def test_get_subscription_with_id_not_exists(self, mock_requests): mock_requests.return_value.status_code = 204 mock_requests.get.status_code = 204 - mock_uuid4.return_value = temp_uuid self.client.post( "/api/vnfpkgm/v1/subscriptions", data=self.vnf_subscription_data, format='json' ) response = self.client.get( - "/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid, + "/api/vnfpkgm/v1/subscriptions/111", format='json' ) self.assertEqual(404, response.status_code) @@ -186,9 +182,7 @@ class TestNfPackageSubscription(TestCase): response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % temp_uuid) self.assertEqual(204, response.status_code) - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_delete_subscription_with_id_not_exists(self, mock_uuid4, mock_requests): + def test_delete_subscription_with_id_not_exists(self): dummy_uuid = str(uuid.uuid4()) response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid) self.assertEqual(404, response.status_code) -- 2.16.6 From f173f592ed958f55d992c109553760e3fb12628a Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Wed, 19 Feb 2020 16:11:18 +0800 Subject: [PATCH 15/16] Subscription and notification interfaces add http basic auth support Change-Id: I6b5a54bbd5cb989ece28c9a9344d4cba87ff6270 Issue-ID: MODELING-314 Signed-off-by: hongyuzhao --- catalog/packages/biz/notificationsutil.py | 38 +++++++++++++--------- catalog/packages/biz/nsdm_subscription.py | 2 +- catalog/packages/biz/vnf_pkg_subscription.py | 17 ++++++++-- catalog/packages/tests/const.py | 4 +-- catalog/packages/tests/test_nsdm_subscription.py | 5 ++- .../packages/tests/test_vnf_pkg_subscription.py | 3 +- 6 files changed, 47 insertions(+), 22 deletions(-) diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py index 72afe33..a18c4b3 100644 --- a/catalog/packages/biz/notificationsutil.py +++ b/catalog/packages/biz/notificationsutil.py @@ -15,7 +15,9 @@ import logging import uuid import requests +import json from rest_framework import status +from requests.auth import HTTPBasicAuth from catalog.packages import const from catalog.pub.database.models import VnfPackageModel, VnfPkgSubscriptionModel, NsdmSubscriptionModel import catalog.pub.utils.timeutil @@ -72,23 +74,29 @@ class NotificationsUtil(object): serialized_data = self.notifyserializer(data=notification) if not serialized_data.is_valid(): logger.error('Notification Data is invalid:%s.' % serialized_data.errors) - self.post_notification(callbackuri, notification) - - def post_notification(self, callbackuri, notification): - """ - params = auth_info.get("paramsBasic", {}) - username, password = params.get("userName"), params.get("password") - logger.info("Sending notification to %s, %s", callbackuri, params) - resp = None - if username: - resp = requests.post(callbackuri, - data=notification, - auth=HTTPBasicAuth(username, password)) - else: - """ + if sub.auth_info: + self.post_notification(callbackuri, notification, auth_info=json.loads(sub.auth_info)) + else: + self.post_notification(callbackuri, notification) + + def post_notification(self, callbackuri, notification, auth_info=None): try: - resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'}) + if auth_info: + if const.BASIC in auth_info.get("authType", ''): + params = auth_info.get("paramsBasic", {}) + username = params.get("userName") + password = params.get("password") + resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'}, + auth=HTTPBasicAuth(username, password)) + elif const.OAUTH2_CLIENT_CREDENTIALS in auth_info.get("authType", ''): + # todo + pass + else: + # todo + pass + else: + resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'}) if resp.status_code != status.HTTP_204_NO_CONTENT: logger.error("Sending notification to %s failed: %s" % (callbackuri, resp.text)) else: diff --git a/catalog/packages/biz/nsdm_subscription.py b/catalog/packages/biz/nsdm_subscription.py index 72eded6..1673d5f 100644 --- a/catalog/packages/biz/nsdm_subscription.py +++ b/catalog/packages/biz/nsdm_subscription.py @@ -205,7 +205,7 @@ class NsdmSubscription: subscription_save_db = { "subscriptionid": self.subscription_id, "callback_uri": self.callback_uri, - "auth_info": self.authentication, + "auth_info": json.dumps(self.authentication), "links": json.dumps(links) } for filter_type in const.NSDM_NOTIFICATION_FILTERS: diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index c457bfe..ea57420 100644 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -21,7 +21,7 @@ import uuid from collections import Counter from rest_framework import status - +from requests.auth import HTTPBasicAuth from catalog.packages import const from catalog.pub.database.models import VnfPkgSubscriptionModel from catalog.pub.exceptions import VnfPkgSubscriptionException, \ @@ -62,7 +62,20 @@ class CreateSubscription(object): logger.debug("SubscribeNotification-post::> Sending GET request " "to %s" % self.callback_uri) try: - response = requests.get(self.callback_uri, timeout=2) + if self.authentication: + if const.BASIC in self.authentication.get("authType", ''): + params = self.authentication.get("paramsBasic", {}) + username = params.get("userName") + password = params.get("password") + response = requests.get(self.callback_uri, auth=HTTPBasicAuth(username, password), timeout=2) + elif const.OAUTH2_CLIENT_CREDENTIALS in self.authentication.get("authType", ''): + # todo + pass + else: + # todo + pass + else: + response = requests.get(self.callback_uri, timeout=2) if response.status_code != status.HTTP_204_NO_CONTENT: raise VnfPkgSubscriptionException( "callbackUri %s returns %s status code." % ( diff --git a/catalog/packages/tests/const.py b/catalog/packages/tests/const.py index 79cedfc..6ad2cdb 100644 --- a/catalog/packages/tests/const.py +++ b/catalog/packages/tests/const.py @@ -590,8 +590,8 @@ vnf_subscription_data = { "BASIC" ], "paramsBasic": { - "userName": "string", - "password": "string" + "userName": "admin", + "password": "pwd1234" } } } diff --git a/catalog/packages/tests/test_nsdm_subscription.py b/catalog/packages/tests/test_nsdm_subscription.py index 0d73afd..e5e2b83 100644 --- a/catalog/packages/tests/test_nsdm_subscription.py +++ b/catalog/packages/tests/test_nsdm_subscription.py @@ -19,6 +19,7 @@ import os from django.test import TestCase from rest_framework.test import APIClient from rest_framework import status +from requests.auth import HTTPBasicAuth from catalog.packages.biz.nsdm_subscription import NsdmSubscription from catalog.pub.database.models import NsdmSubscriptionModel @@ -622,7 +623,9 @@ class TestNsdmSubscription(TestCase): } } } - mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, headers={'Connection': 'close'}) + mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, + auth=HTTPBasicAuth("username", "password"), + headers={'Connection': 'close'}) class NotificationTest(TestCase): diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index d2e2b5b..a8fd5d5 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -20,6 +20,7 @@ import mock from django.test import TestCase from rest_framework import status from rest_framework.test import APIClient +from requests.auth import HTTPBasicAuth import catalog.pub.utils.timeutil from catalog.packages import const @@ -248,7 +249,7 @@ class TestNfPackageSubscription(TestCase): } } mock_requests_post.assert_called_with(vnf_subscription_data["callbackUri"], data=expect_notification, - headers={'Connection': 'close'}) + headers={'Connection': 'close'}, auth=HTTPBasicAuth("admin", "pwd1234")) def test_service_query_single_subscription_not_found(self): try: -- 2.16.6 From 1487db0615f16783fd01998a0f71fb2d8f97a434 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Thu, 20 Feb 2020 15:18:36 +0800 Subject: [PATCH 16/16] Fix for ETSI Catalog Manager does not support HTTPS for Test Notification Endpoint and Notification Change-Id: I5c0133ea163b98c74fb668f2b77aaa95ec1cc3ec Issue-ID: MODELING-315 Signed-off-by: hongyuzhao --- catalog/packages/biz/notificationsutil.py | 21 ++++++++++++++++----- catalog/packages/biz/nsdm_subscription.py | 2 +- catalog/packages/biz/vnf_pkg_subscription.py | 5 +++-- catalog/packages/tests/test_nsdm_subscription.py | 21 ++++++++++++++++----- catalog/packages/tests/test_vnf_pkg_subscription.py | 11 +++++++++-- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py index a18c4b3..3a1c60c 100644 --- a/catalog/packages/biz/notificationsutil.py +++ b/catalog/packages/biz/notificationsutil.py @@ -87,8 +87,13 @@ class NotificationsUtil(object): params = auth_info.get("paramsBasic", {}) username = params.get("userName") password = params.get("password") - resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'}, - auth=HTTPBasicAuth(username, password)) + resp = requests.post(callbackuri, + data=notification, + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + auth=HTTPBasicAuth(username, password), + verify=False) elif const.OAUTH2_CLIENT_CREDENTIALS in auth_info.get("authType", ''): # todo pass @@ -96,9 +101,15 @@ class NotificationsUtil(object): # todo pass else: - resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'}) - if resp.status_code != status.HTTP_204_NO_CONTENT: - logger.error("Sending notification to %s failed: %s" % (callbackuri, resp.text)) + resp = requests.post(callbackuri, + data=notification, + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + verify=False) + + if resp.status_code == status.HTTP_204_NO_CONTENT: + logger.error("Sending notification to %s failed: %s" % (callbackuri, resp)) else: logger.info("Sending notification to %s successfully.", callbackuri) except: diff --git a/catalog/packages/biz/nsdm_subscription.py b/catalog/packages/biz/nsdm_subscription.py index 1673d5f..d111bc2 100644 --- a/catalog/packages/biz/nsdm_subscription.py +++ b/catalog/packages/biz/nsdm_subscription.py @@ -89,7 +89,7 @@ class NsdmSubscription: logger.debug("Create Subscription --> Test Callback URI --" "Sending GET request to %s" % self.callback_uri) try: - response = requests.get(self.callback_uri, timeout=2) + response = requests.get(self.callback_uri, timeout=2, verify=False) if response.status_code != status.HTTP_204_NO_CONTENT: raise CatalogException("callbackUri %s returns %s status " "code." % (self.callback_uri, diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index ea57420..a98fe12 100644 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -67,7 +67,8 @@ class CreateSubscription(object): params = self.authentication.get("paramsBasic", {}) username = params.get("userName") password = params.get("password") - response = requests.get(self.callback_uri, auth=HTTPBasicAuth(username, password), timeout=2) + response = requests.get(self.callback_uri, auth=HTTPBasicAuth(username, password), timeout=2, + verify=False) elif const.OAUTH2_CLIENT_CREDENTIALS in self.authentication.get("authType", ''): # todo pass @@ -75,7 +76,7 @@ class CreateSubscription(object): # todo pass else: - response = requests.get(self.callback_uri, timeout=2) + response = requests.get(self.callback_uri, timeout=2, verify=False) if response.status_code != status.HTTP_204_NO_CONTENT: raise VnfPkgSubscriptionException( "callbackUri %s returns %s status code." % ( diff --git a/catalog/packages/tests/test_nsdm_subscription.py b/catalog/packages/tests/test_nsdm_subscription.py index e5e2b83..2d95a1c 100644 --- a/catalog/packages/tests/test_nsdm_subscription.py +++ b/catalog/packages/tests/test_nsdm_subscription.py @@ -34,7 +34,6 @@ from catalog.pub.utils import toscaparser class TestNsdmSubscription(TestCase): - def setUp(self): self.client = APIClient() NsdmSubscriptionModel.objects.all().delete() @@ -466,7 +465,7 @@ class TestNsdmSubscription(TestCase): expected_data = { "status": 404, "detail": "Subscription(" + self.subscription_id + ") " - "doesn't exist" + "doesn't exist" } response = self.client.get('/api/nsd/v1/' 'subscriptions/' + self.subscription_id, @@ -625,7 +624,10 @@ class TestNsdmSubscription(TestCase): } mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, auth=HTTPBasicAuth("username", "password"), - headers={'Connection': 'close'}) + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + verify=False) class NotificationTest(TestCase): @@ -676,7 +678,13 @@ class NotificationTest(TestCase): } } } - mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, headers={'Connection': 'close'}) + mock_requests_post.assert_called_with(expect_callbackuri, + data=expect_notification, + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + verify=False + ) @mock.patch("requests.post") @mock.patch("uuid.uuid4") @@ -712,4 +720,7 @@ class NotificationTest(TestCase): } } mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, - headers={'Connection': 'close'}) + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + verify=False) diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index ab90299..17de7cf 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -243,7 +243,11 @@ class TestNfPackageSubscription(TestCase): } } mock_requests_post.assert_called_with(vnf_subscription_data["callbackUri"], data=expect_notification, - headers={'Connection': 'close'}, auth=HTTPBasicAuth("admin", "pwd1234")) + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + auth=HTTPBasicAuth("admin", "pwd1234"), + verify=False) def test_service_query_single_subscription_not_found(self): try: @@ -314,4 +318,7 @@ class NotificationTest(TestCase): } } mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification, - headers={'Connection': 'close'}) + headers={'Connection': 'close', + 'content-type': 'application/json', + 'accept': 'application/json'}, + verify=False) -- 2.16.6