Regression tests related to volume attach are added
Change-Id: I7baf2cdab84be9ee619919a3cb44322e1f24be26
This commit is contained in:
parent
78f53d8f32
commit
991df2cff0
@ -0,0 +1,179 @@
|
|||||||
|
"""
|
||||||
|
Copyright 2020 Rackspace
|
||||||
|
|
||||||
|
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.
|
||||||
|
"""
|
||||||
|
from qe_coverage.opencafe_decorators import tags, unless_coverage
|
||||||
|
|
||||||
|
from cafe.drivers.unittest.suite import OpenCafeUnittestTestSuite
|
||||||
|
from cloudroast.blockstorage.volumes_api.integration.compute.fixtures \
|
||||||
|
import ComputeIntegrationTestFixture
|
||||||
|
|
||||||
|
|
||||||
|
def load_tests(loader, standard_tests, pattern):
|
||||||
|
suite = OpenCafeUnittestTestSuite()
|
||||||
|
suite.addTest(VolumeAttachmentsAPIIntegration(
|
||||||
|
"test_attach_multi_volume_to_server"))
|
||||||
|
suite.addTest(VolumeAttachmentsAPIIntegration(
|
||||||
|
"test_attach_single_volume_to_multi_server"))
|
||||||
|
suite.addTest(VolumeAttachmentsAPIIntegration(
|
||||||
|
"test_delete_attached_volume"))
|
||||||
|
suite.addTest(VolumeAttachmentsAPIIntegration(
|
||||||
|
"test_attach_non_existing_volume"))
|
||||||
|
suite.addTest(VolumeAttachmentsAPIIntegration(
|
||||||
|
"test_volume_attachment_delete"))
|
||||||
|
return suite
|
||||||
|
|
||||||
|
|
||||||
|
class VolumeAttachmentsAPIIntegration(ComputeIntegrationTestFixture):
|
||||||
|
"""Tests related to volume attachment to a server"""
|
||||||
|
|
||||||
|
@unless_coverage
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(VolumeAttachmentsAPIIntegration, cls).setUpClass()
|
||||||
|
cls.test_server = cls.new_server()
|
||||||
|
cls.test_multi_server = cls.new_server()
|
||||||
|
cls.test_volume1 = cls.new_volume(add_cleanup=True)
|
||||||
|
cls.test_volume2 = cls.new_volume(add_cleanup=True)
|
||||||
|
cls.test_attachment1 = \
|
||||||
|
cls.volume_attachments.behaviors.attach_volume_to_server(
|
||||||
|
cls.test_server.id, cls.test_volume1.id_)
|
||||||
|
|
||||||
|
if cls.test_attachment1 is None:
|
||||||
|
cls.assertClassSetupFailure(
|
||||||
|
"Could not attach volume {0} to server {1}".format(
|
||||||
|
cls.test_volume1.id_, cls.test_server.id))
|
||||||
|
|
||||||
|
cls.test_attachment2 = \
|
||||||
|
cls.volume_attachments.behaviors.attach_volume_to_server(
|
||||||
|
cls.test_server.id, cls.test_volume2.id_)
|
||||||
|
|
||||||
|
if cls.test_attachment2 is None:
|
||||||
|
cls.assertClassSetupFailure(
|
||||||
|
"Could not attach volume {0} to server {1}".format(
|
||||||
|
cls.test_volume2.id_, cls.test_server.id))
|
||||||
|
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volume_attachments.client.delete_volume_attachment,
|
||||||
|
cls.test_attachment1.id_)
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volume_attachments.behaviors.
|
||||||
|
verify_volume_status_progression_during_detachment,
|
||||||
|
cls.test_volume1.id_, raise_on_error=False)
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volumes.client.delete_volume, cls.test_volume1.id_)
|
||||||
|
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volume_attachments.client.delete_volume_attachment,
|
||||||
|
cls.test_attachment2.id_)
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volume_attachments.behaviors.
|
||||||
|
verify_volume_status_progression_during_detachment,
|
||||||
|
cls.test_volume2.id_, raise_on_error=False)
|
||||||
|
cls.addClassCleanup(
|
||||||
|
cls.volumes.client.delete_volume, cls.test_volume2.id_)
|
||||||
|
|
||||||
|
@unless_coverage
|
||||||
|
def setUp(self):
|
||||||
|
super(VolumeAttachmentsAPIIntegration, self).setUp()
|
||||||
|
|
||||||
|
@tags('integration', 'regression', 'positive')
|
||||||
|
def test_attach_multi_volume_to_server(self):
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_attachment1.server_id, self.test_server.id,
|
||||||
|
"Attachment's Server id and actual Server id did not match")
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_attachment1.volume_id, self.test_volume1.id_,
|
||||||
|
"Attachment's Volume id and actual Volume id did not match")
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_attachment2.server_id, self.test_server.id,
|
||||||
|
"Attachment's Server id and actual Server id did not match")
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_attachment2.volume_id, self.test_volume2.id_,
|
||||||
|
"Attachment's Volume id and actual Volume id did not match")
|
||||||
|
|
||||||
|
resp = self.volume_attachments.client.get_server_volume_attachments(
|
||||||
|
self.test_server.id)
|
||||||
|
|
||||||
|
self.assertResponseDeserializedAndOk(resp)
|
||||||
|
attachments = resp.entity
|
||||||
|
|
||||||
|
self.assertIn(
|
||||||
|
self.test_attachment1, attachments,
|
||||||
|
"Unable to locate volume attachment {0} in list of server {1}'s"
|
||||||
|
" volume attachments".format(
|
||||||
|
self.test_attachment1.id_, self.test_server.id))
|
||||||
|
|
||||||
|
self.assertIn(
|
||||||
|
self.test_attachment2, attachments,
|
||||||
|
"Unable to locate volume attachment {0} in list of server {1}'s"
|
||||||
|
" volume attachments".format(
|
||||||
|
self.test_attachment2.id_, self.test_server.id))
|
||||||
|
|
||||||
|
resp = self.volume_attachments.client.get_volume_attachment_details(
|
||||||
|
self.test_attachment1.id_, self.test_server.id)
|
||||||
|
|
||||||
|
self.assertResponseDeserializedAndOk(resp)
|
||||||
|
attachment_details = resp.entity
|
||||||
|
self.assertDictEqual(
|
||||||
|
vars(self.test_attachment1), vars(attachment_details))
|
||||||
|
|
||||||
|
resp = self.volume_attachments.client.get_volume_attachment_details(
|
||||||
|
self.test_attachment2.id_, self.test_server.id)
|
||||||
|
|
||||||
|
self.assertResponseDeserializedAndOk(resp)
|
||||||
|
attachment_details = resp.entity
|
||||||
|
self.assertDictEqual(
|
||||||
|
vars(self.test_attachment2), vars(attachment_details))
|
||||||
|
|
||||||
|
@tags('integration', 'regression', 'negative')
|
||||||
|
def test_attach_single_volume_to_multi_server(self):
|
||||||
|
resp = self.volume_attachments.client.attach_volume(
|
||||||
|
self.test_multi_server.id, self.test_volume1.id_)
|
||||||
|
self.assertExactResponseStatus(resp, 400)
|
||||||
|
|
||||||
|
@tags('integration', 'regression', 'negative')
|
||||||
|
def test_delete_attached_volume(self):
|
||||||
|
resp = self.volumes.client.delete_volume(
|
||||||
|
self.test_volume1.id_)
|
||||||
|
self.assertExactResponseStatus(resp, 400)
|
||||||
|
|
||||||
|
@tags('integration', 'regression', 'negative')
|
||||||
|
def test_attach_non_existing_volume(self):
|
||||||
|
non_existing_volume_id = '12345678'
|
||||||
|
resp = self.volume_attachments.client.attach_volume(
|
||||||
|
self.test_server.id, non_existing_volume_id)
|
||||||
|
self.assertExactResponseStatus(resp, 400)
|
||||||
|
|
||||||
|
@tags('integration', 'regression', 'positive')
|
||||||
|
def test_volume_attachment_delete(self):
|
||||||
|
resp = self.volume_attachments.client.delete_volume_attachment(
|
||||||
|
self.test_attachment1.id_, self.test_server.id)
|
||||||
|
self.assertExactResponseStatus(resp, 202)
|
||||||
|
|
||||||
|
resp = self.volume_attachments.client.delete_volume_attachment(
|
||||||
|
self.test_attachment2.id_, self.test_server.id)
|
||||||
|
self.assertExactResponseStatus(resp, 202)
|
||||||
|
|
||||||
|
@unless_coverage
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
super(VolumeAttachmentsAPIIntegration, cls).tearDownClass()
|
||||||
|
|
||||||
|
@unless_coverage
|
||||||
|
def tearDown(self):
|
||||||
|
super(VolumeAttachmentsAPIIntegration, self).tearDown()
|
Loading…
x
Reference in New Issue
Block a user