vitrage-tempest-plugin/vitrage_tempest_plugin/tests/common/nova_utils.py
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

107 lines
3.5 KiB
Python

# Copyright 2017 - 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.
import time
from oslo_log import log as logging
from vitrage_tempest_plugin.tests.common import general_utils as g_utils
from vitrage_tempest_plugin.tests.common import glance_utils
from vitrage_tempest_plugin.tests.common import neutron_utils
from vitrage_tempest_plugin.tests.common.tempest_clients import TempestClients
from vitrage_tempest_plugin.tests.utils import wait_for_status
LOG = logging.getLogger(__name__)
def create_instances(num_instances=1, set_public_network=True, name='vm'):
nics = []
flavor = get_first_flavor()
image = glance_utils.get_first_image()
if set_public_network:
public_net = neutron_utils.get_neutron_network('public')
if public_net:
nics = [{'net-id': public_net['id']}]
for i in range(3):
success, resources = _create_instances(flavor, image, name, nics,
num_instances)
time.sleep(2)
if success:
return resources
if not success:
LOG.warning("create instance failed, delete and retry %s",
resources)
delete_created_instances(resources)
time.sleep(10)
raise AssertionError("Unable to create vms, retries failed")
def _create_instances(flavor, image, name, nics, num_instances):
LOG.info("create instance with flavor=%s image=%s" % (flavor, image))
resources = [TempestClients.nova().servers.create(
name='%s-%s' % (name, index),
flavor=flavor,
image=image,
nics=nics) for index in range(num_instances)]
success = wait_for_status(
30, check_new_instances, ids=[instance.id for instance in resources])
return success, resources
def delete_created_instances(instances):
if not instances:
return
for instance in instances:
delete_all_instances(id=instance.id)
def delete_all_instances(**kwargs):
instances = TempestClients.nova().servers.list()
instances_to_delete = g_utils.all_matches(instances, **kwargs)
for item in instances_to_delete:
try:
TempestClients.nova().servers.force_delete(item)
except Exception:
LOG.exception('Failed to force delete instance %s', item.id)
wait_for_status(
30,
check_deleted_instances,
ids=[instance.id for instance in instances_to_delete])
time.sleep(2)
def get_first_flavor():
return TempestClients.nova().flavors.list(sort_key='memory_mb')[0]
def check_deleted_instances(ids):
servers = TempestClients.nova().servers.list()
for s in servers:
if s.id in ids:
return False
return True
def check_new_instances(ids):
servers = TempestClients.nova().servers.list()
for _id in ids:
ok = False
for s in servers:
if _id == s.id and s.status.lower() == 'active':
ok = True
break
if not ok:
return False
return True