diff options
-rw-r--r-- | src/onapsdk/aai/aai_element.py | 20 | ||||
-rw-r--r-- | src/onapsdk/aai/business/customer.py | 22 | ||||
-rw-r--r-- | src/onapsdk/aai/business/line_of_business.py | 15 | ||||
-rw-r--r-- | src/onapsdk/aai/business/owning_entity.py | 16 | ||||
-rw-r--r-- | src/onapsdk/aai/business/platform.py | 8 | ||||
-rw-r--r-- | src/onapsdk/aai/business/project.py | 8 | ||||
-rw-r--r-- | src/onapsdk/aai/cloud_infrastructure/cloud_region.py | 3 | ||||
-rw-r--r-- | src/onapsdk/aai/cloud_infrastructure/tenant.py | 16 | ||||
-rw-r--r-- | src/onapsdk/aai/mixins/link_to_complex.py | 4 | ||||
-rw-r--r-- | src/onapsdk/aai/mixins/link_to_project.py | 65 | ||||
-rw-r--r-- | src/onapsdk/aai/mixins/link_to_tenant.py | 69 | ||||
-rw-r--r-- | src/onapsdk/aai/network/site_resource.py | 3 | ||||
-rw-r--r-- | src/onapsdk/aai/templates/aai_delete_relationship.json.j2 | 11 | ||||
-rw-r--r-- | tests/test_aai_customer.py | 102 | ||||
-rw-r--r-- | tests/test_aai_line_of_business.py | 11 | ||||
-rw-r--r-- | tests/test_aai_owning_entity.py | 41 | ||||
-rw-r--r-- | tests/test_aai_platform.py | 19 | ||||
-rw-r--r-- | tests/test_aai_project.py | 63 | ||||
-rw-r--r-- | tests/test_aai_service.py | 9 | ||||
-rw-r--r-- | tests/test_aai_tenant.py | 130 |
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 + ) |