blob: 96b423d62ebd1aa88108404f7070e452a59910db [file] [log] [blame]
Yuiko Takadaebcf6af2013-07-09 05:10:55 +00001# 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.
15
Doug Hellmann583ce2c2015-03-11 14:55:46 +000016from oslo_log import log as logging
Adam Gandelmanfbc95ac2014-06-19 17:33:43 -070017import testtools
Sean Daguefe8a6092013-07-27 08:15:55 -040018
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -050019from tempest.common import waiters
Matthew Treinish6c072292014-01-29 19:15:52 +000020from tempest import config
Ken'ichi Ohmichibe4fb502017-03-10 10:04:48 -080021from tempest.lib.common.utils import data_utils
Jordan Pittier35a63752016-08-30 13:09:12 +020022from tempest.lib.common.utils import test_utils
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050023from tempest.lib import decorators
24from tempest.lib import exceptions as lib_exc
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000025from tempest.scenario import manager
Chris Hoge7579c1a2015-02-26 14:12:15 -080026from tempest import test
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000027
Matthew Treinish6c072292014-01-29 19:15:52 +000028CONF = config.CONF
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000029LOG = logging.getLogger(__name__)
30
31
Andrea Frittolic0651b22014-09-17 16:34:01 +010032class TestStampPattern(manager.ScenarioTest):
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000033 """The test suite for both snapshoting and attaching of volume
34
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000035 This test is for snapshotting an instance/volume and attaching the volume
36 created from snapshot to the instance booted from snapshot.
37 The following is the scenario outline:
38 1. Boot an instance "instance1"
39 2. Create a volume "volume1"
40 3. Attach volume1 to instance1
41 4. Create a filesystem on volume1
42 5. Mount volume1
43 6. Create a file which timestamp is written in volume1
44 7. Unmount volume1
45 8. Detach volume1 from instance1
46 9. Get a snapshot "snapshot_from_volume" of volume1
47 10. Get a snapshot "snapshot_from_instance" of instance1
48 11. Boot an instance "instance2" from snapshot_from_instance
49 12. Create a volume "volume2" from snapshot_from_volume
50 13. Attach volume2 to instance2
51 14. Check the existence of a file which created at 6. in volume2
52 """
53
JordanPbce55532014-03-19 12:10:32 +010054 @classmethod
Emily Hugenbruch5e2d2a22015-02-25 21:35:45 +000055 def skip_checks(cls):
56 super(TestStampPattern, cls).skip_checks()
JordanPbce55532014-03-19 12:10:32 +010057 if not CONF.volume_feature_enabled.snapshot:
58 raise cls.skipException("Cinder volume snapshots are disabled")
59
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000060 def _create_volume_snapshot(self, volume):
Ken'ichi Ohmichi6ded8df2015-03-23 02:00:19 +000061 snapshot_name = data_utils.rand_name('scenario-snapshot')
Matt Riedemannfd5657d2015-09-30 14:47:07 -070062 snapshot = self.snapshots_client.create_snapshot(
Ghanshyam0b75b632015-12-11 15:08:28 +090063 volume_id=volume['id'], display_name=snapshot_name)['snapshot']
zhufl96c36cf2017-02-10 09:51:57 +080064 self.addCleanup(self.snapshots_client.wait_for_resource_deletion,
65 snapshot['id'])
66 self.addCleanup(self.snapshots_client.delete_snapshot, snapshot['id'])
lkuchlan52d7b0d2016-11-07 20:53:19 +020067 waiters.wait_for_volume_resource_status(self.volumes_client,
68 volume['id'], 'available')
69 waiters.wait_for_volume_resource_status(self.snapshots_client,
70 snapshot['id'], 'available')
zhufl96c36cf2017-02-10 09:51:57 +080071 if 'display_name' in snapshot:
72 self.assertEqual(snapshot_name, snapshot['display_name'])
73 else:
74 self.assertEqual(snapshot_name, snapshot['name'])
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000075 return snapshot
76
Sean Dague20e98612016-01-06 14:33:28 -050077 def _wait_for_volume_available_on_the_system(self, ip_address,
Matt Riedemannfd5657d2015-09-30 14:47:07 -070078 private_key):
Sean Dague20e98612016-01-06 14:33:28 -050079 ssh = self.get_remote_client(ip_address, private_key=private_key)
Attila Fazekas70431ba2013-07-26 18:47:37 +020080
81 def _func():
Evgeny Antyshev4894a912016-11-21 12:17:18 +000082 disks = ssh.get_disks()
Jordan Pittier525ec712016-12-07 17:51:26 +010083 LOG.debug("Disks: %s", disks)
Evgeny Antyshev4894a912016-11-21 12:17:18 +000084 return CONF.compute.volume_device_name in disks
Attila Fazekas70431ba2013-07-26 18:47:37 +020085
Jordan Pittier35a63752016-08-30 13:09:12 +020086 if not test_utils.call_until_true(_func,
87 CONF.compute.build_timeout,
88 CONF.compute.build_interval):
guo yunxianebb15f22016-11-01 21:03:35 +080089 raise lib_exc.TimeoutException
Attila Fazekas70431ba2013-07-26 18:47:37 +020090
Sean Dague49505df2017-03-01 11:35:58 -050091 @test.attr(type='slow')
zhufl758b7672017-02-23 10:37:50 +080092 @decorators.skip_because(bug="1664793")
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -080093 @decorators.idempotent_id('10fd234a-515c-41e5-b092-8323060598c5')
Adam Gandelmanfbc95ac2014-06-19 17:33:43 -070094 @testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
95 'Snapshotting is not available.')
zhufl6b7040a2017-01-18 16:38:34 +080096 @testtools.skipUnless(CONF.network.public_network_id,
97 'The public_network_id option must be specified.')
Alexander Gubanovea75ca92016-01-26 13:43:13 +020098 @test.services('compute', 'network', 'volume', 'image')
Yuiko Takadaebcf6af2013-07-09 05:10:55 +000099 def test_stamp_pattern(self):
Takashi NATSUME6d5a2b42015-09-08 11:27:49 +0900100 # prepare for booting an instance
Matt Riedemannfd5657d2015-09-30 14:47:07 -0700101 keypair = self.create_keypair()
102 security_group = self._create_security_group()
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000103
104 # boot an instance and create a timestamp file in it
Jordan Pittierbbb17122016-01-26 17:10:55 +0100105 volume = self.create_volume()
lanoux5fc14522015-09-21 08:17:35 +0000106 server = self.create_server(
lanoux5fc14522015-09-21 08:17:35 +0000107 key_name=keypair['name'],
zhufl96c36cf2017-02-10 09:51:57 +0800108 security_groups=[{'name': security_group['name']}])
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000109
110 # create and add floating IP to server1
Sean Dague20e98612016-01-06 14:33:28 -0500111 ip_for_server = self.get_server_ip(server)
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000112
Jordan Pittierbbb17122016-01-26 17:10:55 +0100113 self.nova_volume_attach(server, volume)
Matt Riedemannfd5657d2015-09-30 14:47:07 -0700114 self._wait_for_volume_available_on_the_system(ip_for_server,
115 keypair['private_key'])
Alexander Gubanovabd154c2015-09-23 23:24:06 +0300116 timestamp = self.create_timestamp(ip_for_server,
Matt Riedemannfd5657d2015-09-30 14:47:07 -0700117 CONF.compute.volume_device_name,
118 private_key=keypair['private_key'])
Jordan Pittierbbb17122016-01-26 17:10:55 +0100119 self.nova_volume_detach(server, volume)
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000120
121 # snapshot the volume
122 volume_snapshot = self._create_volume_snapshot(volume)
123
124 # snapshot the instance
Ken'ichi Ohmichia4912232013-08-26 14:03:25 +0900125 snapshot_image = self.create_server_snapshot(server=server)
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000126
127 # create second volume from the snapshot(volume2)
Jordan Pittierbbb17122016-01-26 17:10:55 +0100128 volume_from_snapshot = self.create_volume(
Andrea Frittolic0651b22014-09-17 16:34:01 +0100129 snapshot_id=volume_snapshot['id'])
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000130
131 # boot second instance from the snapshot(instance2)
lanoux5fc14522015-09-21 08:17:35 +0000132 server_from_snapshot = self.create_server(
133 image_id=snapshot_image['id'],
134 key_name=keypair['name'],
zhufl96c36cf2017-02-10 09:51:57 +0800135 security_groups=[{'name': security_group['name']}])
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000136
137 # create and add floating IP to server_from_snapshot
Sean Dague20e98612016-01-06 14:33:28 -0500138 ip_for_snapshot = self.get_server_ip(server_from_snapshot)
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000139
140 # attach volume2 to instance2
Jordan Pittierbbb17122016-01-26 17:10:55 +0100141 self.nova_volume_attach(server_from_snapshot, volume_from_snapshot)
Matt Riedemannfd5657d2015-09-30 14:47:07 -0700142 self._wait_for_volume_available_on_the_system(ip_for_snapshot,
143 keypair['private_key'])
Yuiko Takadaebcf6af2013-07-09 05:10:55 +0000144
145 # check the existence of the timestamp file in the volume2
Alexander Gubanovabd154c2015-09-23 23:24:06 +0300146 timestamp2 = self.get_timestamp(ip_for_snapshot,
Matt Riedemannfd5657d2015-09-30 14:47:07 -0700147 CONF.compute.volume_device_name,
148 private_key=keypair['private_key'])
Alexander Gubanovabd154c2015-09-23 23:24:06 +0300149 self.assertEqual(timestamp, timestamp2)