Dmitriy Rabotyagov f89426fc08 Ensure that private networks are also accounted
Right now there're 3 types of networks that are created in devstack:
* private
* public
* shared

This affects amount of resources that Vitrage is expecting to see
during one of tests. In order to ensure that we're accounting for each
type of networks that are present in deployment and that expected number
of resources is evaluated properly, we add extra logic of fetching
assumed networks and incrementing the counter.

Change-Id: Ib30db71a97bd40c3a73082c348c9eaff3adc43db
2024-08-26 17:18:58 +00:00

210 lines
7.9 KiB
Python

# Copyright 2017 ZTE, Nokia
#
# 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 oslo_log import log as logging
from oslo_serialization import jsonutils
from testtools import matchers
from vitrage_tempest_plugin.tests.base import BaseVitrageTempest
from vitrage_tempest_plugin.tests.base import IsEmpty
from vitrage_tempest_plugin.tests.base import IsNotEmpty
from vitrage_tempest_plugin.tests.common.constants import \
CINDER_VOLUME_DATASOURCE
from vitrage_tempest_plugin.tests.common.constants import \
NOVA_INSTANCE_DATASOURCE
from vitrage_tempest_plugin.tests.common.constants import VertexProperties as \
VProps
from vitrage_tempest_plugin.tests.common import neutron_utils
from vitrage_tempest_plugin.tests.common import nova_utils
from vitrage_tempest_plugin.tests import utils
from vitrageclient.exceptions import ClientException
LOG = logging.getLogger(__name__)
class TestResource(BaseVitrageTempest):
"""Test class for Vitrage resource API tests."""
properties = (VProps.VITRAGE_ID,
VProps.VITRAGE_TYPE,
VProps.ID,
VProps.STATE,
VProps.VITRAGE_AGGREGATED_STATE)
@classmethod
def setUpClass(cls):
super(TestResource, cls).setUpClass()
cls.instances = nova_utils.create_instances(num_instances=1,
set_public_network=True)
# noinspection PyPep8Naming
@classmethod
def tearDownClass(cls):
super(TestResource, cls).tearDownClass()
nova_utils.delete_created_instances(cls.instances)
@utils.tempest_logger
def test_compare_cli_vs_api_resource_list(self):
"""resource list """
api_resources = self.vitrage_client.resource.list(
all_tenants=True)
LOG.info("api_resources = %s", api_resources)
cli_resources = utils.run_vitrage_command(
'vitrage resource list --all -f json')
self._compare_resources(api_resources, cli_resources)
@utils.tempest_logger
def test_default_resource_list(self):
"""resource list with default query
get the resources: network, instance, port, zone, host, cluster
"""
# TODO(e0ne): split this test to verify that only network,
# instance and port are returned to non-admin user.
resources = self.vitrage_client.resource.list(all_tenants=False)
has_shared_network = neutron_utils.get_neutron_network('shared')
has_private_network = neutron_utils.get_neutron_network('private')
num_resources = 6
if has_shared_network:
num_resources += 1
if has_private_network:
num_resources += 1
self.assertThat(resources, matchers.HasLength(num_resources))
@utils.tempest_logger
def test_resource_list_with_all_tenants(self):
"""resource list with all tenants
get the resources:
"""
instances = None
try:
resources_before = self.vitrage_client.resource.list(
all_tenants=True)
instances = nova_utils.create_instances(num_instances=1,
set_public_network=True)
resources = self.vitrage_client.resource.list(all_tenants=True)
self.assertEqual(len(resources_before) + 2, len(resources))
finally:
if instances:
nova_utils.delete_created_instances(instances)
@utils.tempest_logger
def test_resource_list_with_existing_type(self):
"""resource list with existing type
get the resource: one instance
"""
resources = self.vitrage_client.resource.list(
resource_type=NOVA_INSTANCE_DATASOURCE,
all_tenants=True)
self.assertThat(resources, matchers.HasLength(1))
@utils.tempest_logger
def test_resource_list_with_no_existing_type(self):
"""resource list with no existing type"""
resources = self.vitrage_client.resource.list(
resource_type=CINDER_VOLUME_DATASOURCE,
all_tenants=True)
self.assertThat(resources, IsEmpty())
@utils.tempest_logger
def test_resource_list_with_query_existing(self):
resources = self.vitrage_client.resource.list(
resource_type=NOVA_INSTANCE_DATASOURCE,
all_tenants=True,
query='{"==": {"name": "vm-0"}}'
)
self.assertThat(resources, matchers.HasLength(1))
@utils.tempest_logger
def test_resource_list_with_query_none_existing(self):
resources = self.vitrage_client.resource.list(
resource_type=NOVA_INSTANCE_DATASOURCE,
all_tenants=True,
query='{"==": {"name": "kuku-does-not-exist"}}'
)
self.assertThat(resources, matchers.HasLength(0))
@utils.tempest_logger
def test_resource_count(self):
resources = self.vitrage_client.resource.count(
resource_type=NOVA_INSTANCE_DATASOURCE,
all_tenants=True,
query='{"==": {"name": "vm-0"}}'
)
self.assertThat(resources, matchers.HasLength(1))
self.assertEqual(1, resources[NOVA_INSTANCE_DATASOURCE])
@utils.tempest_logger
def test_resource_count_empty(self):
resources = self.vitrage_client.resource.count(
resource_type=NOVA_INSTANCE_DATASOURCE,
all_tenants=True,
query='{"==": {"name": "kuku-does-not-exist"}}'
)
self.assertThat(resources, matchers.HasLength(0))
def test_resource_show_with_no_existing_resource(self):
"""resource_show test no existing resource"""
try:
self.assertRaises(ClientException,
self.vitrage_client.resource.get,
'test_for_no_existing')
finally:
nova_utils.delete_all_instances()
def _compare_resources(self, api_resources, cli_resources):
self.assertThat(api_resources, IsNotEmpty(),
'The resources taken from rest api is empty')
self.assertThat(cli_resources, IsNotEmpty(),
'The resources taken from rest api is empty')
sorted_cli_resources = sorted(
jsonutils.loads(cli_resources),
key=lambda resource: resource["ID"])
sorted_api_resources = sorted(
api_resources,
key=lambda resource: resource["vitrage_id"])
self.assertEqual(len(sorted_cli_resources),
len(sorted_api_resources), 'cli = %s --> api = %s' %
(sorted_cli_resources, sorted_api_resources))
for cli_resource, api_resource in \
zip(sorted_cli_resources, sorted_api_resources):
self.assertEqual(
cli_resource.get("ID").lower(),
api_resource.get(VProps.VITRAGE_ID).lower())
self.assertEqual(
cli_resource.get("Type").lower(),
api_resource.get(VProps.VITRAGE_TYPE).lower())
self.assertEqual(
cli_resource.get("Data Source ID").lower(),
api_resource.get(VProps.ID).lower())
# Don't compare the state for Neutron ports. See bug #1776921
if 'neutron.port' != cli_resource.get("Type").lower():
self.assertEqual(
cli_resource.get("State").lower(),
api_resource.get(VProps.VITRAGE_OPERATIONAL_STATE).lower())