Switch cloud.compute.get_server_by_id to use proxy

Consume proxy layer in cloud.ompute.get_server_by_id

Change-Id: Ie6d1776d3bc641e4fbab7c73ca05017cd429d12f
This commit is contained in:
Artem Goncharov 2021-10-22 17:24:02 +02:00
parent db4324d7d9
commit e94fda9e2c
8 changed files with 96 additions and 271 deletions

View File

@ -513,14 +513,11 @@ class ComputeCloudMixin(_normalize.Normalizer):
:param id: ID of the server.
:returns: A server dict or None if no matching server is found.
:returns: A server object or None if no matching server is found.
"""
try:
data = proxy._json_response(
self.compute.get('/servers/{id}'.format(id=id)))
server = self._get_and_munchify('server', data)
return meta.add_server_interfaces(
self, self._normalize_server(server))
server = self.compute.get_server(id)
return meta.add_server_interfaces(self, server)
except exceptions.ResourceNotFound:
return None
@ -905,7 +902,7 @@ class ComputeCloudMixin(_normalize.Normalizer):
nat_destination=nat_destination,
)
server.adminPass = admin_pass
server.admin_password = admin_pass
return server
def _get_boot_from_volume_kwargs(

View File

@ -462,11 +462,11 @@ def add_server_interfaces(cloud, server):
# server record. Since we know them, go ahead and set them. In the case
# where they were set previous, we use the values, so this will not break
# clouds that provide the information
if cloud.private and server['private_v4']:
server['accessIPv4'] = server['private_v4']
if cloud.private and server.private_v4:
server.access_ipv4 = server.private_v4
else:
server['accessIPv4'] = server['public_v4']
server['accessIPv6'] = server['public_v6']
server.access_ipv4 = server.public_v4
server.access_ipv6 = server.public_v6
return server
@ -487,7 +487,8 @@ def get_hostvars_from_server(cloud, server, mounts=None):
expand_server_vars if caching is not set up. If caching is set up,
the extra cost should be minimal.
"""
server_vars = add_server_interfaces(cloud, server)
server_vars = obj_to_munch(
add_server_interfaces(cloud, server))
flavor_id = server['flavor'].get('id')
if flavor_id:
@ -514,6 +515,11 @@ def get_hostvars_from_server(cloud, server, mounts=None):
if image_name:
server_vars['image']['name'] = image_name
# During the switch to returning sdk resource objects we need temporarily
# to force convertion to dict. This will be dropped soon.
if hasattr(server_vars['image'], 'to_dict'):
server_vars['image'] = server_vars['image'].to_dict(computed=False)
volumes = []
if cloud.has_service('volume'):
try:

View File

@ -11,6 +11,7 @@
# under the License.
from openstack.common import metadata
from openstack.common import tag
from openstack.compute.v2 import volume_attachment
from openstack import exceptions
from openstack.image.v2 import image
from openstack import resource
@ -82,7 +83,11 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin):
#: A list of an attached volumes. Each item in the list contains at least
#: an "id" key to identify the specific volumes.
attached_volumes = resource.Body(
'os-extended-volumes:volumes_attached')
'os-extended-volumes:volumes_attached',
aka='volumes',
type=list,
list_type=volume_attachment.VolumeAttachment,
default=[])
#: The name of the availability zone this server is a part of.
availability_zone = resource.Body('OS-EXT-AZ:availability_zone')
#: Enables fine grained control of the block device mapping for an
@ -128,6 +133,12 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin):
#: instance name template. Appears in the response for administrative users
#: only.
instance_name = resource.Body('OS-EXT-SRV-ATTR:instance_name')
#: The address to use to connect to this server from the current calling
#: context. This will be set to public_ipv6 if the calling host has
#: routable ipv6 addresses, and to private_ipv4 if the Connection was
#: created with private=True. Otherwise it will be set to public_ipv4.
interface_ip = resource.Computed('interface_ip', default='')
# The locked status of the server
is_locked = resource.Body('locked', type=bool)
#: The UUID of the kernel image when using an AMI. Will be null if not.
@ -157,6 +168,17 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin):
progress = resource.Body('progress', type=int)
#: The ID of the project this server is associated with.
project_id = resource.Body('tenant_id')
#: The private IPv4 address of this server
private_v4 = resource.Computed('private_v4', default='')
#: The private IPv6 address of this server
private_v6 = resource.Computed('private_v6', default='')
#: The public IPv4 address of this server
public_v4 = resource.Computed('public_v4', default='')
#: The public IPv6 address of this server
public_v6 = resource.Computed('public_v6', default='')
#: The UUID of the ramdisk image when using an AMI. Will be null if not.
#: By default, it appears in the response for administrative users only.
ramdisk_id = resource.Body('OS-EXT-SRV-ATTR:ramdisk_id')

