diff --git a/novaclient/tests/functional/v2/legacy/test_extended_attributes.py b/novaclient/tests/functional/v2/legacy/test_extended_attributes.py new file mode 100644 index 000000000..55da98826 --- /dev/null +++ b/novaclient/tests/functional/v2/legacy/test_extended_attributes.py @@ -0,0 +1,59 @@ +# 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 json + +from novaclient.tests.functional import base +from novaclient.v2 import shell + + +class TestExtAttrNovaClient(base.ClientTestBase): + """Functional tests for os-extended-server-attributes""" + + COMPUTE_API_VERSION = "2.1" + + def _create_server_and_attach_volume(self): + name = self.name_generate(prefix='server') + server = self.client.servers.create(name, self.image, self.flavor) + self.addCleanup(server.delete) + shell._poll_for_status( + self.client.servers.get, server.id, + 'building', ['active']) + volume = self.client.volumes.create(1) + self.addCleanup(self.nova, 'volume-delete', params=volume.id) + self.wait_for_volume_status(volume, 'available') + self.nova('volume-attach', params="%s %s" % (name, volume.id)) + self.addCleanup(self._release_volume, server, volume) + self.wait_for_volume_status(volume, 'in-use') + return server, volume + + def _release_volume(self, server, volume): + self.nova('volume-detach', params="%s %s" % (server.id, volume.id)) + self.wait_for_volume_status(volume, 'available') + + def test_extended_server_attributes(self): + server, volume = self._create_server_and_attach_volume() + table = self.nova('show %s' % server.id) + # Check that attributes listed below exist in 'nova show' table and + # they are exactly Property attributes (not an instance's name, e.g.) + # The _get_value_from_the_table() will raise an exception + # if attr is not a key (first column) of the table dict + for attr in ['OS-EXT-SRV-ATTR:host', + 'OS-EXT-SRV-ATTR:hypervisor_hostname', + 'OS-EXT-SRV-ATTR:instance_name']: + self._get_value_from_the_table(table, attr) + # Check that attribute given below also exists in 'nova show' table + # as a key (first column) of table dict + volume_attr = self._get_value_from_the_table( + table, 'os-extended-volumes:volumes_attached') + # Check that 'id' exists as a key of volume_attr dict + self.assertIn('id', json.loads(volume_attr)[0]) diff --git a/novaclient/tests/functional/v2/test_extended_attributes.py b/novaclient/tests/functional/v2/test_extended_attributes.py new file mode 100644 index 000000000..6fddcc957 --- /dev/null +++ b/novaclient/tests/functional/v2/test_extended_attributes.py @@ -0,0 +1,44 @@ +# 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 json + +from novaclient.tests.functional.v2.legacy import test_extended_attributes + + +class TestExtAttrNovaClientV23(test_extended_attributes.TestExtAttrNovaClient): + """Functional tests for os-extended-server-attributes, microversion 2.3""" + + COMPUTE_API_VERSION = "2.3" + + def test_extended_server_attributes(self): + server, volume = self._create_server_and_attach_volume() + table = self.nova('show %s' % server.id) + # Check that attributes listed below exist in 'nova show' table and + # they are exactly Property attributes (not an instance's name, e.g.) + # The _get_value_from_the_table() will raise an exception + # if attr is not a key of the table dict (first column) + for attr in ['OS-EXT-SRV-ATTR:reservation_id', + 'OS-EXT-SRV-ATTR:launch_index', + 'OS-EXT-SRV-ATTR:ramdisk_id', + 'OS-EXT-SRV-ATTR:kernel_id', + 'OS-EXT-SRV-ATTR:hostname', + 'OS-EXT-SRV-ATTR:root_device_name', + 'OS-EXT-SRV-ATTR:user_data']: + self._get_value_from_the_table(table, attr) + # Check that attribute given below also exists in 'nova show' table + # as a key (first column) of table dict + volume_attr = self._get_value_from_the_table( + table, 'os-extended-volumes:volumes_attached') + # Check that 'delete_on_termination' exists as a key + # of volume_attr dict + self.assertIn('delete_on_termination', json.loads(volume_attr)[0])