From 919d298630ea5f9ae4ebb60aff4799efdad3ed8d Mon Sep 17 00:00:00 2001 From: "Boris Stoyanov - a.k.a Bobby" Date: Thu, 30 Nov 2017 10:37:51 +0200 Subject: [PATCH] CLOUDSTACK-9586: Adding local storage test (#2342) Added local storage test. Result: ==== Marvin Init Successful ====Host id fc9fa94f-7c78-41d0-b38c-6f5bfdf22571, hypervisor XenServer, localstorage False Host id b54ccd0f-cd3c-4367-b9b4-f7d370b71670, hypervisor XenServer, localstorage True Template id b8d66364-d5a0-11e7-8e52-06ca2801075c is Ready True Prepare Template result [{domain : u'ROOT', domainid : u'b8d2a14e-d5a0-11e7-8e52-06ca2801075c', ostypename : u'CentOS 5.6 (64-bit)', zoneid : u'daf11016-d38b-4dae-aad1-b46bfefbd5e6', displaytext : u'CentOS 5.6(64-bit) no GUI (XenServer)', ostypeid : u'b8f78667-d5a0-11e7-8e52-06ca2801075c', passwordenabled : False, id : u'b8d66364-d5a0-11e7-8e52-06ca2801075c', size : 21474836480, isready : True, format : u'VHD', templatetype : u'BUILTIN', bits : 0, zonename : u'trl-1082-x-cs411-bstoyanov', status : u'Download Complete', isdynamicallyscalable : True, tags : [], isfeatured : True, sshkeyenabled : False, isextractable : True, crossZones : True, account : u'system', name : u'CentOS 5.6(64-bit) no GUI (XenServer)', created : u'2017-11-30T07:57:42+0000', hypervisor : u'XenServer', ispublic : True, checksum : u'905cec879afd9c9d22ecc8036131a180', physicalsize : 1758786048}] === TestName: test_01_prepare_template_local_storage | Status : SUCCESS === --- .../integration/component/test_secsr_mount.py | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 test/integration/component/test_secsr_mount.py diff --git a/test/integration/component/test_secsr_mount.py b/test/integration/component/test_secsr_mount.py new file mode 100644 index 00000000000..d19c36bf631 --- /dev/null +++ b/test/integration/component/test_secsr_mount.py @@ -0,0 +1,191 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 __builtin__ import False +""" Tests for Secondary Storage with Local Storage +""" + +# Import Local Modules +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.lib.utils import * +from marvin.lib.base import * +from marvin.lib.common import * +from nose.plugins.attrib import attr + +_multiprocess_shared_ = False + + +class TestSecSRMount(cloudstackTestCase): + + def setUp(self): + self.logger = logging.getLogger('TestSecSRMount') + self.stream_handler = logging.StreamHandler() + self.logger.setLevel(logging.DEBUG) + self.logger.addHandler(self.stream_handler) + self.apiclient = self.testClient.getApiClient() + self.hypervisor = self.testClient.getHypervisorInfo() + self.dbclient = self.testClient.getDbConnection() + self.services = self.testClient.getParsedTestDataConfig() + self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.pod = get_pod(self.apiclient, self.zone.id) + self.cleanup = [] + self.services = { + "service_offering_local": { + "name": "Ultra Tiny Local Instance", + "displaytext": "Ultra Tiny Local Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 128, + "storagetype": "local" + }, + "vm": { + "username": "root", + "password": "password", + "ssh_port": 22, + # Hypervisor type should be same as + # hypervisor type of cluster + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "ostype": 'CentOS 5.3 (64-bit)', + "sleep": 30, + "timeout": 10, + } + + def tearDown(self): + try: + # Clean up, terminate the created templates + cleanup_resources(self.apiclient, self.cleanup) + + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + + return + + def isOnlyLocalStorageAvailable(self): + if not self.zone.localstorageenabled: + self.skipTest("Local Storage not enabled") + + storage_pools = StoragePool.list( + self.apiclient, + zoneid=self.zone.id, + listall=True + ) + self.assertEqual( + isinstance(storage_pools, list), + True, + "Check if listStoragePools returns a valid response" + ) + for storage_pool in storage_pools: + if storage_pool.type == u'NetworkFilesystem': + return False + + return True + + def download(self, apiclient, template_id, retries=12, interval=5): + """Check if template download will finish in 1 minute""" + while retries > -1: + time.sleep(interval) + template_response = Template.list( + apiclient, + id=template_id, + zoneid=self.zone.id, + templatefilter='self' + ) + + if isinstance(template_response, list): + template = template_response[0] + if not hasattr(template, 'status') or not template or not template.status: + retries = retries - 1 + continue + + # If template is ready, + # template.status = Download Complete + # Downloading - x% Downloaded + # if Failed + # Error - Any other string + if 'Failed' in template.status: + raise Exception( + "Failed to download template: status - %s" % + template.status) + + elif template.status == 'Download Complete' and template.isready: + return + + elif 'Downloaded' in template.status: + retries = retries - 1 + continue + + elif 'Installing' not in template.status: + if retries >= 0: + retries = retries - 1 + continue + raise Exception( + "Error in downloading template: status - %s" % + template.status) + + else: + retries = retries - 1 + raise Exception("Template download failed exception.") + + @attr( + tags=[ + "advanced", + "xenserver"], + required_hardware="true") + def test_01_prepare_template_local_storage(self): + + if not self.isOnlyLocalStorageAvailable(): + self.skipTest("Skipping this test as this is for Local storage on only.") + + listHost = Host.list( + self.apiclient, + type='Routing', + zoneid=self.zone.id, + podid=self.pod.id, + ) + for host in listHost: + self.logger.debug('Host id %s, hypervisor %s, localstorage %s' % (host.id, host.hypervisor, host.islocalstorageactive)) + + if len(listHost) < 2: + self.logger.debug("Prepare secondary storage race condition can be tested with two or more host only %s, found" % len(listHost)); + self.skipTest("Prepare secondary storage can be tested with two host only %s, found" % len(listHost)) + + list_template_response = Template.list( + self.apiclient, + templatefilter='all', + zoneid=self.zone.id) + + template_response = list_template_response[0] + + self.logger.debug('Template id %s is Ready %s' % (template_response.id, template_response.isready)) + + if template_response.isready != True: + self.skipTest('Template id %s is Not Ready' % (template_response.id)) + + try: + cmd = prepareTemplate.prepareTemplateCmd() + cmd.zoneid = self.zone.id + cmd.templateid = template_response.id + result = self.apiclient.prepareTemplate(cmd) + self.logger.debug('Prepare Template result %s' % result) + except Exception as e: + raise Exception("Warning: Exception during prepare template : %s" % e) + + self.download(self.apiclient, template_response.id) + return