aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_aai_service.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_aai_service.py')
-rw-r--r--tests/test_aai_service.py770
1 files changed, 770 insertions, 0 deletions
diff --git a/tests/test_aai_service.py b/tests/test_aai_service.py
new file mode 100644
index 0000000..aac4c59
--- /dev/null
+++ b/tests/test_aai_service.py
@@ -0,0 +1,770 @@
+"""Test AaiElement 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 unittest import mock
+
+import pytest
+
+from onapsdk.aai.aai_element import AaiElement, AaiResource, Relationship
+from onapsdk.aai.cloud_infrastructure import (
+ CloudRegion,
+ Complex,
+ EsrSystemInfo,
+ Tenant
+)
+from onapsdk.aai.business import Customer
+from onapsdk.aai.service_design_and_creation import Service, Model
+from onapsdk.onap_service import OnapService
+
+
+# pylint: disable=C0301
+TENANT = {
+ "tenant": [
+ {
+ "tenant-id": "4bdc6f0f2539430f9428c852ba606808",
+ "tenant-name": "onap-dublin-daily-vnfs",
+ "resource-version": "1562591004273",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-subscription",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-link": "/aai/v16/business/customers/customer/generic/service-subscriptions/service-subscription/freeradius",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "generic",
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "freeradius",
+ },
+ ],
+ },
+ {
+ "related-to": "service-subscription",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-link": "/aai/v16/business/customers/customer/generic/service-subscriptions/service-subscription/ims",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "generic",
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "ims",
+ },
+ ],
+ },
+ {
+ "related-to": "service-subscription",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-link": "/aai/v16/business/customers/customer/generic/service-subscriptions/service-subscription/ubuntu16",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "generic",
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "ubuntu16",
+ },
+ ],
+ },
+ ]
+ },
+ }
+ ]
+}
+
+
+CLOUD_REGIONS = {
+ "cloud-region": [
+ {
+ "cloud-owner": "OPNFV",
+ "cloud-region-id": "RegionOne",
+ "cloud-type": "openstack",
+ "owner-defined-type": "N/A",
+ "cloud-region-version": "pike",
+ "identity-url": "http://msb-iag.onap:80/api/multicloud-pike/v0/OPNFV_RegionOne/identity/v2.0",
+ "cloud-zone": "OPNFV LaaS",
+ "complex-name": "Cruguil",
+ "resource-version": "1561217827955",
+ "orchestration-disabled": False,
+ "in-maint": False,
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "complex",
+ "relationship-label": "org.onap.relationships.inventory.LocatedIn",
+ "related-link": "/aai/v13/cloud-infrastructure/complexes/complex/cruguil",
+ "relationship-data": [
+ {
+ "relationship-key": "complex.physical-location-id",
+ "relationship-value": "cruguil",
+ }
+ ],
+ }
+ ]
+ },
+ }
+ ]
+}
+
+
+CLOUD_REGION = {
+ "cloud-region": [
+ {
+ "cloud-owner": "OPNFV",
+ "cloud-region-id": "RegionOne",
+ "cloud-type": "openstack",
+ "owner-defined-type": "N/A",
+ "cloud-region-version": "pike",
+ "identity-url": "http://msb-iag.onap:80/api/multicloud-pike/v0/OPNFV_RegionOne/identity/v2.0",
+ "cloud-zone": "OPNFV LaaS",
+ "complex-name": "Cruguil",
+ "resource-version": "1561217827955",
+ "orchestration-disabled": True,
+ "in-maint": False,
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "complex",
+ "relationship-label": "org.onap.relationships.inventory.LocatedIn",
+ "related-link": "/aai/v13/cloud-infrastructure/complexes/complex/cruguil",
+ "relationship-data": [
+ {
+ "relationship-key": "complex.physical-location-id",
+ "relationship-value": "cruguil",
+ }
+ ],
+ }
+ ]
+ },
+ }
+ ]
+}
+
+
+COMPLEXES = {
+ "complex": [
+ {
+ "city": "",
+ "data-center-code": "1234",
+ "street1": "",
+ "street2": "",
+ "physical-location-id": "integration_test_complex",
+ "identity-url": "",
+ "lata": "",
+ "elevation": "",
+ "state": "",
+ "physical-location-type": "",
+ "longitude": "",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to-property": [
+ {
+ "property-value": "OwnerType",
+ "property-key": "cloud-region.owner-defined-type",
+ }
+ ],
+ "relationship-label": "org.onap.relationships.inventory.LocatedIn",
+ "related-link": "/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner",
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne",
+ },
+ ],
+ "related-to": "cloud-region",
+ }
+ ]
+ },
+ "resource-version": "1581510773583",
+ "latitude": "",
+ "complex-name": "integration_test_complex",
+ "postal-code": "",
+ "country": "",
+ "region": "",
+ },
+ {
+ "city": "Beijing",
+ "data-center-code": "example-data-center-code-val-5556",
+ "street1": "example-street1-val-34205",
+ "street2": "example-street2-val-99210",
+ "physical-location-id": "My_Complex",
+ "identity-url": "example-identity-url-val-56898",
+ "lata": "example-lata-val-46073",
+ "elevation": "example-elevation-val-30253",
+ "state": "example-state-val-59487",
+ "physical-location-type": "example-physical-location-type-val-7608",
+ "longitude": "106.4074",
+ "resource-version": "1581504768889",
+ "latitude": "39.9042",
+ "complex-name": "My_Complex",
+ "postal-code": "100000",
+ "country": "example-country-val-94173",
+ "region": "example-region-val-13893",
+ },
+ ]
+}
+
+
+CLOUD_REGION_RELATIONSHIP = {
+ "relationship": [
+ {
+ "relationship-label": "org.onap.relationships.inventory.LocatedIn",
+ "related-link": "/aai/v16/cloud-infrastructure/complexes/complex/integration_test_complex",
+ "relationship-data": [
+ {
+ "relationship-key": "complex.physical-location-id",
+ "relationship-value": "integration_test_complex",
+ }
+ ],
+ "related-to": "complex",
+ }
+ ]
+}
+
+
+SERVICE_SUBSCRIPTION = {
+ "service-subscription": [
+ {
+ "service-type": "freeradius",
+ "resource-version": "1562591478146",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "tenant",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-link": "/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/OPNFV/RegionOne/tenants/tenant/4bdc6f0f2539430f9428c852ba606808",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "OPNFV",
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne",
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "4bdc6f0f2539430f9428c852ba606808",
+ },
+ ],
+ "related-to-property": [
+ {
+ "property-key": "tenant.tenant-name",
+ "property-value": "onap-dublin-daily-vnfs",
+ }
+ ],
+ }
+ ]
+ },
+ },
+ {"service-type": "ims"},
+ ]
+}
+
+
+SUBSCRIPTION_TYPES_NO_RESOURCES = {
+ "requestError": {
+ "serviceException": {
+ "messageId": "SVC3001",
+ "text": ("Resource not found for %1 using id " + "%2 (msg=%3) +(ec=%4)"),
+ "variables": [
+ "GET",
+ "service-design-and-creation/services",
+ (
+ "Node Not Found:No Node of type service found at: "
+ + "/service-design-and-creation/services"
+ ),
+ "ERR.5.4.6114",
+ ],
+ }
+ }
+}
+
+
+SUBSCRIPTION_TYPES_LIST = {
+ "service": [
+ {
+ "service-id": "f4bcf0b0-b44e-423a-8357-5758afc14e88",
+ "service-description": "ubuntu16",
+ "resource-version": "1561218639393",
+ },
+ {
+ "service-id": "2e812e77-e437-46c4-8e8e-908fbc7e176c",
+ "service-description": "freeradius",
+ "resource-version": "1561219163076",
+ },
+ {
+ "service-id": "f208de57-0e02-4505-a0fa-375b13ad24ac",
+ "service-description": "ims",
+ "resource-version": "1561219799684",
+ },
+ ]
+}
+
+
+CUSTOMERS_NO_RESOURCES = {
+ "requestError": {
+ "serviceException": {
+ "messageId": "SVC3001",
+ "text": ("Resource not found for %1 using id " + "%2 (msg=%3) +(ec=%4)"),
+ "variables": [
+ "GET",
+ "business/customers",
+ (
+ "Node Not Found:No Node of type customer found at: "
+ + "business/customers"
+ ),
+ "ERR.5.4.6114",
+ ],
+ }
+ }
+}
+
+
+SIMPLE_CUSTOMER = {
+ "customer": [
+ {
+ "global-customer-id": "generic",
+ "subscriber-name": "generic",
+ "subscriber-type": "INFRA",
+ "resource-version": "1561218640404",
+ }
+ ]
+}
+
+
+ESR_SYSTEM_INFO = {
+ 'esr-system-info': [
+ {
+ 'esr-system-info-id': 'c2d5e75d-56fd-47bc-af31-95607b26fa93',
+ 'service-url': 'http://keystone:5000/v3',
+ 'user-name': 'test-devel',
+ 'password': 'test-devel',
+ 'system-type': 'openstack',
+ 'cloud-domain': 'Default',
+ 'resource-version': '1586436352654'
+ }
+ ]
+}
+
+
+CLOUD_REGIONS_ITERATOR = (
+ cloud_region
+ for cloud_region in [
+ CloudRegion(
+ cloud_owner="OPNFV",
+ cloud_region_id="RegionOne",
+ cloud_type="openstack",
+ owner_defined_type="N/A",
+ cloud_region_version="pike",
+ identity_url=None,
+ cloud_zone="OPNFV LaaS",
+ complex_name="Cruguil",
+ sriov_automation=None,
+ cloud_extra_info=None,
+ upgrade_cycle=None,
+ orchestration_disabled=False,
+ in_maint=False,
+ resource_version=None,
+ )
+ ]
+)
+# pylint: enable=C0301
+
+
+def test_init():
+ """Test the initialization."""
+ element = AaiElement()
+ assert isinstance(element, OnapService)
+
+
+def test_class_variables():
+ """Test the class variables."""
+ assert AaiElement.server == "AAI"
+ assert AaiElement.base_url == "https://aai.api.sparky.simpledemo.onap.org:30233"
+ assert AaiElement.headers == {
+ "Content-Type": "application/json",
+ "Accept": "application/json",
+ "x-fromappid": "AAI",
+ "x-transactionid": "0a3f6713-ba96-4971-a6f8-c2da85a3176e",
+ "authorization": "Basic QUFJOkFBSQ=="}
+
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_customers(mock_send):
+ """Test get_customer function of A&AI."""
+ mock_send.return_value = SIMPLE_CUSTOMER
+ assert len(list(Customer.get_all())) == 1
+ aai_customer_1 = next(Customer.get_all())
+ assert aai_customer_1.global_customer_id == "generic"
+ assert aai_customer_1.subscriber_name == "generic"
+ assert aai_customer_1.subscriber_type == "INFRA"
+ assert aai_customer_1.resource_version == "1561218640404"
+ mock_send.assert_called_with("GET", 'get customers', mock.ANY)
+
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_customers_no_resources(mock_send):
+ """Test get_customer function with no customer declared in A&AI."""
+ mock_send.return_value = CUSTOMERS_NO_RESOURCES
+ assert len(list(Customer.get_all())) == 0
+ mock_send.assert_called_with("GET", 'get customers', mock.ANY)
+
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_subscription_type_list(mock_send):
+ """Test the getter of subscription types in A&AI."""
+ mock_send.return_value = {}
+ assert len(list(Service.get_all())) == 0
+ assert len(list(Service.get_all())) == 0
+
+ mock_send.return_value = SUBSCRIPTION_TYPES_LIST
+ assert len(list(Service.get_all())) == 3
+ assert len(list(Service.get_all())) == 3
+ subscriptions = Service.get_all()
+ aai_service_1 = next(subscriptions)
+ aai_service_2 = next(subscriptions)
+ aai_service_3 = next(subscriptions)
+ assert aai_service_1.service_id == "f4bcf0b0-b44e-423a-8357-5758afc14e88"
+ assert aai_service_1.service_description == "ubuntu16"
+ assert aai_service_1.resource_version == "1561218639393"
+ assert aai_service_2.service_id == "2e812e77-e437-46c4-8e8e-908fbc7e176c"
+ assert aai_service_2.service_description == "freeradius"
+ assert aai_service_2.resource_version == "1561219163076"
+ assert aai_service_3.service_id == "f208de57-0e02-4505-a0fa-375b13ad24ac"
+ assert aai_service_3.service_description == "ims"
+ assert aai_service_3.resource_version == "1561219799684"
+ mock_send.assert_called_with("GET", 'get subscriptions', mock.ANY)
+
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_subscription_types_no_resources(mock_send):
+ """Test get_customer function with no customer declared in A&AI."""
+ mock_send.return_value = SUBSCRIPTION_TYPES_NO_RESOURCES
+ assert len(list(Service.get_all())) == 0
+ mock_send.assert_called_with("GET", 'get subscriptions', mock.ANY)
+
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_cloud_regions(mock_send):
+ """Test get cloud regions from A&AI."""
+ mock_send.return_value = CLOUD_REGION
+ assert len(list(CloudRegion.get_all())) == 1
+ cloud_region = next(CloudRegion.get_all())
+ assert cloud_region.cloud_owner == "OPNFV"
+ assert cloud_region.cloud_type == "openstack"
+ assert cloud_region.complex_name == "Cruguil"
+
+ cloud_region = next(CloudRegion.get_all())
+ assert cloud_region.cloud_owner == "OPNFV"
+ assert cloud_region.cloud_type == "openstack"
+ assert cloud_region.complex_name == "Cruguil"
+
+ mock_send.return_value = {}
+ cloud_regions = list(CloudRegion.get_all())
+ assert len(cloud_regions) == 0
+
+ with pytest.raises(StopIteration):
+ cloud_region = next(CloudRegion.get_all())
+
+ mock_send.return_value = CLOUD_REGIONS
+ cloud_regions = list(CloudRegion.get_all())
+ assert len(cloud_regions) == 1
+
+@mock.patch.object(CloudRegion, "send_message")
+def test_cloud_region_creation(mock_send):
+ """Test cloud region creation"""
+ cloud_region = CloudRegion.create(
+ cloud_owner="test_owner",
+ cloud_region_id="test_cloud_region",
+ orchestration_disabled=False,
+ in_maint=True,
+ owner_defined_type="Test",
+ cloud_zone="Test zone",
+ sriov_automation="Test",
+ upgrade_cycle="Test"
+ )
+ assert cloud_region.cloud_owner == "test_owner"
+ assert cloud_region.cloud_region_id == "test_cloud_region"
+ assert cloud_region.orchestration_disabled == False
+ assert cloud_region.in_maint == True
+ assert cloud_region.cloud_type == ""
+ assert cloud_region.owner_defined_type == "Test"
+ assert cloud_region.cloud_region_version == ""
+ assert cloud_region.identity_url == ""
+ assert cloud_region.cloud_zone == "Test zone"
+ assert cloud_region.complex_name == ""
+ assert cloud_region.sriov_automation == "Test"
+ assert cloud_region.cloud_extra_info == ""
+ assert cloud_region.upgrade_cycle == "Test"
+
+@mock.patch.object(CloudRegion, 'get_all')
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_tenants_info(mock_send, mock_cloud_regions):
+ """Test get Tenant from A&AI."""
+ mock_cloud_regions.return_value = CLOUD_REGIONS_ITERATOR
+ mock_send.return_value = TENANT
+ cloud_name = "RegionOne"
+ cloud_region = CloudRegion.get_by_id("DT", cloud_name)
+ res = list(cloud_region.tenants)
+ assert len(res) == 1
+ assert isinstance(res[0], Tenant)
+ tenant = res[0]
+ assert tenant.tenant_id == "4bdc6f0f2539430f9428c852ba606808"
+ assert tenant.name == "onap-dublin-daily-vnfs"
+ assert tenant.context is None
+ assert tenant.resource_version == "1562591004273"
+ assert tenant.url == (
+ f"{tenant.base_url}{tenant.api_version}/cloud-infrastructure/cloud-regions/cloud-region/"
+ f"OPNFV/RegionOne/tenants/tenant/4bdc6f0f2539430f9428c852ba606808?"
+ f"resource-version=1562591004273"
+ )
+
+@mock.patch.object(CloudRegion, 'get_all')
+@mock.patch.object(AaiElement, 'send_message_json')
+def test_tenants_info_wrong_cloud_name(mock_send, mock_cloud_regions):
+ """Test get Tenant from A&AI."""
+ mock_cloud_regions.return_value = CLOUD_REGIONS_ITERATOR
+ mock_send.return_value = TENANT
+ cloud_name = "Wrong_cloud_name"
+ with pytest.raises(Exception) as excinfo:
+ CloudRegion.get_by_id("DT", cloud_name)
+ assert "not found" in str(excinfo.value)
+
+
+@mock.patch.object(CloudRegion, "send_message_json")
+def test_cloud_regions_relationship(mock_send):
+ """Test cloud region relationship property."""
+ mock_send.return_value = CLOUD_REGION_RELATIONSHIP
+ cloud_region = CloudRegion(cloud_owner="tester", cloud_region_id="test",
+ orchestration_disabled=True, in_maint=False)
+ relationship = next(cloud_region.relationships)
+ assert isinstance(relationship, Relationship)
+ assert relationship.relationship_label == "org.onap.relationships.inventory.LocatedIn"
+ assert relationship.related_link == \
+ "/aai/v16/cloud-infrastructure/complexes/complex/integration_test_complex"
+ assert relationship.related_to == "complex"
+ assert relationship.relationship_data[0]["relationship-key"] == "complex.physical-location-id"
+ assert relationship.relationship_data[0]["relationship-value"] == "integration_test_complex"
+
+
+@mock.patch.object(CloudRegion, "send_message_json")
+def test_cloud_regions_esr_system_infos(mock_send):
+ """Test cloud region esr system info"""
+ mock_send.return_value = ESR_SYSTEM_INFO
+ cloud_region = CloudRegion(cloud_owner="tester", cloud_region_id="test",
+ orchestration_disabled=True, in_maint=False)
+ esr_system_info = next(cloud_region.esr_system_infos)
+ assert isinstance(esr_system_info, EsrSystemInfo)
+ assert esr_system_info.esr_system_info_id == "c2d5e75d-56fd-47bc-af31-95607b26fa93"
+ assert esr_system_info.user_name == "test-devel"
+ assert esr_system_info.password == "test-devel"
+ assert esr_system_info.system_type == "openstack"
+ assert esr_system_info.resource_version == "1586436352654"
+ assert esr_system_info.system_name is None
+ assert esr_system_info.esr_type is None
+ assert esr_system_info.vendor is None
+ assert esr_system_info.version is None
+ assert esr_system_info.service_url == "http://keystone:5000/v3"
+ assert esr_system_info.protocol is None
+ assert esr_system_info.ssl_cacert is None
+ assert esr_system_info.ssl_insecure is None
+ assert esr_system_info.ip_address is None
+ assert esr_system_info.port is None
+ assert esr_system_info.cloud_domain == "Default"
+ assert esr_system_info.default_tenant is None
+ assert esr_system_info.passive is None
+ assert esr_system_info.remote_path is None
+ assert esr_system_info.system_status is None
+ assert esr_system_info.openstack_region_id is None
+
+@mock.patch.object(Complex, "send_message")
+def test_create_complex(mock_send):
+ """Test complex creation"""
+ cmplx = Complex.create(
+ name="test complex",
+ physical_location_id="somewhere",
+ data_center_code="5555",
+ physical_location_type="test",
+ city="Test City",
+ postal_code="55555",
+ region="Test region",
+ elevation="TestElevation",
+ )
+
+ assert cmplx.name == "test complex"
+ assert cmplx.physical_location_id == "somewhere"
+ assert cmplx.identity_url == ""
+ assert cmplx.physical_location_type == "test"
+ assert cmplx.street1 == ""
+ assert cmplx.street2 == ""
+ assert cmplx.city == "Test City"
+ assert cmplx.state == ""
+ assert cmplx.postal_code == "55555"
+ assert cmplx.country == ""
+ assert cmplx.region == "Test region"
+ assert cmplx.latitude == ""
+ assert cmplx.longitude == ""
+ assert cmplx.elevation == "TestElevation"
+ assert cmplx.lata == ""
+
+
+@mock.patch.object(Complex, "send_message_json")
+def text_get_all_complexes(mock_send):
+ """Test get_all Complex class method."""
+ mock_send.return_value = {}
+ assert len(list(Complex.get_all())) == 0
+
+ mock_send.return_value = COMPLEXES
+ assert len(list(Complex.get_all())) == 2
+
+
+def test_filter_none_value():
+ """Test method to filter out None value keys from dictionary."""
+ ret: dict = AaiResource.filter_none_key_values({"a": None})
+ assert not ret
+
+ ret: dict = AaiResource.filter_none_key_values({"a": "b", "c": None})
+ assert ret == {"a": "b"}
+
+ ret: dict = AaiResource.filter_none_key_values({"a": "b", "c": "d"})
+ assert ret == {"a": "b", "c": "d"}
+
+
+@mock.patch.object(AaiResource, "send_message")
+def test_add_relationship(mock_send):
+ """Test add_relationship method."""
+ cloud_region = CloudRegion(cloud_owner="tester", cloud_region_id="test",
+ orchestration_disabled=True, in_maint=False)
+ cloud_region.add_relationship(Relationship(related_to="test",
+ related_link="test",
+ relationship_data={}))
+
+
+# # -----------------------------------------------------------------------------
+# def test_check_aai_resource_service():
+# """Test that a given service instance is in A&AI."""
+# pass
+
+# def test_check_aai_resource_service_not_found():
+# """Test that a given service instance is not in A&AI (cleaned)."""
+# pass
+
+# def test_check_aai_resource_vnf():
+# """Test that a given vnf is in A&AI."""
+# pass
+
+# def test_check_aai_resource_vnf_not_found():
+# """Test that a given vnf is not in A&AI (cleaned)."""
+# pass
+
+# def test_check_aai_resource_module():
+# """Test that a given module is in A&AI."""
+# pass
+
+# def test_check_aai_resource_module_not_found():
+# """Test that a given module is not in A&AI (cleaned)."""
+# pass
+
+# def test_check_aai_net_module():
+# """Test that a given net is in A&AI."""
+# pass
+
+# def test_check_aai_resource_net_not_found():
+# """Test that a given net is not in A&AI (cleaned)."""
+# pass
+
+
+# pylint: disable=C0301
+SIMPLE_MODEL = {
+ "model": [
+ {
+ "model-invariant-id": "1234567890",
+ "model-type": "generic",
+ "resource-version": "1561218640404",
+ }
+ ]
+}
+# pylint: enable=C0301
+
+
+def test_service_url():
+ """Test service property"""
+ service = Service("12345", "description", "version1.0")
+ assert service.url == (f"{service.base_url}{service.api_version}/service-design-and-creation/services/service/"
+ f"{service.service_id}?resource-version={service.resource_version}")
+
+
+@mock.patch.object(Service, 'send_message')
+def test_service_create(mock_send):
+ """Test service creation"""
+ Service.create("1234", "description")
+ mock_send.assert_called_once()
+ method, description, url = mock_send.call_args[0]
+ assert method == "PUT"
+ assert description == "Create A&AI service"
+ assert url == (f"{Service.base_url}{Service.api_version}/service-design-and-creation/"
+ f"services/service/1234")
+
+
+def test_model_init():
+ """Test model initailization"""
+ model = Model("12345", "ubuntu", "version16")
+ assert isinstance(model, Model)
+
+
+def test_model_url():
+ """Test Model's url property"""
+ model = Model("12345", "ubuntu", "version16")
+ assert model.url == (f"{model.base_url}{model.api_version}/service-design-and-creation/models/"
+ f"model/{model.invariant_id}?resource-version={model.resource_version}")
+
+
+@mock.patch.object(Model, 'send_message_json')
+def test_zero_model_get_all(mock_send_message_json):
+ """Test get_all Model class method"""
+ mock_send_message_json.return_value = {}
+ Model.get_all()
+ assert len(list(Model.get_all())) == 0
+
+
+@mock.patch.object(Model, 'send_message_json')
+def test_model_get_all(mock_send_message_json):
+ """Test get_all Model class method"""
+ mock_send_message_json.return_value = SIMPLE_MODEL
+ Model.get_all()
+ assert len(list(Model.get_all())) == 1
+ model_1 = next(Model.get_all())
+ assert model_1.invariant_id == "1234567890"
+ assert model_1.model_type == "generic"
+ assert model_1.resource_version == "1561218640404"
+ mock_send_message_json.assert_called_with("GET", 'Get A&AI sdc models', mock.ANY)
+
+
+@mock.patch.object(CloudRegion, "send_message_json")
+@mock.patch.object(Complex, "get_by_physical_location_id")
+def test_cloud_region_complex_property(mock_complex_get_by_physical_location_id, mock_send):
+ """Test cloud region complex property."""
+ mock_send.return_value = {}
+ cloud_region = CloudRegion(cloud_owner="tester", cloud_region_id="test",
+ orchestration_disabled=True, in_maint=False)
+ assert cloud_region.complex is None
+ mock_send.return_value = CLOUD_REGION_RELATIONSHIP
+ assert cloud_region.complex is not None
+ assert mock_complex_get_by_physical_location_id.called_once_with("integration_test_complex")