View File

@ -76,7 +76,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertIsNotNone(server['adminPass'])
self.assertTrue(
self.user_cloud.delete_server(self.server_name, wait=True))
@ -92,7 +92,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertIsNotNone(server['adminPass'])
self.assertTrue(
self.user_cloud.delete_server(
@ -123,7 +123,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertTrue(server['has_config_drive'])
self.assertIsNotNone(server['adminPass'])
self.assertTrue(
@ -143,7 +143,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertFalse(server['has_config_drive'])
self.assertIsNotNone(server['adminPass'])
self.assertTrue(
@ -182,7 +182,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertIsNotNone(server['adminPass'])
self.assertTrue(
self.user_cloud.delete_server(self.server_name, wait=True))
@ -231,7 +231,7 @@ class TestCompute(base.BaseFunctionalTest):
wait=True)
self.assertEqual(self.server_name, server['name'])
self.assertEqual(self.image.id, server['image']['id'])
self.assertEqual(self.flavor.id, server['flavor']['id'])
self.assertEqual(self.flavor.name, server['flavor']['original_name'])
self.assertEqual(server['adminPass'], 'sheiqu9loegahSh')
self.assertTrue(
self.user_cloud.delete_server(self.server_name, wait=True))

View File

@ -23,6 +23,7 @@ import uuid
from openstack.cloud import exc
from openstack.cloud import meta
from openstack.compute.v2 import server
from openstack import connection
from openstack.tests import fakes
from openstack.tests.unit import base
@ -52,6 +53,7 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -85,6 +87,7 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -195,19 +198,19 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
normalized = self.cloud._expand_server(
self.cloud._normalize_server(fake_server), False, False)
self.assertEqual(
normalized,
self.assertDictEqual(
server.Server(**fake_server).to_dict(computed=False),
self.cloud.create_server(
name='server-name',
image=dict(id='image-id'),
flavor=dict(id='flavor-id')))
flavor=dict(id='flavor-id')).to_dict(computed=False)
)
self.assert_calls()
@ -233,20 +236,19 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
normalized = self.cloud._expand_server(
self.cloud._normalize_server(fake_server), False, False)
self.assertEqual(
normalized,
self.assertDictEqual(
server.Server(**fake_server).to_dict(computed=False),
self.cloud.create_server(
name='server-name',
image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
config_drive=True))
config_drive=True).to_dict(computed=False))
self.assert_calls()
@ -271,20 +273,20 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
normalized = self.cloud._expand_server(
self.cloud._normalize_server(fake_server), False, False)
self.assertEqual(
normalized,
server.Server(**fake_server).to_dict(computed=False),
self.cloud.create_server(
name='server-name',
image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
config_drive=None))
config_drive=None).to_dict(computed=False)
)
self.assert_calls()
@ -313,6 +315,7 @@ class TestCreateServer(base.TestCase):
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -323,7 +326,7 @@ class TestCreateServer(base.TestCase):
self.cloud.create_server(
name='server-name', image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
admin_pass=admin_pass)['adminPass'])
admin_pass=admin_pass)['admin_password'])
self.assert_calls()
@ -368,7 +371,7 @@ class TestCreateServer(base.TestCase):
# Even with the wait, we should still get back a passworded server
self.assertEqual(
server['adminPass'],
server['admin_password'],
self.cloud._normalize_server(fake_server_with_pass)['adminPass']
)
self.assert_calls()
@ -400,6 +403,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'user_data': user_data_b64,
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -577,6 +581,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{u'uuid': u'network-id'}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -629,6 +634,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{u'uuid': u'network-id'}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -671,6 +677,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{'fixed_ip': fixed_ip}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -713,6 +720,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{'fixed_ip': fixed_ip}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -757,6 +765,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{'fixed_ip': fixed_ip}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -860,6 +869,7 @@ class TestCreateServer(base.TestCase):
u'min_count': 1,
u'networks': [{u'port': port_id}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -916,6 +926,7 @@ class TestCreateServer(base.TestCase):
}
],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
@ -959,6 +970,7 @@ class TestCreateServer(base.TestCase):
u'uuid': u'image-id',
u'volume_size': u'1'}],
u'name': u'server-name'}})),
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),

