513 lines
21 KiB
Python
513 lines
21 KiB
Python
# Copyright (c) 2016 Mirantis, Inc.
|
|
#
|
|
# 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 os
|
|
import testtools
|
|
|
|
from tempest import config
|
|
from tempest.lib import decorators
|
|
|
|
from murano_tempest_tests.tests.scenario.application_catalog import base
|
|
from murano_tempest_tests import utils
|
|
|
|
CONF = config.CONF
|
|
|
|
|
|
class TestCinderVolumes(base.BaseApplicationCatalogScenarioTest):
|
|
|
|
@classmethod
|
|
def skip_checks(cls):
|
|
super(TestCinderVolumes, cls).skip_checks()
|
|
if not CONF.service_available.cinder:
|
|
msg = "Cinder is not available. Skipping volumes tests"
|
|
raise cls.skipException(msg)
|
|
if (not CONF.volume_feature_enabled.api_v3 and
|
|
not CONF.volume_feature_enabled.api_v2):
|
|
msg = ("Neither cinder v2 nor v3 are available. Skipping"
|
|
"volumes tests")
|
|
raise cls.skipException(msg)
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
super(TestCinderVolumes, cls).setup_clients()
|
|
# Prefer volume v3 which is the current version
|
|
if CONF.volume_feature_enabled.api_v3:
|
|
_volume = cls.services_manager.volume_v3
|
|
elif CONF.volume_feature_enabled.api_v2:
|
|
_volume = cls.services_manager.volume_v2
|
|
cls.volumes_client = _volume.VolumesClient()
|
|
cls.backups_client = _volume.BackupsClient()
|
|
cls.snapshots_client = _volume.SnapshotsClient()
|
|
|
|
@classmethod
|
|
def resource_setup(cls):
|
|
if not CONF.application_catalog.cinder_volume_tests:
|
|
msg = "Cinder volumes tests will be skipped."
|
|
raise cls.skipException(msg)
|
|
super(TestCinderVolumes, cls).resource_setup()
|
|
cls.linux = CONF.application_catalog.linux_image
|
|
application_name = utils.generate_name('VM')
|
|
cls.abs_archive_path, dir_with_archive, archive_name = \
|
|
utils.prepare_package(
|
|
application_name,
|
|
app='io.murano.apps.test.VM',
|
|
manifest_required=False)
|
|
if CONF.application_catalog.glare_backend:
|
|
cls.client = cls.artifacts_client
|
|
else:
|
|
cls.client = cls.application_catalog_client
|
|
cls.package = cls.client.upload_package(
|
|
application_name, archive_name, dir_with_archive,
|
|
{"categories": ["Web"], "tags": ["test"]})
|
|
cls.volume = cls.create_volume(size='1')
|
|
|
|
@classmethod
|
|
def resource_cleanup(cls):
|
|
cls.delete_volume(cls.volume['id'])
|
|
cls.client.delete_package(cls.package['id'])
|
|
os.remove(cls.abs_archive_path)
|
|
super(TestCinderVolumes, cls).resource_cleanup()
|
|
|
|
@decorators.idempotent_id('241ace7d-3b6e-413e-8936-a851ff1163f8')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_boot_volume_as_image(self):
|
|
"""Test app deployment using boot volume as image
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to boot instance
|
|
from Cinder volume
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that instance is not booted from image, volume is attached
|
|
to the instance, has size 4GiB and created from image
|
|
7. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
post_body = {
|
|
"instance": {
|
|
"flavor": "m1.tiny",
|
|
"blockDevices": {
|
|
"volume": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 4,
|
|
"sourceImage": self.cirros_image
|
|
},
|
|
"bootIndex": 0,
|
|
"deviceName": "vda",
|
|
"deviceType": "disk"
|
|
},
|
|
"assignFloatingIp": True,
|
|
"availabilityZone": "nova",
|
|
"?": {
|
|
"type": "io.murano.resources.LinuxMuranoInstance",
|
|
"id": utils.generate_uuid()
|
|
},
|
|
"name": utils.generate_name("testMurano")
|
|
},
|
|
"name": utils.generate_name("VM"),
|
|
"?": {
|
|
"_{id}".format(id=utils.generate_uuid()): {
|
|
"name": "VM"
|
|
},
|
|
"type": "io.murano.apps.test.VM",
|
|
"id": utils.generate_uuid()
|
|
}
|
|
}
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 4)
|
|
self.assertEqual(volume_data['volume_image_metadata']['image_name'],
|
|
self.cirros_image)
|
|
server = self.get_instance_id('testMurano')
|
|
self.assertFalse(
|
|
self.servers_client.show_server(server)['server']['image'])
|
|
|
|
@decorators.idempotent_id('e10d3bad-7145-46df-8118-4040842883f6')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_existing_volume(self):
|
|
"""Test app deployment with existing volume
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to attach existing
|
|
Cinder volume to the instance
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that volume is attached to the instance
|
|
7. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.ExistingCinderVolume"
|
|
},
|
|
"openstackId": self.volume['id']
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(attributes=volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
self.check_volume_attached('testMurano', self.volume['id'])
|
|
|
|
@decorators.idempotent_id('6338a496-7415-42a9-a514-61f6f5cb1e65')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_volume_creation(self):
|
|
"""Test app deployment with volume creation
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to create and
|
|
attach Cinder volume with size 1 GiB to the instance
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that volume is attached to the instance and has size 1GiB
|
|
7. Check that we can access some attachment info about the volume
|
|
8. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 1
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(attributes=volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.check_volume_attachments(environment['id'])
|
|
self.assertEqual(volume_data['size'], 1)
|
|
|
|
@decorators.idempotent_id('1eb9bbe4-9810-408e-86a0-78ff114aadae')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_volume_creation_from_image(self):
|
|
"""Test app deployment with volume creation from image
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to create Cinder
|
|
volume with size 2 GiB from image and attach it to the instance
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that volume is attached to the instance, has size 2GiB and
|
|
created from image
|
|
7. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 4,
|
|
"sourceImage": self.cirros_image
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 4)
|
|
self.assertEqual(volume_data['volume_image_metadata']['image_name'],
|
|
self.cirros_image)
|
|
|
|
@decorators.idempotent_id('bd624a9b-10ae-4079-b515-7b6031d9e725')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_volume_creation_from_volume(self):
|
|
"""Test app deployment with volume creation from volume
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to create Cinder
|
|
volume with size 1 GiB from existing volume and attach it to the
|
|
instance
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that volume is attached to the instance, has size 1GiB and
|
|
created from existing volume
|
|
7. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 1,
|
|
"sourceVolume": {
|
|
"?": {
|
|
"type": "io.murano.resources.ExistingCinderVolume"
|
|
},
|
|
"openstackId": self.volume['id']
|
|
}
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 1)
|
|
self.assertEqual(volume_data['source_volid'], self.volume['id'])
|
|
|
|
@decorators.idempotent_id('7a671222-160d-4594-97bf-ea47f60ad965')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_volume_creation_from_snapshot(self):
|
|
"""Test app deployment with volume creation from volume snapshot
|
|
|
|
Scenario:
|
|
1. Make snapshot from volume
|
|
2. Create environment
|
|
3. Add VM application with ability to create
|
|
Cinder volume with size 1 GiB from existing volume snapshot and
|
|
attach it to the instance
|
|
4. Deploy environment
|
|
5. Make sure that deployment finished successfully
|
|
6. Check that application is accessible
|
|
7. Check that volume is attached to the instance, has size 1GiB and
|
|
created from existing volume snapshot
|
|
8. Delete environment, snapshot
|
|
"""
|
|
snapshot = self.create_snapshot(self.volume['id'])
|
|
self.addCleanup(self.delete_snapshot, snapshot['id'])
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 1,
|
|
"sourceSnapshot": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolumeSnapshot"
|
|
},
|
|
"openstackId": snapshot['id']
|
|
}
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 1)
|
|
self.assertEqual(volume_data['snapshot_id'], snapshot['id'])
|
|
|
|
|
|
class TestCinderVolumeIsolatedAdmin(
|
|
base.BaseApplicationCatalogScenarioIsolatedAdminTest):
|
|
|
|
@classmethod
|
|
def resource_setup(cls):
|
|
if not CONF.application_catalog.cinder_volume_tests:
|
|
msg = "Cinder volumes attachment tests will be skipped."
|
|
raise cls.skipException(msg)
|
|
super(TestCinderVolumeIsolatedAdmin, cls).resource_setup()
|
|
application_name = utils.generate_name('VM')
|
|
cls.abs_archive_path, dir_with_archive, archive_name = \
|
|
utils.prepare_package(
|
|
application_name,
|
|
app='io.murano.apps.test.VM',
|
|
manifest_required=False)
|
|
if CONF.application_catalog.glare_backend:
|
|
cls.client = cls.artifacts_client
|
|
else:
|
|
cls.client = cls.application_catalog_client
|
|
cls.package = cls.client.upload_package(
|
|
application_name, archive_name, dir_with_archive,
|
|
{"categories": ["Web"], "tags": ["test"]})
|
|
cls.volume = cls.create_volume(size='1')
|
|
|
|
@classmethod
|
|
def resource_cleanup(cls):
|
|
cls.delete_volume(cls.volume['id'])
|
|
cls.client.delete_package(cls.package['id'])
|
|
os.remove(cls.abs_archive_path)
|
|
super(TestCinderVolumeIsolatedAdmin, cls).resource_cleanup()
|
|
|
|
@decorators.idempotent_id('4111eb94-2636-4d0b-af5c-776ed5a59b87')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
@testtools.skip("This test is failed due to can not attach"
|
|
"a readonly volume, when it fixed, unskip it.")
|
|
def test_deploy_app_with_volume_creation_readonly(self):
|
|
"""Test app deploy with volume creation with readonly
|
|
|
|
Scenario:
|
|
1. Create environment
|
|
2. Add VM application with ability to create and
|
|
attach Cinder volume with size 1 GiB and readonly
|
|
properties to the instance
|
|
3. Deploy environment
|
|
4. Make sure that deployment finished successfully
|
|
5. Check that application is accessible
|
|
6. Check that volume is attached to the instance, has size 1GiB,
|
|
and readonly attributes
|
|
7. Delete environment
|
|
"""
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client.\
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client.\
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 1,
|
|
"readOnly": True
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(attributes=volume_attributes)
|
|
self.application_catalog_client.\
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 1)
|
|
self.assertEqual(volume_data['metadata']['readonly'], 'True')
|
|
|
|
@decorators.idempotent_id('5c134343-11bc-4329-ac30-9b43f32c15e2')
|
|
@testtools.testcase.attr('smoke')
|
|
@testtools.testcase.attr('scenario')
|
|
def test_deploy_app_with_volume_creation_from_backup(self):
|
|
"""Test app deployment with volume creation from volume backup
|
|
|
|
Scenario:
|
|
1. Make backup from volume
|
|
2. Create environment
|
|
3. Add VM application with ability to create Cinder
|
|
volume with size 1 GiB from existing volume backup and attach it to
|
|
the instance
|
|
4. Deploy environment
|
|
5. Make sure that deployment finished successfully
|
|
6. Check that application is accessible
|
|
7. Check that volume is attached to the instance, has size 1GiB and
|
|
restored from existing volume backup
|
|
8. Delete environment, backup
|
|
"""
|
|
if not (CONF.volume_feature_enabled.backup and
|
|
CONF.service_available.swift):
|
|
msg = ("Cinder backup driver and Swift are required. "
|
|
"Deploy app with volume restoring from backup test "
|
|
"will be skipped.")
|
|
raise self.skipException(msg)
|
|
|
|
backup = self.create_backup(self.volume['id'])
|
|
self.addCleanup(self.delete_backup, backup['id'])
|
|
name = utils.generate_name('testMurano')
|
|
environment = self.application_catalog_client. \
|
|
create_environment(name)
|
|
self.addCleanup(self.environment_delete, environment['id'])
|
|
session = self.application_catalog_client. \
|
|
create_session(environment['id'])
|
|
volume_attributes = {
|
|
"/dev/vdb": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolume"
|
|
},
|
|
"size": 1,
|
|
"name": "restore_backup_" + backup['id'],
|
|
"sourceVolumeBackup": {
|
|
"?": {
|
|
"type": "io.murano.resources.CinderVolumeBackup"
|
|
},
|
|
"openstackId": backup['id']
|
|
}
|
|
}
|
|
}
|
|
post_body = self.vm_cinder(volume_attributes)
|
|
self.application_catalog_client. \
|
|
create_service(environment['id'], session['id'],
|
|
post_body)
|
|
self.deploy_environment(environment, session)
|
|
|
|
volume_data = self.get_volume(environment['id'])
|
|
self.check_volume_attached('testMurano', volume_data['id'])
|
|
self.assertEqual(volume_data['size'], 1)
|
|
self.assertIn(backup['id'], volume_data['name'])
|