aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/onapsdk/aai/aai_element.py20
-rw-r--r--src/onapsdk/aai/business/customer.py22
-rw-r--r--src/onapsdk/aai/business/line_of_business.py15
-rw-r--r--src/onapsdk/aai/business/owning_entity.py16
-rw-r--r--src/onapsdk/aai/business/platform.py8
-rw-r--r--src/onapsdk/aai/business/project.py8
-rw-r--r--src/onapsdk/aai/cloud_infrastructure/cloud_region.py3
-rw-r--r--src/onapsdk/aai/cloud_infrastructure/tenant.py16
-rw-r--r--src/onapsdk/aai/mixins/link_to_complex.py4
-rw-r--r--src/onapsdk/aai/mixins/link_to_project.py65
-rw-r--r--src/onapsdk/aai/mixins/link_to_tenant.py69
-rw-r--r--src/onapsdk/aai/network/site_resource.py3
-rw-r--r--src/onapsdk/aai/templates/aai_delete_relationship.json.j211
-rw-r--r--tests/test_aai_customer.py102
-rw-r--r--tests/test_aai_line_of_business.py11
-rw-r--r--tests/test_aai_owning_entity.py41
-rw-r--r--tests/test_aai_platform.py19
-rw-r--r--tests/test_aai_project.py63
-rw-r--r--tests/test_aai_service.py9
-rw-r--r--tests/test_aai_tenant.py130
20 files changed, 552 insertions, 83 deletions
diff --git a/src/onapsdk/aai/aai_element.py b/src/onapsdk/aai/aai_element.py
index 907028d..5b72f95 100644
--- a/src/onapsdk/aai/aai_element.py
+++ b/src/onapsdk/aai/aai_element.py
@@ -215,6 +215,7 @@ class AaiResource(AaiElement):
relationship (Relationship): Relationship to add
"""
+ self._logger.info("Adding relationship to aai resource")
self.send_message(
"PUT",
f"add relationship to {self.__class__.__name__}",
@@ -223,3 +224,22 @@ class AaiResource(AaiElement):
.get_template("aai_add_relationship.json.j2")
.render(relationship=relationship),
)
+
+ def delete_relationship(self, relationship: Relationship) -> None:
+ """Delete relationship from aai resource.
+
+ Delete relationship from resource using A&AI API
+
+ Args:
+ relationship (Relationship): Relationship to delete
+
+ """
+ self._logger.info("Deleting relationship from aai resource")
+ self.send_message(
+ "DELETE",
+ f"delete relationship from {self.__class__.__name__}",
+ f"{self.url}/relationship-list/relationship",
+ data=jinja_env()
+ .get_template("aai_delete_relationship.json.j2")
+ .render(relationship=relationship),
+ )
diff --git a/src/onapsdk/aai/business/customer.py b/src/onapsdk/aai/business/customer.py
index cdefd6f..1df1bc2 100644
--- a/src/onapsdk/aai/business/customer.py
+++ b/src/onapsdk/aai/business/customer.py
@@ -265,8 +265,8 @@ class ServiceSubscription(AaiResource):
yield CloudRegion.get_by_id(cloud_owner=cloud_region_data[0],
cloud_region_id=cloud_region_data[1])
except ResourceNotFound:
- self._logger.error("Can't get cloud region %s %s", cloud_region_data[0], \
- cloud_region_data[1])
+ self._logger.error("Can't get cloud region %s %s", cloud_region_data[0],
+ cloud_region_data[1])
@property
def tenants(self) -> Iterator["Tenant"]:
@@ -560,7 +560,7 @@ class Customer(AaiResource):
)
except ResourceNotFound as exc:
self._logger.info(
- "Subscriptions are not " \
+ "Subscriptions are not "
"found for a customer: %s", exc)
except APIError as exc:
self._logger.error(
@@ -590,6 +590,22 @@ class Customer(AaiResource):
)
return self.get_service_subscription_by_service_type(service_type)
+ def delete_subscribed_service(self, service_sub: ServiceSubscription) -> None:
+ """Delete SDC Service subscription.
+
+ Args:
+ service_sub (str): Value defined by orchestration to identify this service
+ across ONAP.
+ """
+ self.send_message(
+ "DELETE",
+ "Delete service subscription",
+ (f"{self.base_url}{self.api_version}/business/customers/"
+ f"customer/{self.global_customer_id}/service-subscriptions/"
+ f"service-subscription/{service_sub.service_type}?"
+ f"resource-version={service_sub.resource_version}")
+ )
+
def delete(self) -> None:
"""Delete customer.
diff --git a/src/onapsdk/aai/business/line_of_business.py b/src/onapsdk/aai/business/line_of_business.py
index 61fc0f8..a1b807d 100644
--- a/src/onapsdk/aai/business/line_of_business.py
+++ b/src/onapsdk/aai/business/line_of_business.py
@@ -16,11 +16,12 @@
from typing import Any, Dict, Iterator
from onapsdk.utils.jinja import jinja_env
+from onapsdk.aai.mixins.link_to_tenant import AaiResourceLinkToTenantMixin
from ..aai_element import AaiResource
-class LineOfBusiness(AaiResource):
+class LineOfBusiness(AaiResource, AaiResourceLinkToTenantMixin):
"""Line of business class."""
def __init__(self, name: str, resource_version: str) -> None:
@@ -121,3 +122,15 @@ class LineOfBusiness(AaiResource):
f"Get {name} line of business",
url)
return cls(response["line-of-business-name"], response["resource-version"])
+
+ def delete(self) -> None:
+ """Delete line of business.
+
+ Sends request to A&AI to delete line of business object.
+
+ """
+ self.send_message(
+ "DELETE",
+ f"Delete line of business",
+ f"{self.url}?resource-version={self.resource_version}"
+ )
diff --git a/src/onapsdk/aai/business/owning_entity.py b/src/onapsdk/aai/business/owning_entity.py
index bf1e7c1..ebe9b11 100644
--- a/src/onapsdk/aai/business/owning_entity.py
+++ b/src/onapsdk/aai/business/owning_entity.py
@@ -21,8 +21,10 @@ from onapsdk.exceptions import ResourceNotFound
from ..aai_element import AaiResource
+from ..mixins.link_to_tenant import AaiResourceLinkToTenantMixin
-class OwningEntity(AaiResource):
+
+class OwningEntity(AaiResource, AaiResourceLinkToTenantMixin):
"""Owning entity class."""
def __init__(self, name: str, owning_entity_id: str, resource_version: str) -> None:
@@ -152,3 +154,15 @@ class OwningEntity(AaiResource):
)
)
return cls.get_by_owning_entity_id(owning_entity_id)
+
+ def delete(self) -> None:
+ """Delete owning entity.
+
+ Sends request to A&AI to delete owning entity object.
+
+ """
+ self.send_message(
+ "DELETE",
+ f"Delete owning entity",
+ f"{self.url}?resource-version={self.resource_version}"
+ )
diff --git a/src/onapsdk/aai/business/platform.py b/src/onapsdk/aai/business/platform.py
index 5c12ba8..f652e32 100644
--- a/src/onapsdk/aai/business/platform.py
+++ b/src/onapsdk/aai/business/platform.py
@@ -121,3 +121,11 @@ class Platform(AaiResource):
f"Get {name} platform",
url)
return cls(response["platform-name"], response["resource-version"])
+
+ def delete(self) -> None:
+ """Delete platform."""
+ self.send_message(
+ "DELETE",
+ f"Delete platform",
+ f"{self.url}?resource-version={self.resource_version}"
+ )
diff --git a/src/onapsdk/aai/business/project.py b/src/onapsdk/aai/business/project.py
index 989444a..fcab0e8 100644
--- a/src/onapsdk/aai/business/project.py
+++ b/src/onapsdk/aai/business/project.py
@@ -121,3 +121,11 @@ class Project(AaiResource):
f"Get {name} project",
url)
return cls(response["project-name"], response["resource-version"])
+
+ def delete(self) -> None:
+ """Delete project."""
+ self.send_message(
+ "DELETE",
+ "Delete project",
+ f"{self.url}?resource-version={self.resource_version}"
+ )
diff --git a/src/onapsdk/aai/cloud_infrastructure/cloud_region.py b/src/onapsdk/aai/cloud_infrastructure/cloud_region.py
index 997f426..171be34 100644
--- a/src/onapsdk/aai/cloud_infrastructure/cloud_region.py
+++ b/src/onapsdk/aai/cloud_infrastructure/cloud_region.py
@@ -22,6 +22,7 @@ from onapsdk.exceptions import ResourceNotFound
from ..aai_element import AaiResource
from ..mixins.link_to_complex import AaiResourceLinkToComplexMixin
+from ..mixins.link_to_project import AaiResourceLinkToProjectMixin
from .complex import Complex
from .tenant import Tenant
@@ -66,7 +67,7 @@ class EsrSystemInfo: # pylint: disable=too-many-instance-attributes
openstack_region_id: str = None
-class CloudRegion(AaiResource, AaiResourceLinkToComplexMixin): # pylint: disable=too-many-instance-attributes
+class CloudRegion(AaiResource, AaiResourceLinkToComplexMixin, AaiResourceLinkToProjectMixin): # pylint: disable=too-many-instance-attributes
"""Cloud region class.
Represents A&AI cloud region object.
diff --git a/src/onapsdk/aai/cloud_infrastructure/tenant.py b/src/onapsdk/aai/cloud_infrastructure/tenant.py
index 13d9aec..7377b8e 100644
--- a/src/onapsdk/aai/cloud_infrastructure/tenant.py
+++ b/src/onapsdk/aai/cloud_infrastructure/tenant.py
@@ -12,11 +12,11 @@
# 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.aai.cloud_infrastructure.cloud_region import CloudRegion
+#from onapsdk.aai.cloud_infrastructure.cloud_region import CloudRegion
from ..aai_element import AaiResource
-class Tenant(AaiResource):
+class Tenant(AaiResource): # pylint: disable=too-many-instance-attributes
"""Tenant class."""
def __init__(self, # pylint: disable=too-many-arguments
@@ -69,9 +69,12 @@ class Tenant(AaiResource):
str: Url to get all tenants
"""
- return (f"{cls.base_url}{cls.api_version}/cloud-infrastructure/cloud-regions/cloud-region/"
- f"{cloud_region.cloud_owner}/{cloud_region.cloud_region_id}"
- f"/tenants/")
+ return (
+ f"{cls.base_url}{cls.api_version}/cloud-infrastructure/"
+ f"cloud-regions/cloud-region/"
+ f"{cloud_region.cloud_owner}/{cloud_region.cloud_region_id}"
+ f"/tenants/"
+ )
@property
def url(self) -> str:
@@ -82,7 +85,8 @@ class Tenant(AaiResource):
"""
return (
- f"{self.base_url}{self.api_version}/cloud-infrastructure/cloud-regions/cloud-region/"
+ f"{self.base_url}{self.api_version}/cloud-infrastructure/"
+ f"cloud-regions/cloud-region/"
f"{self.cloud_region.cloud_owner}/{self.cloud_region.cloud_region_id}"
f"/tenants/tenant/{self.tenant_id}?"
f"resource-version={self.resource_version}"
diff --git a/src/onapsdk/aai/mixins/link_to_complex.py b/src/onapsdk/aai/mixins/link_to_complex.py
index af43125..178447a 100644
--- a/src/onapsdk/aai/mixins/link_to_complex.py
+++ b/src/onapsdk/aai/mixins/link_to_complex.py
@@ -25,8 +25,8 @@ class AaiResourceLinkToComplexMixin: # pylint: disable=too-few-public-methods
"""Link aai resource to complex mixin."""
def link_to_complex(self, cmplx: "Complex",
- relationship_label: RelationshipLabelEnum =\
- RelationshipLabelEnum.LOCATED_IN) -> None:
+ relationship_label: RelationshipLabelEnum = \
+ RelationshipLabelEnum.LOCATED_IN) -> None:
"""Create a relationship with complex resource.
Args:
diff --git a/src/onapsdk/aai/mixins/link_to_project.py b/src/onapsdk/aai/mixins/link_to_project.py
new file mode 100644
index 0000000..43c2191
--- /dev/null
+++ b/src/onapsdk/aai/mixins/link_to_project.py
@@ -0,0 +1,65 @@
+"""A&AI link to project module."""
+# Copyright 2023 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 TYPE_CHECKING
+
+from ..aai_element import Relationship, RelationshipLabelEnum
+
+if TYPE_CHECKING:
+ from ..business.project import Project
+
+
+class AaiResourceLinkToProjectMixin: # pylint: disable=too-few-public-methods
+ """Link aai resource to project mixin."""
+
+ def link_to_project(self, project: "Project") -> None:
+ """Create a relationship with project resource.
+
+ Args:
+ project (Project): Project object to create relationship with.
+
+ """
+ pro_relationship: Relationship = Relationship(
+ related_to="project",
+ related_link=project.url,
+ relationship_data=[
+ {
+ "relationship-key": "project.project-name",
+ "relationship-value": project.name,
+ }
+ ],
+ relationship_label=RelationshipLabelEnum.PART_OF.value,
+ )
+ self.add_relationship(pro_relationship)
+
+ def delete_relationship_with_project(self, project: "Project") -> None:
+ """Delete relationship with project resource.
+
+ Args:
+ project (Project): Project object to delete relationship with.
+
+ """
+ proj_relationship: Relationship = Relationship(
+ related_to="project",
+ related_link=project.url,
+ relationship_data=[
+ {
+ "relationship-key": "project.project-name",
+ "relationship-value": project.name,
+ }
+ ],
+ relationship_label=RelationshipLabelEnum.PART_OF.value,
+ )
+ self.delete_relationship(proj_relationship)
diff --git a/src/onapsdk/aai/mixins/link_to_tenant.py b/src/onapsdk/aai/mixins/link_to_tenant.py
new file mode 100644
index 0000000..8eef5b3
--- /dev/null
+++ b/src/onapsdk/aai/mixins/link_to_tenant.py
@@ -0,0 +1,69 @@
+"""A&AI link to project module."""
+# Copyright 2023 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 TYPE_CHECKING
+
+from ..aai_element import Relationship, RelationshipLabelEnum
+
+if TYPE_CHECKING:
+ from ..cloud_infrastructure.tenant import Tenant
+
+
+class AaiResourceLinkToTenantMixin: # pylint: disable=too-few-public-methods
+ """Link aai resource to tenant mixin."""
+
+ def link_to_tenant(self, tnant: "Tenant") -> None:
+ """Create a relationship with tenant resource.
+
+ few resources create same relationship with tenant
+
+ Args:
+ tenant (Tenant): Tenant object to create relationship with.
+
+ """
+ tnt_relationship: Relationship = Relationship(
+ related_to="tenant",
+ related_link=tnant.url,
+ relationship_data=[
+ {
+ "relationship-key": "tenant.name",
+ "relationship-value": tnant.name,
+ }
+ ],
+ relationship_label=RelationshipLabelEnum.USES.value,
+ )
+ self.add_relationship(tnt_relationship)
+
+ def delete_relationship_with_tenant(self, tenant: "Tenant") -> None:
+ """Delete relationship with tenant resource.
+
+ as few resources delete same relationship with tenant
+
+ Args:
+ tenant (Tenant): Tenant object to delete relationship with.
+
+ """
+ tenant_relationship: Relationship = Relationship(
+ related_to="tenant",
+ related_link=tenant.url,
+ relationship_data=[
+ {
+ "relationship-key": "tenant.name",
+ "relationship-value": tenant.name,
+ }
+ ],
+ relationship_label=RelationshipLabelEnum.USES.value,
+ )
+ self.delete_relationship(tenant_relationship)
diff --git a/src/onapsdk/aai/network/site_resource.py b/src/onapsdk/aai/network/site_resource.py
index 11a50c1..e6916f7 100644
--- a/src/onapsdk/aai/network/site_resource.py
+++ b/src/onapsdk/aai/network/site_resource.py
@@ -19,9 +19,10 @@ from onapsdk.utils.jinja import jinja_env
from ..aai_element import AaiResource, Relationship, RelationshipLabelEnum
from ..cloud_infrastructure import Complex
from ..mixins.link_to_complex import AaiResourceLinkToComplexMixin
+from ..mixins.link_to_project import AaiResourceLinkToProjectMixin
-class SiteResource(AaiResource, AaiResourceLinkToComplexMixin): # pylint: disable=too-many-instance-attributes
+class SiteResource(AaiResource, AaiResourceLinkToComplexMixin, AaiResourceLinkToProjectMixin): # pylint: disable=too-many-instance-attributes
"""Site resource class."""
def __init__(self, # pylint: disable=too-many-locals
diff --git a/src/onapsdk/aai/templates/aai_delete_relationship.json.j2 b/src/onapsdk/aai/templates/aai_delete_relationship.json.j2
new file mode 100644
index 0000000..5d7acb8
--- /dev/null
+++ b/src/onapsdk/aai/templates/aai_delete_relationship.json.j2
@@ -0,0 +1,11 @@
+{
+ "related-to": "{{ relationship.related_to }}",
+ "related-link": "{{ relationship.related_link }}",
+ {% if relationship.relationship_label %}
+ "relationship-label": "{{ relationship.relationship_label }}",
+ {% endif %}
+ {% if relationship.related_to_property %}
+ "related-to-property": {{ relationship.related_to_property | tojson }},
+ {% endif %}
+ "relationship-data": {{ relationship.relationship_data | tojson }}
+} \ No newline at end of file
diff --git a/tests/test_aai_customer.py b/tests/test_aai_customer.py
index 7e427bd..260520c 100644
--- a/tests/test_aai_customer.py
+++ b/tests/test_aai_customer.py
@@ -22,7 +22,6 @@ from onapsdk.msb.multicloud import Multicloud
from onapsdk.sdc.service import Service as SdcService
from onapsdk.exceptions import ParameterError, ResourceNotFound
-
SIMPLE_CUSTOMER = {
"customer": [
{
@@ -34,7 +33,6 @@ SIMPLE_CUSTOMER = {
]
}
-
SERVICE_SUBSCRIPTION = {
"service-subscription": [
{
@@ -74,7 +72,6 @@ SERVICE_SUBSCRIPTION = {
]
}
-
CUSTOMERS = {
"customer": [
{
@@ -86,7 +83,6 @@ CUSTOMERS = {
]
}
-
SIMPLE_CUSTOMER_2 = {
"global-customer-id": "generic",
"subscriber-name": "generic",
@@ -94,39 +90,38 @@ SIMPLE_CUSTOMER_2 = {
"resource-version": "1561218640404",
}
-
SERVICE_INSTANCES = {
- "service-instance":[
+ "service-instance": [
{
- "service-instance-id":"5410bf79-2aa3-450e-a324-ec5630dc18cf",
- "service-instance-name":"test",
- "environment-context":"General_Revenue-Bearing",
- "workload-context":"Production",
- "model-invariant-id":"2a51a89b-6f94-4417-8831-c468fb30ed02",
- "model-version-id":"92a82807-b483-4579-86b1-c79b1286aab4",
- "resource-version":"1589457727708",
- "orchestration-status":"Active",
- "relationship-list":{
- "relationship":[
+ "service-instance-id": "5410bf79-2aa3-450e-a324-ec5630dc18cf",
+ "service-instance-name": "test",
+ "environment-context": "General_Revenue-Bearing",
+ "workload-context": "Production",
+ "model-invariant-id": "2a51a89b-6f94-4417-8831-c468fb30ed02",
+ "model-version-id": "92a82807-b483-4579-86b1-c79b1286aab4",
+ "resource-version": "1589457727708",
+ "orchestration-status": "Active",
+ "relationship-list": {
+ "relationship": [
{
- "related-to":"owning-entity",
- "relationship-label":"org.onap.relationships.inventory.BelongsTo",
- "related-link":"/aai/v16/business/owning-entities/owning-entity/ff6c945f-89ab-4f14-bafd-0cdd6eac791a",
- "relationship-data":[
+ "related-to": "owning-entity",
+ "relationship-label": "org.onap.relationships.inventory.BelongsTo",
+ "related-link": "/aai/v16/business/owning-entities/owning-entity/ff6c945f-89ab-4f14-bafd-0cdd6eac791a",
+ "relationship-data": [
{
- "relationship-key":"owning-entity.owning-entity-id",
- "relationship-value":"ff6c945f-89ab-4f14-bafd-0cdd6eac791a"
+ "relationship-key": "owning-entity.owning-entity-id",
+ "relationship-value": "ff6c945f-89ab-4f14-bafd-0cdd6eac791a"
}
]
},
{
- "related-to":"project",
- "relationship-label":"org.onap.relationships.inventory.Uses",
- "related-link":"/aai/v16/business/projects/project/python_onap_sdk_project",
- "relationship-data":[
+ "related-to": "project",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-link": "/aai/v16/business/projects/project/python_onap_sdk_project",
+ "relationship-data": [
{
- "relationship-key":"project.project-name",
- "relationship-value":"python_onap_sdk_project"
+ "relationship-key": "project.project-name",
+ "relationship-value": "python_onap_sdk_project"
}
]
}
@@ -136,7 +131,6 @@ SERVICE_INSTANCES = {
]
}
-
SERVICE_SUBSCRIPTION_RELATIONSHIPS = {
"relationship": [
{
@@ -167,7 +161,6 @@ SERVICE_SUBSCRIPTION_RELATIONSHIPS = {
]
}
-
CLOUD_REGION = {
"cloud-region": [
{
@@ -201,7 +194,6 @@ CLOUD_REGION = {
]
}
-
TENANT = {
"tenant-id": "4bdc6f0f2539430f9428c852ba606808",
"tenant-name": "onap-dublin-daily-vnfs",
@@ -257,11 +249,10 @@ TENANT = {
},
}
-
CUSTOMERS_COUNT = {
- "results":[
+ "results": [
{
- "customer":12
+ "customer": 12
}
]
}
@@ -402,6 +393,24 @@ def test_customer_delete(mock_send):
)
+@mock.patch.object(Customer, "send_message")
+def test_delete_subscribed_service(mock_send):
+ """Test Customer's delete_subscribed_service method."""
+ customer = Customer("test", "test", "test", "test")
+ service_subscription = ServiceSubscription(customer=None,
+ service_type="test_service_type",
+ resource_version="test_resource_version")
+ customer.delete_subscribed_service(service_subscription)
+ mock_send.assert_called_once_with(
+ "DELETE",
+ "Delete service subscription",
+ (f"{customer.base_url}{customer.api_version}/business/customers/"
+ f"customer/{customer.global_customer_id}/service-subscriptions/"
+ f"service-subscription/{service_subscription.service_type}?"
+ f"resource-version={service_subscription.resource_version}")
+ )
+
+
def test_customer_url():
"""Test Customer's url property."""
customer = Customer("generic", "generic", "INFRA")
@@ -444,21 +453,21 @@ def test_customer_subscribe_service(mock_send_message, mock_send_message_json):
customer.subscribe_service("test_service")
-#test the Cloud Region Class
+# test the Cloud Region Class
AVAILABILITY_ZONE = {
- "availability-zone-name":"OPNFV LaaS",
- "hypervisor-type":"1234",
- "operational-status":"working",
- "resource-version":"version1.0"
+ "availability-zone-name": "OPNFV LaaS",
+ "hypervisor-type": "1234",
+ "operational-status": "working",
+ "resource-version": "version1.0"
}
AVAILABILITY_ZONES = {
- "availability-zone":[
+ "availability-zone": [
{
- "availability-zone-name":"OPNFV LaaS",
- "hypervisor-type":"1234",
- "operational-status":"working",
- "resource-version":"version1.0"
+ "availability-zone-name": "OPNFV LaaS",
+ "hypervisor-type": "1234",
+ "operational-status": "working",
+ "resource-version": "version1.0"
}
]
}
@@ -477,6 +486,7 @@ def test_availability_zones(mock_send_message_json):
assert zone1.name == "OPNFV LaaS"
assert zone1.hypervisor_type == "1234"
+
@mock.patch.object(CloudRegion, "send_message_json")
def test_get_availability_zone_from_name(mock_send_message_json):
"""Test get Availability Zone by name"""
@@ -490,6 +500,7 @@ def test_get_availability_zone_from_name(mock_send_message_json):
assert availability_zone.hypervisor_type == "1234"
assert availability_zone.resource_version == "version1.0"
+
@mock.patch.object(CloudRegion, "send_message")
def test_add_availability_zone(mock_send_message):
"""Test Cloud Region class method"""
@@ -505,6 +516,7 @@ def test_add_availability_zone(mock_send_message):
assert description == "Add availability zone to cloud region"
assert url == f"{cloud_region.url}/availability-zones/availability-zone/test_zone"
+
@mock.patch.object(CloudRegion, "send_message")
def test_add_tenant_to_cloud(mock_send_message):
"""Test Cloud Region class method"""
@@ -573,8 +585,8 @@ def test_delete_cloud_region(mock_send_message):
assert descritption == f"Delete cloud region test_cloud_region"
assert url == cloud_region.url
+
@mock.patch.object(Customer, "send_message_json")
def test_customer_count(mock_send_message_json):
mock_send_message_json.return_value = CUSTOMERS_COUNT
assert Customer.count() == 12
-
diff --git a/tests/test_aai_line_of_business.py b/tests/test_aai_line_of_business.py
index bd28c98..d7bc2d3 100644
--- a/tests/test_aai_line_of_business.py
+++ b/tests/test_aai_line_of_business.py
@@ -80,3 +80,14 @@ def test_line_of_business_count(mock_send_message_json):
def test_line_of_business_url():
line_of_business = LineOfBusiness(name="test-lob", resource_version="123")
assert line_of_business.name in line_of_business.url
+
+@mock.patch.object(LineOfBusiness, "send_message")
+def test_line_of_business_delete(mock_send_message):
+ line_of_business = LineOfBusiness(name="test_line_of_business",
+ resource_version="12468")
+ line_of_business.delete()
+ mock_send_message.assert_called_once_with(
+ "DELETE",
+ "Delete line of business",
+ f"{line_of_business.url}?resource-version={line_of_business.resource_version}"
+ )
diff --git a/tests/test_aai_owning_entity.py b/tests/test_aai_owning_entity.py
index 0f16044..dce8986 100644
--- a/tests/test_aai_owning_entity.py
+++ b/tests/test_aai_owning_entity.py
@@ -18,32 +18,30 @@ import pytest
from onapsdk.aai.business import OwningEntity
from onapsdk.exceptions import ResourceNotFound
-
OWNING_ENTITIES = {
- "owning-entity":[
+ "owning-entity": [
{
- "owning-entity-id":"ff6c945f-89ab-4f14-bafd-0cdd6eac791a",
- "owning-entity-name":"OE-Generic",
- "resource-version":"1588244348931",
+ "owning-entity-id": "ff6c945f-89ab-4f14-bafd-0cdd6eac791a",
+ "owning-entity-name": "OE-Generic",
+ "resource-version": "1588244348931",
},
{
- "owning-entity-id":"OE-generic",
- "owning-entity-name":"OE-generic",
- "resource-version":"1587388597761"
+ "owning-entity-id": "OE-generic",
+ "owning-entity-name": "OE-generic",
+ "resource-version": "1587388597761"
},
{
- "owning-entity-id":"b3dcdbb0-edae-4384-b91e-2f114472520c"
- ,"owning-entity-name":"test",
- "resource-version":"1588145971158"
+ "owning-entity-id": "b3dcdbb0-edae-4384-b91e-2f114472520c"
+ , "owning-entity-name": "test",
+ "resource-version": "1588145971158"
}
]
}
-
OWNING_ENTITY = {
- "owning-entity-id":"OE-generic",
- "owning-entity-name":"OE-generic",
- "resource-version":"1587388597761"
+ "owning-entity-id": "OE-generic",
+ "owning-entity-name": "OE-generic",
+ "resource-version": "1587388597761"
}
@@ -85,3 +83,16 @@ def test_owning_entity_create(mock_send_json, mock_send):
)
assert owning_entity.owning_entity_id == "OE-generic"
assert owning_entity.name == "OE-generic"
+
+
+@mock.patch.object(OwningEntity, "send_message")
+def test_owning_entity_delete(mock_send_message):
+ owning_entity = OwningEntity(name="test_owning_entity",
+ owning_entity_id="test_owning_id",
+ resource_version="12345")
+ owning_entity.delete()
+ mock_send_message.assert_called_once_with(
+ "DELETE",
+ "Delete owning entity",
+ f"{owning_entity.url}?resource-version={owning_entity.resource_version}"
+ )
diff --git a/tests/test_aai_platform.py b/tests/test_aai_platform.py
index fbe2753..33a0075 100644
--- a/tests/test_aai_platform.py
+++ b/tests/test_aai_platform.py
@@ -15,7 +15,6 @@ from unittest import mock
from onapsdk.aai.business.platform import Platform
-
PLATFORMS = {
"platform": [
{
@@ -29,11 +28,10 @@ PLATFORMS = {
]
}
-
COUNT = {
- "results":[
+ "results": [
{
- "platform":1
+ "platform": 1
}
]
}
@@ -77,6 +75,19 @@ def test_line_of_business_count(mock_send_message_json):
mock_send_message_json.return_value = COUNT
assert Platform.count() == 1
+
def test_platform_url():
platform = Platform(name="test-platform", resource_version="123")
assert platform.name in platform.url
+
+
+@mock.patch.object(Platform, "send_message")
+def test_platform_delete(mock_send_message):
+ platform = Platform(name="test_platform",
+ resource_version="12345")
+ platform.delete()
+ mock_send_message.assert_called_once_with(
+ "DELETE",
+ "Delete platform",
+ f"{platform.url}?resource-version={platform.resource_version}"
+ )
diff --git a/tests/test_aai_project.py b/tests/test_aai_project.py
index 716bac1..fd3af3f 100644
--- a/tests/test_aai_project.py
+++ b/tests/test_aai_project.py
@@ -14,7 +14,7 @@
from unittest import mock
from onapsdk.aai.business.project import Project
-
+from onapsdk.aai.cloud_infrastructure import CloudRegion
PROJECTS = {
"project": [
@@ -29,11 +29,10 @@ PROJECTS = {
]
}
-
COUNT = {
- "results":[
+ "results": [
{
- "project":1
+ "project": 1
}
]
}
@@ -77,6 +76,62 @@ def test_project_count(mock_send_message_json):
mock_send_message_json.return_value = COUNT
assert Project.count() == 1
+
def test_project_url():
project = Project(name="test-project", resource_version="123")
assert project.name in project.url
+
+
+@mock.patch.object(Project, "send_message")
+def test_project_delete(mock_send_message):
+ project = Project(name="test_project",
+ resource_version="12345")
+ project.delete()
+ mock_send_message.assert_called_once_with(
+ "DELETE",
+ "Delete project",
+ f"{project.url}?resource-version={project.resource_version}"
+ )
+
+
+@mock.patch.object(CloudRegion, "add_relationship")
+def test_cloud_region_link_to_project(mock_add_rel):
+ """Test Cloud Region linking with Project.
+
+ Test Relationship object creation
+ """
+ cloud_region = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ project = Project(name="test_project",
+ resource_version="12345")
+ cloud_region.link_to_project(project)
+ mock_add_rel.assert_called_once()
+ relationship = mock_add_rel.call_args[0][0]
+ assert relationship.related_to == "project"
+ assert relationship.related_link == (f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/"
+ f"v27/business/projects/project"
+ f"/test_project")
+ assert len(relationship.relationship_data) == 1
+
+@mock.patch.object(CloudRegion, "delete_relationship")
+def test_cloud_region_delete_project(mock_del_rel):
+ """Test delete Cloud Region's linked Project.
+
+ Test Relationship object deletion
+ """
+ cloud_region = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ project = Project(name="test_project",
+ resource_version="12345")
+ cloud_region.delete_relationship_with_project(project)
+ mock_del_rel.assert_called_once()
+ relationship = mock_del_rel.call_args[0][0]
+ assert relationship.related_to == "project"
+ assert relationship.related_link == (f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/"
+ f"v27/business/projects/project"
+ f"/test_project")
+ assert len(relationship.relationship_data) == 1
diff --git a/tests/test_aai_service.py b/tests/test_aai_service.py
index a13131a..c358f4d 100644
--- a/tests/test_aai_service.py
+++ b/tests/test_aai_service.py
@@ -655,6 +655,15 @@ def test_add_relationship(mock_send):
related_link="test",
relationship_data={}))
+@mock.patch.object(AaiResource, "send_message")
+def test_delete_relationship(mock_send):
+ """Test delete_relationship method."""
+ cloud_region = CloudRegion(cloud_owner="tester", cloud_region_id="test",
+ orchestration_disabled=True, in_maint=False)
+ cloud_region.delete_relationship(Relationship(related_to="test",
+ related_link="test",
+ relationship_data={}))
+
# # -----------------------------------------------------------------------------
# def test_check_aai_resource_service():
diff --git a/tests/test_aai_tenant.py b/tests/test_aai_tenant.py
new file mode 100644
index 0000000..a8e2a91
--- /dev/null
+++ b/tests/test_aai_tenant.py
@@ -0,0 +1,130 @@
+# 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 unittest import mock
+
+from onapsdk.aai.business.project import Project
+from onapsdk.aai.cloud_infrastructure import CloudRegion
+from onapsdk.aai.business import OwningEntity
+from onapsdk.aai.cloud_infrastructure import Tenant
+
+from onapsdk.exceptions import APIError
+
+TENANTS = {
+ "tenant": [
+ {
+ "name": "test-name",
+ "resource-version": "1234"
+ },
+ {
+ "name": "test-name2",
+ "resource-version": "4321"
+ }
+ ]
+}
+
+COUNT = {
+ "results": [
+ {
+ "tenant": 1
+ }
+ ]
+}
+
+
+@mock.patch.object(OwningEntity, "add_relationship")
+def test_owning_entity_link_to_tenant(mock_add_rel):
+ """Test OwningEntity linking with Tenant.
+
+ Test Relationship object creation
+ """
+ owning_entity = OwningEntity(name="test_owning_entity",
+ owning_entity_id="test_owning_id",
+ resource_version="12345")
+ cloud_regin = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ tenant = Tenant(cloud_region=cloud_regin, tenant_id="test_tenant_id", tenant_name="test_tenant_name")
+
+ owning_entity.link_to_tenant(tenant)
+ mock_add_rel.assert_called_once()
+ relationship = mock_add_rel.call_args[0][0]
+ assert relationship.related_to == "tenant"
+ assert relationship.related_link == (f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/"
+ f"v27/cloud-infrastructure/cloud-regions/cloud-region/"
+ f"test_cloud_owner/test_cloud_region/"
+ f"tenants/tenant/test_tenant_id?resource-version=None")
+ assert len(relationship.relationship_data) == 1
+
+
+@mock.patch.object(OwningEntity, "delete_relationship")
+def test_owning_entity_delete_tenant(mock_add_rel):
+ """Test delete OwningEntity's Tenant.
+
+ Test Relationship object deletion
+ """
+ owning_entity = OwningEntity(name="test_owning_entity",
+ owning_entity_id="test_owning_id",
+ resource_version="12345")
+ cloud_regin = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ tenant = Tenant(cloud_region=cloud_regin, tenant_id="test_tenant_id", tenant_name="test_tenant_name")
+
+ owning_entity.delete_relationship_with_tenant(tenant)
+ mock_add_rel.assert_called_once()
+ relationship = mock_add_rel.call_args[0][0]
+ assert relationship.related_to == "tenant"
+ assert relationship.related_link == (f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/"
+ f"v27/cloud-infrastructure/cloud-regions/cloud-region/"
+ f"test_cloud_owner/test_cloud_region/"
+ f"tenants/tenant/test_tenant_id?resource-version=None")
+ assert len(relationship.relationship_data) == 1
+
+
+def test_tenant_url():
+ cloud_regin = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ tenant = Tenant(cloud_region=cloud_regin, tenant_id="test_tenant_id", tenant_name="test_tenant_name")
+ assert tenant.url == (f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/v27/cloud-infrastructure/"
+ f"cloud-regions/cloud-region/test_cloud_owner/test_cloud_region/tenants/tenant/"
+ f"test_tenant_id?resource-version=None")
+
+
+def test_tenant_getall_url():
+ cloud_regin = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ tenant = Tenant(cloud_region=cloud_regin, tenant_id="test_tenant_id", tenant_name="test_tenant_name")
+ assert tenant.get_all_url(cloud_regin) == (
+ f"https://aai.api.sparky.simpledemo.onap.org:30233/aai/v27/cloud-infrastructure/"
+ f"cloud-regions/cloud-region/test_cloud_owner/test_cloud_region/tenants/")
+
+@mock.patch.object(Tenant, "send_message")
+def test_tenant_delete(mock_send_message):
+ cloud_regin = CloudRegion(cloud_owner="test_cloud_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=True,
+ in_maint=False)
+ tenant = Tenant(cloud_region=cloud_regin, tenant_id="test_tenant_id", tenant_name="test_tenant_name")
+ tenant.delete()
+ mock_send_message.assert_called_once_with(
+ "DELETE",
+ f"Remove tenant {tenant.name} from {tenant.cloud_region.cloud_region_id} cloud region",
+ url=tenant.url
+ )