View File

@ -22,6 +22,7 @@ Tests floating IP resource methods for Neutron and Nova-network.
from unittest.mock import patch
from openstack.cloud import meta
from openstack.compute.v2 import server as _server
from openstack import connection
from openstack.tests import fakes
from openstack.tests.unit import base
@ -96,7 +97,10 @@ class TestFloatingIP(base.TestCase):
}]
}
)
server_dict = meta.add_server_interfaces(self.cloud, server)
server_dict = meta.add_server_interfaces(
self.cloud,
_server.Server(**server)
)
new_server = self.cloud.add_ips_to_server(server=server_dict)
mock_get_floating_ip.assert_not_called()
@ -136,7 +140,9 @@ class TestFloatingIP(base.TestCase):
}]
}
)
server_dict = meta.add_server_interfaces(self.cloud, server)
server_dict = meta.add_server_interfaces(
self.cloud,
_server.Server(**server))
new_server = self.cloud.add_ips_to_server(server=server_dict)
mock_get_floating_ip.assert_not_called()
@ -172,7 +178,9 @@ class TestFloatingIP(base.TestCase):
}]
}
)
server_dict = meta.add_server_interfaces(self.cloud, server)
server_dict = meta.add_server_interfaces(
self.cloud,
_server.Server(**server))
new_server = self.cloud.add_ips_to_server(server=server_dict)
mock_get_floating_ip.assert_not_called()

View File

@ -15,6 +15,7 @@
from unittest import mock
from openstack.cloud import meta
from openstack.compute.v2 import server as _server
from openstack import connection
from openstack.tests import fakes
from openstack.tests.unit import base
@ -424,7 +425,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual(PRIVATE_V4, srv['private_v4'])
self.assert_calls()
@ -482,7 +484,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual(PRIVATE_V4, srv['private_v4'])
self.assert_calls()
@ -539,7 +542,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual(PRIVATE_V4, srv['private_v4'])
self.assert_calls()
@ -617,7 +621,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual(PUBLIC_V4, srv['public_v4'])
self.assert_calls()
@ -669,7 +674,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual("10.223.160.141", srv['private_v4'])
self.assertEqual("104.130.246.91", srv['public_v4'])
@ -736,7 +742,8 @@ class TestMeta(base.TestCase):
json={'security_groups': []})
])
srv = self.cloud.get_openstack_vars(fake_server)
srv = self.cloud.get_openstack_vars(
_server.Server(**fake_server))
self.assertEqual("10.223.160.141", srv['private_v4'])
self.assertEqual("104.130.246.91", srv['public_v4'])

View File

