kingbird/kingbird/tests/unit/drivers/test_nova_v2.py

312 lines
14 KiB
Python

# 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 mock
import novaclient
from kingbird.common import consts
from kingbird.drivers.openstack import nova_v2
from kingbird.tests import base
from kingbird.tests import utils
class Server(object):
def __init__(self, id, metadata_items):
self.metadata = metadata_items
self.flavor = {}
self.flavor['id'] = id
class Fake_Flavor(object):
def __init__(self, id, ram, cores, disks, name, swap, rxtx_factor,
is_public=True, keys=None):
self.id = id
self.ram = ram
self.vcpus = cores
self.disk = disks
self.name = name
self.is_public = is_public
self.swap = swap
self.rxtx_factor = 1.0
self._info = {u'name': self.name,
u'links': [
{u'href': u'http://www.flavor.com/v2.1/flavors/2',
u'rel': u'self'},
{u'href': u'http://www.fake_flavor.com/flavors/2',
u'rel': u'bookmark'}],
u'ram': self.ram, u'OS-FLV-DISABLED:disabled': False,
u'vcpus': self.vcpus, u'swap': self.swap,
u'rxtx_factor': 1.0, u'disk': self.disk,
u'os-flavor-access:is_public': self.is_public,
u'OS-FLV-EXT-DATA:ephemeral': 0, u'id': self.id}
self.keys = keys
def get_keys(self):
return self.keys
class Access(object):
def __init__(self, tenant_id):
self.tenant_id = tenant_id
s1 = Server(1, {'mkey': 'mvalue'})
s2 = Server(1, {'mkey': 'mvalue', 'm2key': 'm2value'})
DISABLED_QUOTAS = ["floating_ips", "fixed_ips", "security_groups"]
FAKE_KEYPAIRS = ['key1', 'key2']
FAKE_LIMITS = {'absolute':
{u'maxServerMeta': 100, u'maxPersonality': 5,
u'totalServerGroupsUsed': 0,
u'maxImageMeta': 100, u'maxPersonalitySize': 10240,
u'maxTotalKeypairs': 100, u'maxSecurityGroupRules': 20,
u'maxServerGroups': 10, u'totalCoresUsed': 2,
u'totalRAMUsed': 1024, u'maxSecurityGroups': 10,
u'totalFloatingIpsUsed': 0, u'totalInstancesUsed': 2,
u'maxServerGroupMembers': 10, u'maxTotalFloatingIps': 10,
u'totalSecurityGroupsUsed': 1, u'maxTotalInstances': 15,
u'maxTotalRAMSize': 51200, u'maxTotalCores': 10
}
}
FAKE_RESOURCE_ID = 'fake_id'
DEFAULT_FORCE = False
class FakeKeypair(object):
def __init__(self, name, public_key):
self.name = name
self.public_key = public_key
class TestNovaClient(base.KingbirdTestCase):
def setUp(self):
super(TestNovaClient, self).setUp()
self.ctx = utils.dummy_context()
self.session = 'fake_session'
self.project = 'fake_project'
self.user = 'fake_user'
def test_init(self):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
self.assertIsNotNone(nv_client)
expected_quotas = list(set(consts.NOVA_QUOTA_FIELDS) -
set(DISABLED_QUOTAS))
self.assertEqual(nv_client.enabled_quotas, expected_quotas)
self.assertIsInstance(nv_client.nova_client,
novaclient.v2.client.Client)
@mock.patch.object(nova_v2, 'client')
def test_get_resource_usages(self, mock_novaclient):
mock_novaclient.Client().keypairs.list.return_value = FAKE_KEYPAIRS
mock_novaclient.Client().limits.get().to_dict.return_value = \
FAKE_LIMITS
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
total_nova_usage = nv_client.get_resource_usages(self.project)
self.assertEqual(total_nova_usage['ram'], 512 * 2)
self.assertEqual(total_nova_usage['cores'], 2)
self.assertEqual(total_nova_usage['instances'], 2)
self.assertEqual(total_nova_usage['key_pairs'], 2)
@mock.patch.object(nova_v2, 'client')
def test_update_quota_limits(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
new_quota = {'ram': 100, 'cores': 50}
nv_client.update_quota_limits(self.project, **new_quota)
mock_novaclient.Client().quotas.update.assert_called_once_with(
self.project, **new_quota)
@mock.patch.object(nova_v2, 'client')
def test_delete_quota_limits(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
new_quota = {'ram': 100, 'cores': 50}
nv_client.update_quota_limits(self.project, **new_quota)
nv_client.delete_quota_limits(self.project)
mock_novaclient.Client().quotas.delete.assert_called_once_with(
self.project)
@mock.patch.object(nova_v2, 'client')
def test_get_keypairs(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
mock_novaclient.Client().keypairs.get.return_value = 'key1'
nv_client.get_keypairs(FAKE_RESOURCE_ID)
mock_novaclient.Client().keypairs.get.\
assert_called_once_with(FAKE_RESOURCE_ID)
@mock.patch.object(nova_v2, 'client')
def test_create_keypairs_with_force_false(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_key = FakeKeypair('fake_name', 'fake-rsa')
nv_client.create_keypairs(DEFAULT_FORCE, fake_key)
self.assertEqual(0,
mock_novaclient.Client().keypairs.delete.call_count)
mock_novaclient.Client().keypairs.create.\
assert_called_once_with(fake_key.name,
public_key=fake_key.public_key)
@mock.patch.object(nova_v2, 'client')
def test_create_keypairs_with_force_true(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_key = FakeKeypair('fake_name', 'fake-rsa')
nv_client.create_keypairs(True, fake_key)
mock_novaclient.Client().keypairs.delete.\
assert_called_once_with(fake_key)
mock_novaclient.Client().keypairs.create.\
assert_called_once_with(fake_key.name,
public_key=fake_key.public_key)
@mock.patch.object(nova_v2, 'client')
def test_get_flavor(self, mock_novaclient):
"""Test get_flavor method of nova."""
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0, False)
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
nv_client.get_flavor(fake_flavor.name)
result = mock_novaclient.Client().flavors.find(fake_flavor.name)
mock_novaclient.Client().flavors.get.\
assert_called_once_with(result)
@mock.patch.object(nova_v2, 'client')
def test_get_flavor_access_tenants(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
nv_client.get_flavor_access_tenant('fake_flavor')
mock_novaclient.Client().flavor_access.list.\
assert_called_once_with(flavor='fake_flavor')
@mock.patch.object(nova_v2, 'client')
def test_check_and_delete_flavor(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
mock_novaclient.Client().flavors.list.return_value = [fake_flavor]
nv_client.check_and_delete_flavor_in_target_region(fake_flavor,
fake_flavor._info)
mock_novaclient.Client().flavors.get.\
assert_called_once_with(fake_flavor.id)
mock_novaclient.Client().flavors.list.\
assert_called_once_with(is_public=None)
mock_novaclient.Client().flavors.delete.\
assert_called_once_with(fake_flavor.id)
@mock.patch.object(nova_v2, 'client')
def test_check_and_delete_target_flavor(self, mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
mock_novaclient.Client().flavors.get.return_value = None
mock_novaclient.Client().flavors.list.return_value = []
nv_client.check_and_delete_flavor_in_target_region(fake_flavor,
fake_flavor._info)
@mock.patch.object(nova_v2, 'client')
def test_create_flavor_force_true_no_access_tenants(self,
mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
nv_client.create_flavor(True, fake_flavor)
mock_novaclient.Client().flavors.create.\
assert_called_once_with(
disk=fake_flavor.disk, name=fake_flavor.name,
ram=fake_flavor.ram, rxtx_factor=fake_flavor.rxtx_factor,
swap=fake_flavor.swap, vcpus=fake_flavor.vcpus)
fake_resource_dict = fake_flavor._info.copy()
fake_resource_dict.update({'flavorid': fake_flavor.id})
fake_resource_dict.pop("links", None)
fake_resource_dict.pop("OS-FLV-DISABLED:disabled", None)
fake_resource_dict.pop("OS-FLV-EXT-DATA:ephemeral", None)
fake_resource_dict.pop("os-flavor-access:is_public", None)
fake_resource_dict.pop("id", None)
mock_novaclient.Client().flavors.get.\
assert_called_once_with(fake_flavor.id)
mock_novaclient.Client().flavors.list.\
assert_called_once_with(is_public=None)
@mock.patch.object(nova_v2, 'client')
def test_create_flavor_force_false_no_access_tenants(self,
mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
nv_client.create_flavor(False, fake_flavor)
mock_novaclient.Client().flavors.create.\
assert_called_once_with(
flavorid=fake_flavor.id, disk=fake_flavor.disk,
name=fake_flavor.name, ram=fake_flavor.ram,
rxtx_factor=fake_flavor.rxtx_factor,
swap=fake_flavor.swap, vcpus=fake_flavor.vcpus)
mock_novaclient.Client().flavors.assert_not_called
mock_novaclient.Client().flavors.assert_not_called
@mock.patch.object(nova_v2, 'client')
def test_create_flavor_force_true_with_access_tenants(self,
mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
access_tenants = ['fake_tenant_1', 'fake_tenant_2']
nv_client.create_flavor(True, fake_flavor, access_tenants)
mock_novaclient.Client().flavors.create.\
assert_called_once_with(
disk=fake_flavor.disk, name=fake_flavor.name,
ram=fake_flavor.ram, rxtx_factor=fake_flavor.rxtx_factor,
swap=fake_flavor.swap, vcpus=fake_flavor.vcpus)
fake_resource_dict = fake_flavor._info.copy()
fake_resource_dict.update({'flavorid': fake_flavor.id})
fake_resource_dict.pop("links", None)
fake_resource_dict.pop("OS-FLV-DISABLED:disabled", None)
fake_resource_dict.pop("OS-FLV-EXT-DATA:ephemeral", None)
fake_resource_dict.pop("os-flavor-access:is_public", None)
fake_resource_dict.pop("id", None)
mock_novaclient.Client().flavors.get.\
assert_called_once_with(fake_flavor.id)
mock_novaclient.Client().flavors.list.\
assert_called_once_with(is_public=None)
self.assertEqual(mock_novaclient.Client().flavor_access.
add_tenant_access.call_count, 2)
@mock.patch.object(nova_v2, 'client')
def test_create_flavor_force_false_with_access_tenants(self,
mock_novaclient):
nv_client = nova_v2.NovaClient('fake_region', self.session,
DISABLED_QUOTAS)
fake_flavor = Fake_Flavor('fake_id', 512, 2, 30, 'fake_flavor', 1,
1.0)
access_tenants = ['fake_tenant_1', 'fake_tenant_2']
nv_client.create_flavor(False, fake_flavor, access_tenants)
mock_novaclient.Client().flavors.create.\
assert_called_once_with(
flavorid=fake_flavor.id, disk=fake_flavor.disk,
name=fake_flavor.name, ram=fake_flavor.ram,
rxtx_factor=fake_flavor.rxtx_factor,
swap=fake_flavor.swap, vcpus=fake_flavor.vcpus)
mock_novaclient.Client().flavors.assert_not_called
mock_novaclient.Client().flavors.assert_not_called
self.assertEqual(mock_novaclient.Client().flavor_access.
add_tenant_access.call_count, 2)