Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 1 | # Copyright 2013 NEC Corporation |
| 2 | # All Rights Reserved. |
| 3 | # |
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 5 | # not use this file except in compliance with the License. You may obtain |
| 6 | # a copy of the License at |
| 7 | # |
| 8 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | # |
| 10 | # Unless required by applicable law or agreed to in writing, software |
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 13 | # License for the specific language governing permissions and limitations |
| 14 | # under the License. |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 15 | from tempest_lib import exceptions |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 16 | |
Masayuki Igawa | 259c113 | 2013-10-31 17:48:44 +0900 | [diff] [blame] | 17 | from tempest.common.utils import data_utils |
Matthew Treinish | 6c07229 | 2014-01-29 19:15:52 +0000 | [diff] [blame] | 18 | from tempest import config |
Matthew Treinish | f4a9b0f | 2013-07-26 16:58:26 -0400 | [diff] [blame] | 19 | from tempest.openstack.common import log as logging |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 20 | from tempest.scenario import manager |
Masayuki Igawa | 4ded9f0 | 2014-02-17 15:05:59 +0900 | [diff] [blame] | 21 | from tempest import test |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 22 | |
Matthew Treinish | 6c07229 | 2014-01-29 19:15:52 +0000 | [diff] [blame] | 23 | CONF = config.CONF |
| 24 | |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 25 | |
| 26 | LOG = logging.getLogger(__name__) |
| 27 | |
| 28 | |
Ghanshyam | aa4511e | 2014-09-08 10:37:50 +0900 | [diff] [blame] | 29 | class TestLargeOpsScenario(manager.ScenarioTest): |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 30 | |
| 31 | """ |
| 32 | Test large operations. |
| 33 | |
| 34 | This test below: |
Joe Gordon | fa29a62 | 2014-04-17 13:21:44 -0700 | [diff] [blame] | 35 | * Spin up multiple instances in one nova call, and repeat three times |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 36 | * as a regular user |
| 37 | * TODO: same thing for cinder |
| 38 | |
| 39 | """ |
| 40 | |
Sylvain Afchain | 9206477 | 2014-01-16 02:45:57 +0100 | [diff] [blame] | 41 | @classmethod |
Andrea Frittoli | ac20b5e | 2014-09-15 13:31:14 +0100 | [diff] [blame] | 42 | def resource_setup(cls): |
Yair Fried | c1f1e83 | 2014-09-21 12:57:32 +0300 | [diff] [blame] | 43 | if CONF.scenario.large_ops_number < 1: |
| 44 | raise cls.skipException("large_ops_number not set to multiple " |
| 45 | "instances") |
Sylvain Afchain | 9206477 | 2014-01-16 02:45:57 +0100 | [diff] [blame] | 46 | cls.set_network_resources() |
Andrea Frittoli | ac20b5e | 2014-09-15 13:31:14 +0100 | [diff] [blame] | 47 | super(TestLargeOpsScenario, cls).resource_setup() |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 48 | # list of cleanup calls to be executed in reverse order |
| 49 | cls._cleanup_resources = [] |
| 50 | |
| 51 | @classmethod |
| 52 | def resource_cleanup(cls): |
| 53 | while cls._cleanup_resources: |
| 54 | function, args, kwargs = cls._cleanup_resources.pop(-1) |
| 55 | try: |
| 56 | function(*args, **kwargs) |
| 57 | except exceptions.NotFound: |
| 58 | pass |
| 59 | super(TestLargeOpsScenario, cls).resource_cleanup() |
| 60 | |
| 61 | @classmethod |
| 62 | def addCleanupClass(cls, function, *arguments, **keywordArguments): |
| 63 | cls._cleanup_resources.append((function, arguments, keywordArguments)) |
Sylvain Afchain | 9206477 | 2014-01-16 02:45:57 +0100 | [diff] [blame] | 64 | |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 65 | def _wait_for_server_status(self, status): |
| 66 | for server in self.servers: |
Joe Gordon | 6286a6a | 2014-03-05 16:35:03 -0800 | [diff] [blame] | 67 | # Make sure nova list keeps working throughout the build process |
| 68 | self.servers_client.list_servers() |
Ghanshyam | aa4511e | 2014-09-08 10:37:50 +0900 | [diff] [blame] | 69 | self.servers_client.wait_for_server_status(server['id'], status) |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 70 | |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 71 | def nova_boot(self): |
Masayuki Igawa | 259c113 | 2013-10-31 17:48:44 +0900 | [diff] [blame] | 72 | name = data_utils.rand_name('scenario-server-') |
Matthew Treinish | 6c07229 | 2014-01-29 19:15:52 +0000 | [diff] [blame] | 73 | flavor_id = CONF.compute.flavor_ref |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 74 | # Explicitly create secgroup to avoid cleanup at the end of testcases. |
| 75 | # Since no traffic is tested, we don't need to actually add rules to |
| 76 | # secgroup |
David Kranz | 9964b4e | 2015-02-06 15:45:29 -0500 | [diff] [blame] | 77 | secgroup = self.security_groups_client.create_security_group( |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 78 | 'secgroup-%s' % name, 'secgroup-desc-%s' % name) |
| 79 | self.addCleanupClass(self.security_groups_client.delete_security_group, |
| 80 | secgroup['id']) |
| 81 | |
Ghanshyam | aa4511e | 2014-09-08 10:37:50 +0900 | [diff] [blame] | 82 | self.servers_client.create_server( |
| 83 | name, |
| 84 | self.image, |
| 85 | flavor_id, |
Matthew Treinish | 6c07229 | 2014-01-29 19:15:52 +0000 | [diff] [blame] | 86 | min_count=CONF.scenario.large_ops_number, |
Ken'ichi Ohmichi | 1b3461e | 2014-12-02 03:41:07 +0000 | [diff] [blame] | 87 | security_groups=[{'name': secgroup['name']}]) |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 88 | # needed because of bug 1199788 |
Ghanshyam | aa4511e | 2014-09-08 10:37:50 +0900 | [diff] [blame] | 89 | params = {'name': name} |
| 90 | _, server_list = self.servers_client.list_servers(params) |
| 91 | self.servers = server_list['servers'] |
Joe Gordon | a321965 | 2013-10-09 15:23:11 -0700 | [diff] [blame] | 92 | for server in self.servers: |
Matthew Treinish | b7144eb | 2013-12-13 22:57:35 +0000 | [diff] [blame] | 93 | # after deleting all servers - wait for all servers to clear |
| 94 | # before cleanup continues |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 95 | self.addCleanupClass(self.servers_client. |
| 96 | wait_for_server_termination, |
| 97 | server['id']) |
Matthew Treinish | b7144eb | 2013-12-13 22:57:35 +0000 | [diff] [blame] | 98 | for server in self.servers: |
Yair Fried | 6cad136 | 2014-11-24 17:56:56 +0200 | [diff] [blame] | 99 | self.addCleanupClass(self.servers_client.delete_server, |
| 100 | server['id']) |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 101 | self._wait_for_server_status('ACTIVE') |
| 102 | |
Joe Gordon | b7f37cc | 2014-05-09 13:30:40 -0700 | [diff] [blame] | 103 | def _large_ops_scenario(self): |
Joe Gordon | b5e10cd | 2013-07-10 15:51:12 +0000 | [diff] [blame] | 104 | self.glance_image_create() |
| 105 | self.nova_boot() |
Joe Gordon | b7f37cc | 2014-05-09 13:30:40 -0700 | [diff] [blame] | 106 | |
| 107 | @test.services('compute', 'image') |
| 108 | def test_large_ops_scenario_1(self): |
| 109 | self._large_ops_scenario() |
| 110 | |
| 111 | @test.services('compute', 'image') |
| 112 | def test_large_ops_scenario_2(self): |
| 113 | self._large_ops_scenario() |
| 114 | |
| 115 | @test.services('compute', 'image') |
| 116 | def test_large_ops_scenario_3(self): |
| 117 | self._large_ops_scenario() |