aboutsummaryrefslogtreecommitdiffstats
path: root/src/onapsdk/msb
diff options
context:
space:
mode:
Diffstat (limited to 'src/onapsdk/msb')
-rw-r--r--src/onapsdk/msb/__init__.py17
-rw-r--r--src/onapsdk/msb/esr.py85
-rw-r--r--src/onapsdk/msb/k8s/__init__.py17
-rw-r--r--src/onapsdk/msb/k8s/connectivity_info.py105
-rw-r--r--src/onapsdk/msb/k8s/definition.py424
-rw-r--r--src/onapsdk/msb/k8s/instance.py190
-rw-r--r--src/onapsdk/msb/msb_service.py24
-rw-r--r--src/onapsdk/msb/multicloud.py55
-rw-r--r--src/onapsdk/msb/templates/msb_esr_vim_registration.json.j231
-rw-r--r--src/onapsdk/msb/templates/multicloud_k8s_add_connectivity_info.json.j28
-rw-r--r--src/onapsdk/msb/templates/multicloud_k8s_add_definition.json.j27
-rw-r--r--src/onapsdk/msb/templates/multicloud_k8s_create_configuration_template.json.j24
-rw-r--r--src/onapsdk/msb/templates/multicloud_k8s_create_profile_for_definition.json.j28
-rw-r--r--src/onapsdk/msb/templates/multicloud_k8s_instantiate.json.j218
14 files changed, 993 insertions, 0 deletions
diff --git a/src/onapsdk/msb/__init__.py b/src/onapsdk/msb/__init__.py
new file mode 100644
index 0000000..6b23278
--- /dev/null
+++ b/src/onapsdk/msb/__init__.py
@@ -0,0 +1,17 @@
+"""Microsevice bus package."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from .msb_service import MSB
+from .esr import ESR
+from .multicloud import Multicloud
diff --git a/src/onapsdk/msb/esr.py b/src/onapsdk/msb/esr.py
new file mode 100644
index 0000000..b29cfa4
--- /dev/null
+++ b/src/onapsdk/msb/esr.py
@@ -0,0 +1,85 @@
+"""ESR module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from onapsdk.utils.jinja import jinja_env
+from .msb_service import MSB
+
+
+class ESR(MSB):
+ """External system EST module."""
+
+ base_url = f"{MSB.base_url}/api/aai-esr-server/v1/vims"
+
+ @classmethod
+ def register_vim(cls, # pylint: disable=too-many-arguments
+ cloud_owner: str,
+ cloud_region_id: str,
+ cloud_type: str,
+ cloud_region_version: str,
+ auth_info_cloud_domain: str,
+ auth_info_username: str,
+ auth_info_password: str,
+ auth_info_url: str,
+ owner_defined_type: str = None,
+ cloud_zone: str = None,
+ physical_location_id: str = None,
+ cloud_extra_info: str = None,
+ auth_info_ssl_cacert: str = None,
+ auth_info_ssl_insecure: bool = None) -> None:
+ """Register VIM.
+
+ Args:
+ cloud_owner (str): cloud owner name, can be customized, e.g. att-aic
+ cloud_region_id (str): cloud region info based on deployment, e.g. RegionOne
+ cloud_type (str): type of the cloud, decides which multicloud plugin to use,
+ openstack or vio
+ cloud_region_version (str): cloud version, ocata, mitaka or other
+ auth_info_cloud_domain (str): domain info for keystone v3
+ auth_info_username (str): user name
+ auth_info_password (str): password
+ auth_info_url (str): authentication url of the cloud, e.g. keystone url
+ owner_defined_type (str, optional): cloud-owner defined type indicator (e.g., dcp, lcp).
+ Defaults to None.
+ cloud_zone (str, optional): zone where the cloud is homed.. Defaults to None.
+ physical_location_id (str, optional): complex physical location id for
+ cloud-region instance. Defaults to None.
+ cloud_extra_info (str, optional): extra info for Cloud. Defaults to None.
+ auth_info_ssl_cacert (str, optional): ca file content if enabled ssl on auth-url.
+ Defaults to None.
+ auth_info_ssl_insecure (bool, optional): whether to verify VIM's certificate.
+ Defaults to None.
+ """
+ cls.send_message(
+ "POST",
+ "Register VIM instance to ONAP",
+ cls.base_url,
+ data=jinja_env()
+ .get_template("msb_esr_vim_registration.json.j2")
+ .render(
+ cloud_owner=cloud_owner,
+ cloud_region_id=cloud_region_id,
+ cloud_type=cloud_type,
+ cloud_region_version=cloud_region_version,
+ auth_info_cloud_domain=auth_info_cloud_domain,
+ auth_info_username=auth_info_username,
+ auth_info_password=auth_info_password,
+ auth_info_url=auth_info_url,
+ owner_defined_type=owner_defined_type,
+ cloud_zone=cloud_zone,
+ physical_location_id=physical_location_id,
+ cloud_extra_info=cloud_extra_info,
+ auth_info_ssl_cacert=auth_info_ssl_cacert,
+ auth_info_ssl_insecure=auth_info_ssl_insecure,
+ ),
+ )
diff --git a/src/onapsdk/msb/k8s/__init__.py b/src/onapsdk/msb/k8s/__init__.py
new file mode 100644
index 0000000..655502d
--- /dev/null
+++ b/src/onapsdk/msb/k8s/__init__.py
@@ -0,0 +1,17 @@
+"""K8s package."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from .definition import Definition, Profile, ConfigurationTemplate
+from .connectivity_info import ConnectivityInfo
+from .instance import InstantiationParameter, InstantiationRequest, Instance
diff --git a/src/onapsdk/msb/k8s/connectivity_info.py b/src/onapsdk/msb/k8s/connectivity_info.py
new file mode 100644
index 0000000..71a43c1
--- /dev/null
+++ b/src/onapsdk/msb/k8s/connectivity_info.py
@@ -0,0 +1,105 @@
+"""Connectivity-Info module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from onapsdk.utils.jinja import jinja_env
+from ..msb_service import MSB
+
+
+class ConnectivityInfo(MSB):
+ """Connectivity-Info class."""
+
+ api_version = "/api/multicloud-k8s/v1/v1"
+ url = f"{MSB.base_url}{api_version}/connectivity-info"
+
+ def __init__(self, cloud_region_id: str,
+ cloud_owner: str,
+ other_connectivity_list: dict,
+ kubeconfig: str) -> None:
+ """Connectivity-info object initialization.
+
+ Args:
+ cloud_region_id (str): Cloud region ID
+ cloud_owner (str): Cloud owner name
+ other_connectivity_list (dict): Optional other connectivity list
+ kubeconfig (str): kubernetes cluster kubeconfig
+ """
+ super().__init__()
+ self.cloud_region_id: str = cloud_region_id
+ self.cloud_owner: str = cloud_owner
+ self.other_connectivity_list: dict = other_connectivity_list
+ self.kubeconfig: str = kubeconfig
+
+ @classmethod
+ def get_connectivity_info_by_region_id(cls, cloud_region_id: str) -> "ConnectivityInfo":
+ """Get connectivity-info by its name (cloud region id).
+
+ Args:
+ cloud_region_id (str): Cloud region ID
+
+ Returns:
+ ConnectivityInfo: Connectivity-Info object
+
+ """
+ url: str = f"{cls.url}/{cloud_region_id}"
+ connectivity_info: dict = cls.send_message_json(
+ "GET",
+ "Get Connectivity Info",
+ url
+ )
+ return cls(
+ connectivity_info["cloud-region"],
+ connectivity_info["cloud-owner"],
+ connectivity_info.get("other-connectivity-list"),
+ connectivity_info["kubeconfig"]
+ )
+
+ def delete(self) -> None:
+ """Delete connectivity info."""
+ url: str = f"{self.url}/{self.cloud_region_id}"
+ self.send_message(
+ "DELETE",
+ "Delete Connectivity Info",
+ url
+ )
+
+ @classmethod
+ def create(cls,
+ cloud_region_id: str,
+ cloud_owner: str,
+ kubeconfig: bytes = None) -> "ConnectivityInfo":
+ """Create Connectivity Info.
+
+ Args:
+ cloud_region_id (str): Cloud region ID
+ cloud_owner (str): Cloud owner name
+ kubeconfig (bytes): kubernetes cluster kubeconfig file
+
+ Returns:
+ ConnectivityInfo: Created object
+
+ """
+ json_file = jinja_env().get_template("multicloud_k8s_add_connectivity_info.json.j2").render(
+ cloud_region_id=cloud_region_id,
+ cloud_owner=cloud_owner
+ )
+ url: str = f"{cls.url}"
+ cls.send_message(
+ "POST",
+ "Create Connectivity Info",
+ url,
+ files={"file": kubeconfig,
+ "metadata": (None, json_file)},
+ headers={}
+ )
+ return cls.get_connectivity_info_by_region_id(cloud_region_id)
diff --git a/src/onapsdk/msb/k8s/definition.py b/src/onapsdk/msb/k8s/definition.py
new file mode 100644
index 0000000..6c0def2
--- /dev/null
+++ b/src/onapsdk/msb/k8s/definition.py
@@ -0,0 +1,424 @@
+"""Definition module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from typing import Iterator
+from dataclasses import dataclass
+
+from onapsdk.utils.jinja import jinja_env
+from ..msb_service import MSB
+
+
+# pylint: disable=too-many-arguments, too-few-public-methods
+class DefinitionBase(MSB):
+ """DefinitionBase class."""
+
+ base_url = f"{MSB.base_url}/api/multicloud-k8s/v1/v1/rb/definition"
+
+ def __init__(self, rb_name: str,
+ rb_version: str) -> None:
+ """Definition-Base object initialization.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ """
+ super().__init__()
+ self.rb_name: str = rb_name
+ self.rb_version: str = rb_version
+
+ @property
+ def url(self) -> str:
+ """URL address for Definition Based calls.
+
+ Returns:
+ str: URL to RB Definition
+
+ """
+ return f"{self.base_url}/{self.rb_name}/{self.rb_version}"
+
+ def delete(self) -> None:
+ """Delete Definition Based object."""
+ self.send_message(
+ "DELETE",
+ f"Delete {self.__class__.__name__}",
+ self.url
+ )
+
+ def upload_artifact(self, package: bytes = None):
+ """Upload artifact.
+
+ Args:
+ package (bytes): Artifact to be uploaded to multicloud-k8s plugin
+
+ """
+ url: str = f"{self.url}/content"
+ self.send_message(
+ "POST",
+ "Upload Artifact content",
+ url,
+ data=package,
+ headers={}
+ )
+
+
+class Definition(DefinitionBase):
+ """Definition class."""
+
+ def __init__(self, rb_name: str,
+ rb_version: str,
+ chart_name: str,
+ description: str,
+ labels: dict) -> None:
+ """Definition object initialization.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ chart_name (str): Chart name, optional field, will be detected if it is not provided
+ description (str): Definition description
+ labels (str): Labels
+ """
+ super().__init__(rb_name, rb_version)
+ self.rb_name: str = rb_name
+ self.rb_version: str = rb_version
+ self.chart_name: str = chart_name
+ self.description: str = description
+ self.labels: dict = labels
+
+ @classmethod
+ def get_all(cls):
+ """Get all definitions.
+
+ Yields:
+ Definition: Definition object
+
+ """
+ for definition in cls.send_message_json("GET",
+ "Get definitions",
+ cls.base_url):
+ yield cls(
+ definition["rb-name"],
+ definition["rb-version"],
+ definition.get("chart-name"),
+ definition.get("description"),
+ definition.get("labels")
+ )
+
+ @classmethod
+ def get_definition_by_name_version(cls, rb_name: str, rb_version: str) -> "Definition":
+ """Get definition by it's name and version.
+
+ Args:
+ rb_name (str): definition name
+ rb_version (str): definition version
+
+ Returns:
+ Definition: Definition object
+
+ """
+ url: str = f"{cls.base_url}/{rb_name}/{rb_version}"
+ definition: dict = cls.send_message_json(
+ "GET",
+ "Get definition",
+ url
+ )
+ return cls(
+ definition["rb-name"],
+ definition["rb-version"],
+ definition.get("chart-name"),
+ definition.get("description"),
+ definition.get("labels")
+ )
+
+ @classmethod
+ def create(cls, rb_name: str,
+ rb_version: str,
+ chart_name: str = "",
+ description: str = "",
+ labels=None) -> "Definition":
+ """Create Definition.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ chart_name (str): Chart name, optional field, will be detected if it is not provided
+ description (str): Definition description
+ labels (str): Labels
+
+ Returns:
+ Definition: Created object
+
+ """
+ if labels is None:
+ labels = {}
+ url: str = f"{cls.base_url}"
+ cls.send_message(
+ "POST",
+ "Create definition",
+ url,
+ data=jinja_env().get_template("multicloud_k8s_add_definition.json.j2").render(
+ rb_name=rb_name,
+ rb_version=rb_version,
+ chart_name=chart_name,
+ description=description,
+ labels=labels
+ )
+ )
+ return cls.get_definition_by_name_version(rb_name, rb_version)
+
+ def create_profile(self, profile_name: str,
+ namespace: str,
+ kubernetes_version: str,
+ release_name=None) -> "Profile":
+ """Create Profile for Definition.
+
+ Args:
+ profile_name (str): Name of profile
+ namespace (str): Namespace that service is created in
+ kubernetes_version (str): Required Kubernetes version
+ release_name (str): Release name
+
+ Returns:
+ Profile: Created object
+
+ """
+ url: str = f"{self.url}/profile"
+ if release_name is None:
+ release_name = profile_name
+ self.send_message(
+ "POST",
+ "Create profile for definition",
+ url,
+ data=jinja_env().get_template("multicloud_k8s_create_profile_"
+ "for_definition.json.j2").render(
+ rb_name=self.rb_name,
+ rb_version=self.rb_version,
+ profile_name=profile_name,
+ release_name=release_name,
+ namespace=namespace,
+ kubernetes_version=kubernetes_version
+ )
+ )
+ return self.get_profile_by_name(profile_name)
+
+ def get_all_profiles(self) -> Iterator["Profile"]:
+ """Get all profiles.
+
+ Yields:
+ Profile: Profile object
+
+ """
+ url: str = f"{self.url}/profile"
+
+ for profile in self.send_message_json("GET",
+ "Get profiles",
+ url):
+ yield Profile(
+ profile["rb-name"],
+ profile["rb-version"],
+ profile["profile-name"],
+ profile["namespace"],
+ profile.get("kubernetes-version"),
+ profile.get("labels"),
+ profile.get("release-name")
+ )
+
+ def get_profile_by_name(self, profile_name: str) -> "Profile":
+ """Get profile by it's name.
+
+ Args:
+ profile_name (str): profile name
+
+ Returns:
+ Profile: Profile object
+
+ """
+ url: str = f"{self.url}/profile/{profile_name}"
+
+ profile: dict = self.send_message_json(
+ "GET",
+ "Get profile",
+ url
+ )
+ return Profile(
+ profile["rb-name"],
+ profile["rb-version"],
+ profile["profile-name"],
+ profile["namespace"],
+ profile.get("kubernetes-version"),
+ profile.get("labels"),
+ profile.get("release-name")
+ )
+
+ def get_all_configuration_templates(self):
+ """Get all configuration templates.
+
+ Yields:
+ ConfigurationTemplate: ConfigurationTemplate object
+
+ """
+ url: str = f"{self.url}/config-template"
+
+ for template in self.send_message_json("GET",
+ "Get configuration templates",
+ url):
+ yield ConfigurationTemplate(
+ self.rb_name,
+ self.rb_version,
+ template["template-name"],
+ template.get("description")
+ )
+
+ def create_configuration_template(self, template_name: str,
+ description="") -> "ConfigurationTemplate":
+ """Create configuration template.
+
+ Args:
+ template_name (str): Name of the template
+ description (str): Description
+
+ Returns:
+ ConfigurationTemplate: Created object
+
+ """
+ url: str = f"{self.url}/config-template"
+
+ self.send_message(
+ "POST",
+ "Create configuration template",
+ url,
+ data=jinja_env().get_template("multicloud_k8s_create_configuration_"
+ "template.json.j2").render(
+ template_name=template_name,
+ description=description
+ )
+ )
+
+ return self.get_configuration_template_by_name(template_name)
+
+ def get_configuration_template_by_name(self, template_name: str) -> "ConfigurationTemplate":
+ """Get configuration template.
+
+ Args:
+ template_name (str): Name of the template
+
+ Returns:
+ ConfigurationTemplate: object
+
+ """
+ url: str = f"{self.url}/config-template/{template_name}"
+
+ template: dict = self.send_message_json(
+ "GET",
+ "Get Configuration template",
+ url
+ )
+ return ConfigurationTemplate(
+ self.rb_name,
+ self.rb_version,
+ template["template-name"],
+ template.get("description")
+ )
+
+
+class ProfileBase(DefinitionBase):
+ """ProfileBase class."""
+
+ def __init__(self, rb_name: str,
+ rb_version: str,
+ profile_name: str) -> None:
+ """Profile-Base object initialization.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ profile_name (str): Name of profile
+ """
+ super().__init__(rb_name, rb_version)
+ self.rb_name: str = rb_name
+ self.rb_version: str = rb_version
+ self.profile_name: str = profile_name
+
+ @property
+ def url(self) -> str:
+ """URL address for Profile calls.
+
+ Returns:
+ str: URL to RB Profile
+
+ """
+ return f"{super().url}/profile/{self.profile_name}"
+
+
+@dataclass
+class Profile(ProfileBase):
+ """Profile class."""
+
+ def __init__(self, rb_name: str,
+ rb_version: str,
+ profile_name: str,
+ namespace: str,
+ kubernetes_version: str,
+ labels=None,
+ release_name=None) -> None:
+ """Profile object initialization.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ profile_name (str): Name of profile
+ release_name (str): Release name, if release_name is not provided,
+ namespace (str): Namespace that service is created in
+ kubernetes_version (str): Required Kubernetes version
+ labels (dict): Labels
+ """
+ super().__init__(rb_name, rb_version, profile_name)
+ if release_name is None:
+ release_name = profile_name
+ self.release_name: str = release_name
+ self.namespace: str = namespace
+ self.kubernetes_version: str = kubernetes_version
+ self.labels: dict = labels
+ if self.labels is None:
+ self.labels = dict()
+
+
+class ConfigurationTemplate(DefinitionBase):
+ """ConfigurationTemplate class."""
+
+ @property
+ def url(self) -> str:
+ """URL address for ConfigurationTemplate calls.
+
+ Returns:
+ str: URL to Configuration template in Multicloud-k8s API.
+
+ """
+ return f"{super().url}/config-template/{self.template_name}"
+
+ def __init__(self, rb_name: str,
+ rb_version: str,
+ template_name: str,
+ description="") -> None:
+ """Configuration-Template object initialization.
+
+ Args:
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ template_name (str): Configuration template name
+ description (str): Namespace that service is created in
+ """
+ super().__init__(rb_name, rb_version)
+ self.template_name: str = template_name
+ self.description: str = description
diff --git a/src/onapsdk/msb/k8s/instance.py b/src/onapsdk/msb/k8s/instance.py
new file mode 100644
index 0000000..196b9d2
--- /dev/null
+++ b/src/onapsdk/msb/k8s/instance.py
@@ -0,0 +1,190 @@
+"""Instantiation module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from typing import Iterator
+from dataclasses import dataclass
+
+from onapsdk.msb import MSB
+from onapsdk.utils.jinja import jinja_env
+
+
+# pylint: disable=too-many-arguments
+@dataclass
+class InstantiationRequest:
+ """Instantiation Request class."""
+
+ def __init__(self, request: dict) -> None:
+ """Request object initialization.
+
+ Args:
+ cloud_region_id (str): Cloud region ID
+ profile_name (str): Name of profile
+ rb_name (str): Definition name
+ rb_version (str): Definition version
+ override_values (dict): Optional parameters
+ labels (dict): Optional labels
+ """
+ super().__init__()
+ self.cloud_region_id: str = request["cloud-region"]
+ self.profile_name: str = request["profile-name"]
+ self.rb_name: str = request["rb-name"]
+ self.rb_version: str = request["rb-version"]
+ self.override_values: dict = request["override-values"]
+ self.labels: dict = request["labels"]
+
+
+@dataclass
+class InstantiationParameter:
+ """Class to store instantiation parameters used to pass override_values and labels.
+
+ Contains two values: name of parameter and it's value
+ """
+
+ name: str
+ value: str
+
+
+class Instance(MSB):
+ """Instance class."""
+
+ base_url = f"{MSB.base_url}/api/multicloud-k8s/v1/v1/instance"
+
+ def __init__(self, instance_id: str,
+ namespace: str,
+ request: InstantiationRequest,
+ resources: dict = None,
+ override_values: dict = None) -> None:
+ """Instance object initialization.
+
+ Args:
+ instance_id (str): instance ID
+ namespace (str): namespace that instance is created in
+ request (InstantiationRequest): datails of the instantiation request
+ resources (dict): Created resources
+ override_values (dict): Optional values
+ """
+ super().__init__()
+ self.instance_id: str = instance_id
+ self.namespace: str = namespace
+ self.request: InstantiationRequest = request
+ self.resources: dict = resources
+ self.override_values: dict = override_values
+
+ @property
+ def url(self) -> str:
+ """URL address.
+
+ Returns:
+ str: URL to Instance
+
+ """
+ return f"{self.base_url}/{self.instance_id}"
+
+ @classmethod
+ def get_all(cls) -> Iterator["Instance"]:
+ """Get all instantiated Kubernetes resources.
+
+ Yields:
+ Instantiation: Instantiation object
+
+ """
+ for resource in cls.send_message_json("GET",
+ "Get Kubernetes resources",
+ cls.base_url):
+ yield cls(
+ instance_id=resource["id"],
+ namespace=resource["namespace"],
+ request=InstantiationRequest(resource["request"])
+ )
+
+ @classmethod
+ def get_by_id(cls, instance_id: str) -> "Instance":
+ """Get Kubernetes resource by id.
+
+ Args:
+ instance_id (str): instance ID
+
+ Returns:
+ Instantiation: Instantiation object
+
+ """
+ url: str = f"{cls.base_url}/{instance_id}"
+ resource: dict = cls.send_message_json(
+ "GET",
+ "Get Kubernetes resource by id",
+ url
+ )
+ return cls(
+ instance_id=resource["id"],
+ namespace=resource["namespace"],
+ request=InstantiationRequest(resource["request"]),
+ resources=resource["resources"],
+ override_values=resource.get("override-values")
+ )
+
+ @classmethod
+ def create(cls,
+ cloud_region_id: str,
+ profile_name: str,
+ rb_name: str,
+ rb_version: str,
+ override_values: dict = None,
+ labels: dict = None) -> "Instance":
+ """Create Instance.
+
+ Args:
+ cloud_region_id (str): Cloud region ID
+ profile_name (str): Name of profile to be instantiated
+ rb_name: (bytes): Definition name
+ rb_version (str): Definition version
+ override_values (dict): List of optional override values
+ labels (dict): List of optional labels
+
+ Returns:
+ Instance: Created object
+
+ """
+ if labels is None:
+ labels = {}
+ if override_values is None:
+ override_values = {}
+ url: str = f"{cls.base_url}"
+ response: dict = cls.send_message_json(
+ "POST",
+ "Create Instance",
+ url,
+ data=jinja_env().get_template("multicloud_k8s_instantiate.json.j2").render(
+ cloud_region_id=cloud_region_id,
+ profile_name=profile_name,
+ rb_name=rb_name,
+ rb_version=rb_version,
+ override_values=override_values,
+ labels=labels),
+ headers={}
+ )
+ return cls(
+ instance_id=response["id"],
+ namespace=response["namespace"],
+ request=InstantiationRequest(response["request"]),
+ resources=response["resources"],
+ override_values=response.get("override-values")
+ )
+
+ def delete(self) -> None:
+ """Delete Instance object."""
+ self.send_message(
+ "DELETE",
+ f"Delete {self.instance_id} instance",
+ self.url
+ )
diff --git a/src/onapsdk/msb/msb_service.py b/src/onapsdk/msb/msb_service.py
new file mode 100644
index 0000000..017fed7
--- /dev/null
+++ b/src/onapsdk/msb/msb_service.py
@@ -0,0 +1,24 @@
+"""Microsevice bus module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from onapsdk.configuration import settings
+from onapsdk.onap_service import OnapService
+from onapsdk.utils.headers_creator import headers_msb_creator
+
+
+class MSB(OnapService):
+ """Microservice Bus base class."""
+
+ base_url = settings.MSB_URL
+ headers = headers_msb_creator(OnapService.headers)
diff --git a/src/onapsdk/msb/multicloud.py b/src/onapsdk/msb/multicloud.py
new file mode 100644
index 0000000..bc8b468
--- /dev/null
+++ b/src/onapsdk/msb/multicloud.py
@@ -0,0 +1,55 @@
+"""Multicloud module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from .msb_service import MSB
+
+
+class Multicloud(MSB):
+ """MSB subclass to register/unregister instance to ONAP."""
+
+ base_url = f"{MSB.base_url}/api/multicloud/v1"
+
+ @classmethod
+ def register_vim(cls,
+ cloud_owner: str,
+ cloud_region_id: str,
+ default_tenant: str = None) -> None:
+ """Register a VIM instance to ONAP.
+
+ Args:
+ cloud_owner (str): Cloud owner name
+ cloud_region_id (str): Cloud region ID
+ default_tenant (str, optional): Default tenant name. Defaults to None.
+ """
+ cls.send_message(
+ "POST",
+ "Register VIM instance to ONAP",
+ f"{cls.base_url}/{cloud_owner}/{cloud_region_id}/registry",
+ data={"defaultTenant": default_tenant} if default_tenant else None
+ )
+
+ @classmethod
+ def unregister_vim(cls, cloud_owner: str, cloud_region_id: str) -> None:
+ """Unregister a VIM instance from ONAP.
+
+ Args:
+ cloud_owner (str): Cloud owner name
+ cloud_region_id (str): Cloud region ID
+ """
+ cls.send_message(
+ "DELETE",
+ "Unregister VIM instance from ONAP",
+ f"{cls.base_url}/{cloud_owner}/{cloud_region_id}"
+ )
diff --git a/src/onapsdk/msb/templates/msb_esr_vim_registration.json.j2 b/src/onapsdk/msb/templates/msb_esr_vim_registration.json.j2
new file mode 100644
index 0000000..ba19258
--- /dev/null
+++ b/src/onapsdk/msb/templates/msb_esr_vim_registration.json.j2
@@ -0,0 +1,31 @@
+{
+ "cloudOwner": "{{ cloud_owner }}",
+ "cloudRegionId": "{{ cloud_region_id }}",
+ "cloudType": "{{ cloud_type }}",
+ "cloudRegionVersion": "{{ cloud_region_version }}"
+ {% if owner_defined_type %}
+ , "ownerDefinedType": "{{ owner_defined_type }}"
+ {% endif %}
+ {% if cloud_zone %}
+ , "cloudZone": "{{ cloud_zone }}"
+ {% endif %}
+ {% if complex_name %}
+ , "physicalLocationId": "{{ physical_location_id }}"
+ {% endif %}
+ {% if cloud_extra_info %}
+ , "cloudExtraInfo": "{{ cloud_extra_info }}"
+ {% endif %}
+ , "vimAuthInfos":
+ [{
+ "userName": "{{ auth_info_username }}",
+ "password": "{{ auth_info_password }}",
+ "authUrl": "{{ auth_info_url }}",
+ "cloudDomain": "{{ auth_info_cloud_domain }}"
+ {% if auth_info_ssl_cacert %}
+ , "sslCacert": "{{ auth_info_ssl_cacert }}"
+ {% endif %}
+ {% if auth_info_ssl_insecure is not none %}
+ , "sslInsecure": {{ auth_info_ssl_insecure | tojson }}
+ {% endif %}
+ }]
+}
diff --git a/src/onapsdk/msb/templates/multicloud_k8s_add_connectivity_info.json.j2 b/src/onapsdk/msb/templates/multicloud_k8s_add_connectivity_info.json.j2
new file mode 100644
index 0000000..4a3dc2d
--- /dev/null
+++ b/src/onapsdk/msb/templates/multicloud_k8s_add_connectivity_info.json.j2
@@ -0,0 +1,8 @@
+{
+ "cloud-region" : "{{ cloud_region_id }}",
+ "cloud-owner" : "{{ cloud_owner }}",
+ "other-connectivity-list" : {
+ "connectivity-records" : [
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/onapsdk/msb/templates/multicloud_k8s_add_definition.json.j2 b/src/onapsdk/msb/templates/multicloud_k8s_add_definition.json.j2
new file mode 100644
index 0000000..866d577
--- /dev/null
+++ b/src/onapsdk/msb/templates/multicloud_k8s_add_definition.json.j2
@@ -0,0 +1,7 @@
+{
+ "rb-name": "{{ rb_name }}",
+ "rb-version": "{{ rb_version }}",
+ "chart-name": "{{ chart_name }}",
+ "description": "{{ description }}",
+ "labels": {{ labels }}
+}
diff --git a/src/onapsdk/msb/templates/multicloud_k8s_create_configuration_template.json.j2 b/src/onapsdk/msb/templates/multicloud_k8s_create_configuration_template.json.j2
new file mode 100644
index 0000000..61e6d2b
--- /dev/null
+++ b/src/onapsdk/msb/templates/multicloud_k8s_create_configuration_template.json.j2
@@ -0,0 +1,4 @@
+{
+ "template-name": "{{ template_name }}",
+ "description": "{{ description }}"
+} \ No newline at end of file
diff --git a/src/onapsdk/msb/templates/multicloud_k8s_create_profile_for_definition.json.j2 b/src/onapsdk/msb/templates/multicloud_k8s_create_profile_for_definition.json.j2
new file mode 100644
index 0000000..5ea2de1
--- /dev/null
+++ b/src/onapsdk/msb/templates/multicloud_k8s_create_profile_for_definition.json.j2
@@ -0,0 +1,8 @@
+{
+ "rb-name": "{{ rb_name }}",
+ "rb-version": "{{ rb_version }}",
+ "profile-name": "{{ profile_name }}",
+ "release-name": "{{ release_name }}",
+ "namespace": "{{ namespace }}",
+ "kubernetes-version": "{{ kubernetes_version }}"
+} \ No newline at end of file
diff --git a/src/onapsdk/msb/templates/multicloud_k8s_instantiate.json.j2 b/src/onapsdk/msb/templates/multicloud_k8s_instantiate.json.j2
new file mode 100644
index 0000000..fa5ef66
--- /dev/null
+++ b/src/onapsdk/msb/templates/multicloud_k8s_instantiate.json.j2
@@ -0,0 +1,18 @@
+{
+ "cloud-region": "{{ cloud_region_id }}",
+ "profile-name": "{{ profile_name }}",
+ "rb-name": "{{ rb_name }}",
+ "rb-version": "{{ rb_version }}",
+ "override-values":
+ {
+ {% for override_value in override_values %}
+ "{{ override_value.name }}": "{{ override_value.value }}"{% if not loop.last %},{% endif %}
+ {% endfor %}
+ },
+ "labels":
+ {
+ {% for label in labels %}
+ "{{ label.name }}": "{{ label.value }}"{% if not loop.last %},{% endif %}
+ {% endfor %}
+ }
+} \ No newline at end of file