Jay Pipes | 13b479b | 2012-06-11 14:52:27 -0400 | [diff] [blame] | 1 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 |
| 2 | |
| 3 | # Copyright 2012 OpenStack, LLC |
| 4 | # All Rights Reserved. |
| 5 | # |
| 6 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 7 | # not use this file except in compliance with the License. You may obtain |
| 8 | # a copy of the License at |
| 9 | # |
| 10 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | # |
| 12 | # Unless required by applicable law or agreed to in writing, software |
| 13 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 14 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 15 | # License for the specific language governing permissions and limitations |
| 16 | # under the License. |
| 17 | |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 18 | from nose.plugins.attrib import attr |
Jay Pipes | 13b479b | 2012-06-11 14:52:27 -0400 | [diff] [blame] | 19 | |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 20 | from tempest.common.utils.data_utils import rand_name |
Sean Dague | c38bdd1 | 2012-11-16 07:08:56 -0500 | [diff] [blame] | 21 | from tempest import exceptions |
James E. Blair | e6d8ee1 | 2013-01-18 21:33:45 +0000 | [diff] [blame] | 22 | from tempest.tests.compute.base import BaseComputeTest |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 23 | |
| 24 | |
James E. Blair | e6d8ee1 | 2013-01-18 21:33:45 +0000 | [diff] [blame] | 25 | class ServerMetadataTest(BaseComputeTest): |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 26 | |
| 27 | @classmethod |
| 28 | def setUpClass(cls): |
Jay Pipes | f38eaac | 2012-06-21 13:37:35 -0400 | [diff] [blame] | 29 | super(ServerMetadataTest, cls).setUpClass() |
Daryl Walleck | c725196 | 2012-03-12 17:26:54 -0500 | [diff] [blame] | 30 | cls.client = cls.servers_client |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 31 | |
| 32 | #Create a server to be used for all read only tests |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 33 | name = rand_name('server') |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 34 | resp, server = cls.client.create_server(name, cls.image_ref, |
| 35 | cls.flavor_ref, meta={}) |
| 36 | cls.server_id = server['id'] |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 37 | |
| 38 | #Wait for the server to become active |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 39 | cls.client.wait_for_server_status(cls.server_id, 'ACTIVE') |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 40 | |
| 41 | @classmethod |
| 42 | def tearDownClass(cls): |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 43 | cls.client.delete_server(cls.server_id) |
Jay Pipes | f38eaac | 2012-06-21 13:37:35 -0400 | [diff] [blame] | 44 | super(ServerMetadataTest, cls).tearDownClass() |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 45 | |
| 46 | def setUp(self): |
ivan-zhu | 1feeb38 | 2013-01-24 10:14:39 +0800 | [diff] [blame] | 47 | super(ServerMetadataTest, self).setUp() |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 48 | meta = {'key1': 'value1', 'key2': 'value2'} |
| 49 | resp, _ = self.client.set_server_metadata(self.server_id, meta) |
| 50 | self.assertEqual(resp.status, 200) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 51 | |
| 52 | def test_list_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 53 | # All metadata key/value pairs for a server should be returned |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 54 | resp, resp_metadata = self.client.list_server_metadata(self.server_id) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 55 | |
| 56 | #Verify the expected metadata items are in the list |
| 57 | self.assertEqual(200, resp.status) |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 58 | expected = {'key1': 'value1', 'key2': 'value2'} |
| 59 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 60 | |
| 61 | def test_set_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 62 | # The server's metadata should be replaced with the provided values |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 63 | #Create a new set of metadata for the server |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 64 | req_metadata = {'meta2': 'data2', 'meta3': 'data3'} |
| 65 | resp, metadata = self.client.set_server_metadata(self.server_id, |
| 66 | req_metadata) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 67 | self.assertEqual(200, resp.status) |
| 68 | |
| 69 | #Verify the expected values are correct, and that the |
| 70 | #previous values have been removed |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 71 | resp, resp_metadata = self.client.list_server_metadata(self.server_id) |
| 72 | self.assertEqual(resp_metadata, req_metadata) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 73 | |
gavin-brebner-orange | 9cc2334 | 2011-12-02 12:49:58 +0100 | [diff] [blame] | 74 | def test_server_create_metadata_key_too_long(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 75 | # Attempt to start a server with a meta-data key that is > 255 |
| 76 | # characters |
| 77 | |
| 78 | # Try a few values |
gavin-brebner-orange | 9cc2334 | 2011-12-02 12:49:58 +0100 | [diff] [blame] | 79 | for sz in [256, 257, 511, 1023]: |
| 80 | key = "k" * sz |
| 81 | meta = {key: 'data1'} |
| 82 | name = rand_name('server') |
Sean Dague | c38bdd1 | 2012-11-16 07:08:56 -0500 | [diff] [blame] | 83 | self.assertRaises(exceptions.OverLimit, |
Sean Dague | 9b669e3 | 2012-12-13 18:40:08 -0500 | [diff] [blame] | 84 | self.create_server_with_extras, |
| 85 | name, self.image_ref, |
Sean Dague | c38bdd1 | 2012-11-16 07:08:56 -0500 | [diff] [blame] | 86 | self.flavor_ref, meta=meta) |
| 87 | |
gavin-brebner-orange | 9cc2334 | 2011-12-02 12:49:58 +0100 | [diff] [blame] | 88 | # no teardown - all creates should fail |
| 89 | |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 90 | def test_update_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 91 | # The server's metadata values should be updated to the |
| 92 | # provided values |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 93 | meta = {'key1': 'alt1', 'key3': 'value3'} |
| 94 | resp, metadata = self.client.update_server_metadata(self.server_id, |
| 95 | meta) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 96 | self.assertEqual(200, resp.status) |
| 97 | |
| 98 | #Verify the values have been updated to the proper values |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 99 | resp, resp_metadata = self.client.list_server_metadata(self.server_id) |
| 100 | expected = {'key1': 'alt1', 'key2': 'value2', 'key3': 'value3'} |
| 101 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 102 | |
| 103 | def test_get_server_metadata_item(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 104 | # The value for a specic metadata key should be returned |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 105 | resp, meta = self.client.get_server_metadata_item(self.server_id, |
| 106 | 'key2') |
| 107 | self.assertTrue('value2', meta['key2']) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 108 | |
| 109 | def test_set_server_metadata_item(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 110 | # The item's value should be updated to the provided value |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 111 | #Update the metadata value |
| 112 | meta = {'nova': 'alt'} |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 113 | resp, body = self.client.set_server_metadata_item(self.server_id, |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 114 | 'nova', meta) |
| 115 | self.assertEqual(200, resp.status) |
| 116 | |
| 117 | #Verify the meta item's value has been updated |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 118 | resp, resp_metadata = self.client.list_server_metadata(self.server_id) |
| 119 | expected = {'key1': 'value1', 'key2': 'value2', 'nova': 'alt'} |
| 120 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 121 | |
| 122 | def test_delete_server_metadata_item(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 123 | # The metadata value/key pair should be deleted from the server |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 124 | resp, meta = self.client.delete_server_metadata_item(self.server_id, |
| 125 | 'key1') |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 126 | self.assertEqual(204, resp.status) |
| 127 | |
| 128 | #Verify the metadata item has been removed |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 129 | resp, resp_metadata = self.client.list_server_metadata(self.server_id) |
| 130 | expected = {'key2': 'value2'} |
| 131 | self.assertEqual(expected, resp_metadata) |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 132 | |
| 133 | @attr(type='negative') |
| 134 | def test_get_nonexistant_server_metadata_item(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 135 | # Negative test: GET on nonexistant server should not succeed |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 136 | try: |
| 137 | resp, meta = self.client.get_server_metadata_item(999, 'test2') |
Matthew Treinish | 05d9fb9 | 2012-12-07 16:14:05 -0500 | [diff] [blame] | 138 | except Exception: |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 139 | pass |
| 140 | else: |
| 141 | self.fail('GET on nonexistant server should not succeed') |
| 142 | |
| 143 | @attr(type='negative') |
| 144 | def test_list_nonexistant_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 145 | # Negative test:List metadata on a non existant server should |
| 146 | # not succeed |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 147 | try: |
| 148 | resp, metadata = self.client.list_server_metadata(999) |
Matthew Treinish | 05d9fb9 | 2012-12-07 16:14:05 -0500 | [diff] [blame] | 149 | except Exception: |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 150 | pass |
| 151 | else: |
| 152 | self.fail('List metadata on a non existant server should' |
| 153 | 'not succeed') |
| 154 | |
| 155 | @attr(type='negative') |
| 156 | def test_set_nonexistant_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 157 | # Negative test: Set metadata on a non existant server should not |
| 158 | # succeed |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 159 | meta = {'meta1': 'data1'} |
| 160 | try: |
| 161 | resp, metadata = self.client.set_server_metadata(999, meta) |
Matthew Treinish | 05d9fb9 | 2012-12-07 16:14:05 -0500 | [diff] [blame] | 162 | except Exception: |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 163 | pass |
| 164 | else: |
| 165 | self.fail('Set metadata on a non existant server should' |
| 166 | 'not succeed') |
| 167 | |
| 168 | @attr(type='negative') |
| 169 | def test_update_nonexistant_server_metadata(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 170 | # Negative test: An update should not happen for a nonexistant image |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 171 | meta = {'key1': 'value1', 'key2': 'value2'} |
| 172 | try: |
| 173 | resp, metadata = self.client.update_server_metadata(999, meta) |
Matthew Treinish | 05d9fb9 | 2012-12-07 16:14:05 -0500 | [diff] [blame] | 174 | except Exception: |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 175 | pass |
| 176 | else: |
| 177 | self.fail('An update should not happen for a nonexistant image') |
| 178 | |
| 179 | @attr(type='negative') |
| 180 | def test_delete_nonexistant_server_metadata_item(self): |
Sean Dague | 4dd2c0b | 2013-01-03 17:50:28 -0500 | [diff] [blame] | 181 | # Negative test: Should not be able to delete metadata item from a |
| 182 | # nonexistant server |
David Kranz | 6e977a7 | 2012-02-13 09:34:05 -0500 | [diff] [blame] | 183 | meta = {'d': 'delvalue'} |
sapan-kona | 17d7f06 | 2011-12-22 17:35:00 +0530 | [diff] [blame] | 184 | |
| 185 | #Delete the metadata item |
David Kranz | 6e977a7 | 2012-02-13 09:34:05 -0500 | [diff] [blame] | 186 | try: |
| 187 | resp, metadata = self.client.delete_server_metadata_item(999, 'd') |
Matthew Treinish | 05d9fb9 | 2012-12-07 16:14:05 -0500 | [diff] [blame] | 188 | except Exception: |
David Kranz | 6e977a7 | 2012-02-13 09:34:05 -0500 | [diff] [blame] | 189 | pass |
| 190 | else: |
| 191 | self.fail('A delete should not happen for a nonexistant image') |