2803b57d6c
This is change for the volume scenario test to skip them early. When we skip the test class using skip_checks(), it check the conditions and skip the test class at first step without creating any keystone credentials. But when tests are skipped with other decorator at test level then it does create keystone credentials, setup network resources and service clients. This will mostly help neutron gate where these volume tests will be skipped in the initial stage only and will not create the keystone and network resources. One good example is TestEncryptedCinderVolumes which is skipped - https://zuul.openstack.org/build/babcc06f24764a408ed77702365b4c5b/log/job-output.txt#28695 But it still does the resources setup - https://zuul.openstack.org/build/babcc06f24764a408ed77702365b4c5b/log/controller/logs/tempest_log.txt#6374-6450 Related-Bug: #2004780 Change-Id: I59cd39c20b995bf2ed2f58f4522743c3ca51b516
165 lines
7.2 KiB
Python
165 lines
7.2 KiB
Python
# Copyright 2013 NEC Corporation
|
|
# All Rights Reserved.
|
|
#
|
|
# 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 testtools
|
|
|
|
from tempest.common import utils
|
|
from tempest.common import waiters
|
|
from tempest import config
|
|
from tempest.lib.common.utils import test_utils
|
|
from tempest.lib import decorators
|
|
from tempest.lib import exceptions as lib_exc
|
|
from tempest.scenario import manager
|
|
|
|
CONF = config.CONF
|
|
|
|
|
|
class TestStampPattern(manager.ScenarioTest):
|
|
"""The test suite for both snapshoting and attaching of volume
|
|
|
|
This test is for snapshotting an instance/volume and attaching the volume
|
|
created from snapshot to the instance booted from snapshot.
|
|
The following is the scenario outline:
|
|
1. Boot an instance "instance1"
|
|
2. Create a volume "volume1"
|
|
3. Attach volume1 to instance1
|
|
4. Create a filesystem on volume1
|
|
5. Mount volume1
|
|
6. Create a file which timestamp is written in volume1
|
|
7. Unmount volume1
|
|
8. Detach volume1 from instance1
|
|
9. Get a snapshot "snapshot_from_volume" of volume1
|
|
10. Get a snapshot "snapshot_from_instance" of instance1
|
|
11. Boot an instance "instance2" from snapshot_from_instance
|
|
12. Create a volume "volume2" from snapshot_from_volume
|
|
13. Attach volume2 to instance2
|
|
14. Check the existence of a file which created at 6. in volume2
|
|
"""
|
|
|
|
@classmethod
|
|
def skip_checks(cls):
|
|
super(TestStampPattern, cls).skip_checks()
|
|
if not CONF.service_available.cinder:
|
|
raise cls.skipException("Cinder is not available")
|
|
if not CONF.volume_feature_enabled.snapshot:
|
|
raise cls.skipException("Cinder volume snapshots are disabled")
|
|
|
|
def _attached_volume_name(
|
|
self, disks_list_before_attach, ip_address, private_key):
|
|
ssh = self.get_remote_client(ip_address, private_key=private_key)
|
|
|
|
def _wait_for_volume_available_on_system():
|
|
disks_list_after_attach = ssh.list_disks()
|
|
return len(disks_list_after_attach) > len(disks_list_before_attach)
|
|
|
|
if not test_utils.call_until_true(_wait_for_volume_available_on_system,
|
|
CONF.compute.build_timeout,
|
|
CONF.compute.build_interval):
|
|
raise lib_exc.TimeoutException
|
|
|
|
disks_list_after_attach = ssh.list_disks()
|
|
volume_name = [item for item in disks_list_after_attach
|
|
if item not in disks_list_before_attach][0]
|
|
return volume_name
|
|
|
|
@decorators.attr(type='slow')
|
|
@decorators.idempotent_id('10fd234a-515c-41e5-b092-8323060598c5')
|
|
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
|
|
'Snapshotting is not available.')
|
|
@testtools.skipUnless(CONF.network.public_network_id,
|
|
'The public_network_id option must be specified.')
|
|
@utils.services('compute', 'network', 'volume', 'image')
|
|
def test_stamp_pattern(self):
|
|
# prepare for booting an instance
|
|
keypair = self.create_keypair()
|
|
security_group = self.create_security_group()
|
|
|
|
# boot an instance and create a timestamp file in it
|
|
volume = self.create_volume(wait_until=None)
|
|
server = self.create_server(
|
|
key_name=keypair['name'],
|
|
security_groups=[{'name': security_group['name']}])
|
|
|
|
# create and add floating IP to server1
|
|
ip_for_server = self.get_server_ip(server)
|
|
|
|
# Make sure the machine ssh-able before attaching the volume
|
|
linux_client = self.get_remote_client(
|
|
ip_for_server, private_key=keypair['private_key'],
|
|
server=server)
|
|
disks_list_before_attach = linux_client.list_disks()
|
|
waiters.wait_for_volume_resource_status(self.volumes_client,
|
|
volume['id'], 'available')
|
|
# The volume retrieved on creation has a non-up-to-date status.
|
|
# Retrieval after it becomes active ensures correct details.
|
|
volume = self.volumes_client.show_volume(volume['id'])['volume']
|
|
|
|
self.nova_volume_attach(server, volume)
|
|
volume_device_name = self._attached_volume_name(
|
|
disks_list_before_attach, ip_for_server, keypair['private_key'])
|
|
|
|
timestamp = self.create_timestamp(ip_for_server,
|
|
volume_device_name,
|
|
private_key=keypair['private_key'],
|
|
server=server)
|
|
self.nova_volume_detach(server, volume)
|
|
|
|
# snapshot the volume
|
|
volume_snapshot = self.create_volume_snapshot(volume['id'])
|
|
|
|
# snapshot the instance
|
|
snapshot_image = self.create_server_snapshot(server=server)
|
|
|
|
# create second volume from the snapshot(volume2)
|
|
volume_from_snapshot = self.create_volume(
|
|
snapshot_id=volume_snapshot['id'], wait_until=None)
|
|
|
|
# boot second instance from the snapshot(instance2)
|
|
server_from_snapshot = self.create_server(
|
|
image_id=snapshot_image['id'],
|
|
key_name=keypair['name'],
|
|
security_groups=[{'name': security_group['name']}])
|
|
|
|
# create and add floating IP to server_from_snapshot
|
|
ip_for_snapshot = self.get_server_ip(server_from_snapshot)
|
|
|
|
# Make sure the machine ssh-able before attaching the volume
|
|
# Just a live machine is responding
|
|
# for device attache/detach as expected
|
|
linux_client = self.get_remote_client(
|
|
ip_for_snapshot, private_key=keypair['private_key'],
|
|
server=server_from_snapshot)
|
|
disks_list_before_attach = linux_client.list_disks()
|
|
|
|
# attach volume2 to instance2
|
|
waiters.wait_for_volume_resource_status(self.volumes_client,
|
|
volume_from_snapshot['id'],
|
|
'available')
|
|
# The volume retrieved on creation has a non-up-to-date status.
|
|
# Retrieval after it becomes active ensures correct details.
|
|
volume_from_snapshot = self.volumes_client.show_volume(
|
|
volume_from_snapshot['id'])['volume']
|
|
|
|
self.nova_volume_attach(server_from_snapshot, volume_from_snapshot)
|
|
volume_device_name = self._attached_volume_name(
|
|
disks_list_before_attach, ip_for_snapshot, keypair['private_key'])
|
|
|
|
# check the existence of the timestamp file in the volume2
|
|
timestamp2 = self.get_timestamp(ip_for_snapshot,
|
|
volume_device_name,
|
|
private_key=keypair['private_key'],
|
|
server=server_from_snapshot)
|
|
self.assertEqual(timestamp, timestamp2)
|