@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from openstack.compute.v2 import server as server_resource
from openstack.image.v2 import image as image_resource
from openstack.tests.unit import base
@ -521,141 +520,6 @@ class TestNormalize(base.TestCase):
retval = self.cloud._normalize_image(image)
self.assertDictEqual(expected, retval)
def test_normalize_servers_normal(self):
res = server_resource.Server(
connection=self.cloud,
**RAW_SERVER_DICT)
expected = {
'OS-DCF:diskConfig': u'MANUAL',
'OS-EXT-AZ:availability_zone': u'ca-ymq-2',
'OS-EXT-SRV-ATTR:host': None,
'OS-EXT-SRV-ATTR:hostname': None,
'OS-EXT-SRV-ATTR:hypervisor_hostname': None,
'OS-EXT-SRV-ATTR:instance_name': None,
'OS-EXT-SRV-ATTR:kernel_id': None,
'OS-EXT-SRV-ATTR:launch_index': None,
'OS-EXT-SRV-ATTR:ramdisk_id': None,
'OS-EXT-SRV-ATTR:reservation_id': None,
'OS-EXT-SRV-ATTR:root_device_name': None,
'OS-EXT-SRV-ATTR:user_data': None,
'OS-EXT-STS:power_state': 1,
'OS-EXT-STS:task_state': None,
'OS-EXT-STS:vm_state': u'active',
'OS-SCH-HNT:scheduler_hints': None,
'OS-SRV-USG:launched_at': u'2015-08-01T19:52:02.000000',
'OS-SRV-USG:terminated_at': None,
'accessIPv4': u'',
'accessIPv6': u'',
'addresses': {
u'public': [{
u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:9f:46:3e',
u'OS-EXT-IPS:type': u'fixed',
u'addr': u'2604:e100:1:0:f816:3eff:fe9f:463e',
u'version': 6
}, {
u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:9f:46:3e',
u'OS-EXT-IPS:type': u'fixed',
u'addr': u'162.253.54.192',
u'version': 4}]},
'adminPass': None,
'az': u'ca-ymq-2',
'block_device_mapping': None,
'cloud': '_test_cloud_',
'config_drive': u'True',
'created': u'2015-08-01T19:52:16Z',
'created_at': u'2015-08-01T19:52:16Z',
'description': None,
'disk_config': u'MANUAL',
'flavor': {u'id': u'bbcb7eb5-5c8d-498f-9d7e-307c575d3566'},
'has_config_drive': True,
'host': None,
'hostId': u'bd37',
'host_id': u'bd37',
'host_status': None,
'hostname': None,
'hypervisor_hostname': None,
'id': u'811c5197-dba7-4d3a-a3f6-68ca5328b9a7',
'image': {u'id': u'69c99b45-cd53-49de-afdc-f24789eb8f83'},
'instance_name': None,
'interface_ip': '',
'kernel_id': None,
'key_name': u'mordred',
'launch_index': None,
'launched_at': u'2015-08-01T19:52:02.000000',
'location': {
'cloud': '_test_cloud_',
'project': {
'domain_id': None,
'domain_name': None,
'id': u'db92b20496ae4fbda850a689ea9d563f',
'name': None},
'region_name': u'RegionOne',
'zone': u'ca-ymq-2'},
'locked': True,
'max_count': None,
'metadata': {u'group': u'irc', u'groups': u'irc,enabled'},
'min_count': None,
'name': u'mordred-irc',
'networks': {
u'public': [
u'2604:e100:1:0:f816:3eff:fe9f:463e',
u'162.253.54.192']},
'os-extended-volumes:volumes_attached': [],
'personality': None,
'power_state': 1,
'private_v4': None,
'progress': 0,
'project_id': u'db92b20496ae4fbda850a689ea9d563f',
'properties': {
'OS-DCF:diskConfig': u'MANUAL',
'OS-EXT-AZ:availability_zone': u'ca-ymq-2',
'OS-EXT-SRV-ATTR:host': None,
'OS-EXT-SRV-ATTR:hostname': None,
'OS-EXT-SRV-ATTR:hypervisor_hostname': None,
'OS-EXT-SRV-ATTR:instance_name': None,
'OS-EXT-SRV-ATTR:kernel_id': None,
'OS-EXT-SRV-ATTR:launch_index': None,
'OS-EXT-SRV-ATTR:ramdisk_id': None,
'OS-EXT-SRV-ATTR:reservation_id': None,
'OS-EXT-SRV-ATTR:root_device_name': None,
'OS-EXT-SRV-ATTR:user_data': None,
'OS-EXT-STS:power_state': 1,
'OS-EXT-STS:task_state': None,
'OS-EXT-STS:vm_state': u'active',
'OS-SCH-HNT:scheduler_hints': None,
'OS-SRV-USG:launched_at': u'2015-08-01T19:52:02.000000',
'OS-SRV-USG:terminated_at': None,
'host_status': None,
'locked': True,
'max_count': None,
'min_count': None,
'os-extended-volumes:volumes_attached': [],
'trusted_image_certificates': None},
'public_v4': None,
'public_v6': None,
'ramdisk_id': None,
'region': u'RegionOne',
'reservation_id': None,
'root_device_name': None,
'scheduler_hints': None,
'security_groups': [{u'name': u'default'}],
'server_groups': None,
'status': u'ACTIVE',
'locked': True,
'tags': [],
'task_state': None,
'tenant_id': u'db92b20496ae4fbda850a689ea9d563f',
'terminated_at': None,
'trusted_image_certificates': None,
'updated': u'2016-10-15T15:49:29Z',
'user_data': None,
'user_id': u'e9b21dc437d149858faee0898fb08e92',
'vm_state': u'active',
'volumes': []}
retval = self.cloud._normalize_server(res._to_munch())
_assert_server_munch_attributes(self, res, retval)
self.assertEqual(expected, retval)
def test_normalize_secgroups(self):
nova_secgroup = dict(
id='abc123',
@ -1114,97 +978,6 @@ class TestStrictNormalize(base.TestCase):
self.assertEqual(sorted(expected.keys()), sorted(retval.keys()))
self.assertEqual(expected, retval)
def test_normalize_servers(self):
self.register_uris([
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', 'detail']),
json={'servers': [RAW_SERVER_DICT]}),
])
expected = {
'accessIPv4': u'',
'accessIPv6': u'',
'addresses': {
u'public': [{
u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:9f:46:3e',
u'OS-EXT-IPS:type': u'fixed',
u'addr': u'2604:e100:1:0:f816:3eff:fe9f:463e',
u'version': 6
}, {
u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:9f:46:3e',
u'OS-EXT-IPS:type': u'fixed',
u'addr': u'162.253.54.192',
u'version': 4}]},
'adminPass': None,
'block_device_mapping': None,
'created': u'2015-08-01T19:52:16Z',
'created_at': u'2015-08-01T19:52:16Z',
'description': None,
'disk_config': u'MANUAL',
'flavor': {u'id': u'bbcb7eb5-5c8d-498f-9d7e-307c575d3566'},
'has_config_drive': True,
'host': None,
'host_id': u'bd37',
'hostname': None,
'hypervisor_hostname': None,
'id': u'811c5197-dba7-4d3a-a3f6-68ca5328b9a7',
'image': {u'id': u'69c99b45-cd53-49de-afdc-f24789eb8f83'},
'interface_ip': u'',
'instance_name': None,
'kernel_id': None,
'key_name': u'mordred',
'launch_index': None,
'launched_at': u'2015-08-01T19:52:02.000000',
'location': {
'cloud': '_test_cloud_',
'project': {
'domain_id': None,
'domain_name': None,
'id': u'db92b20496ae4fbda850a689ea9d563f',
'name': None},
'region_name': u'RegionOne',
'zone': u'ca-ymq-2'},
'metadata': {u'group': u'irc', u'groups': u'irc,enabled'},
'name': u'mordred-irc',
'networks': {
u'public': [
u'2604:e100:1:0:f816:3eff:fe9f:463e',
u'162.253.54.192']},
'personality': None,
'power_state': 1,
'private_v4': None,
'progress': 0,
'properties': {
'host_status': None,
'locked': True,
'max_count': None,
'min_count': None,
'trusted_image_certificates': None
},
'public_v4': None,
'public_v6': None,
'ramdisk_id': None,
'reservation_id': None,
'root_device_name': None,
'scheduler_hints': None,
'security_groups': [{u'name': u'default'}],
'server_groups': None,
'status': u'ACTIVE',
'tags': [],
'task_state': None,
'terminated_at': None,
'updated': u'2016-10-15T15:49:29Z',
'user_data': None,
'user_id': u'e9b21dc437d149858faee0898fb08e92',
'vm_state': u'active',
'volumes': []}
self.cloud.strict_mode = True
retval = self.cloud.list_servers(bare=True)[0]
_assert_server_munch_attributes(self, expected, retval)
self.assertEqual(expected, retval)
def test_normalize_secgroups(self):
nova_secgroup = dict(
id='abc123',