You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ko...@apache.org on 2015/05/15 06:08:59 UTC

git commit: updated refs/heads/CLOUDSTACK-8301 to e5cee45

Repository: cloudstack
Updated Branches:
  refs/heads/CLOUDSTACK-8301 ff0160c71 -> e5cee452b


CLOUDSTACK-8471:Automation for feature Enable configuring local storage use for system VMs at zone level

Signed-off-by: Koushik Das <ko...@apache.org>

This closes #253


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e5cee452
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e5cee452
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e5cee452

Branch: refs/heads/CLOUDSTACK-8301
Commit: e5cee452b917781e3b911d5fc0df9a9fd2a9bcbe
Parents: ff0160c
Author: nitt10prashant <ni...@gmail.com>
Authored: Thu May 14 17:02:23 2015 +0530
Committer: Koushik Das <ko...@apache.org>
Committed: Fri May 15 09:38:01 2015 +0530

----------------------------------------------------------------------
 .../test_zone_level_local_storage_setting.py    | 734 +++++++++++++++++++
 1 file changed, 734 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e5cee452/test/integration/component/maint/test_zone_level_local_storage_setting.py
----------------------------------------------------------------------
diff --git a/test/integration/component/maint/test_zone_level_local_storage_setting.py b/test/integration/component/maint/test_zone_level_local_storage_setting.py
new file mode 100644
index 0000000..466f1f9
--- /dev/null
+++ b/test/integration/component/maint/test_zone_level_local_storage_setting.py
@@ -0,0 +1,734 @@
+# 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.
+"""
+Test cases for zone level settings "system.vm.use.local.storage"
+"""
+# Import Local Modules
+from marvin.cloudstackTestCase import *
+from marvin.lib.utils import *
+from marvin.lib.base import *
+from marvin.lib.common import *
+from marvin.codes import FAILED, PASS
+from requests.exceptions import ConnectionError
+
+import time
+from nose.plugins.attrib import attr
+from ddt import ddt, data
+
+
+def destroy_systemvm(self, type):
+    """
+    Destroy system vms
+    #1-List  system vms for current zone
+    #2-Destroy system vm
+    #3-Check if system vm came up after destroy
+    #4-check  system vm storage type in disk offering
+    """
+    list_response = list_ssvms(
+        self.apiclient,
+        systemvmtype=type,
+        zoneid=self.zone.id
+    )
+
+    self.assertEqual(
+        validateList(list_response)[0],
+        PASS,
+        "Check List ssvm response for  %s" %
+        type)
+
+    response = list_response[0]
+    self.debug("Destroying CPVM: %s" % response.id)
+    cmd = destroySystemVm.destroySystemVmCmd()
+    cmd.id = response.id
+    self.apiclient.destroySystemVm(cmd)
+
+    timeout = self.testdata["timeout"]
+    while True:
+        time.sleep(self.testdata["sleep"])
+        list_response = list_ssvms(
+            self.apiclient,
+            systemvmtype=type,
+            zoneid=self.zone.id
+        )
+        if validateList(list_response)[0] == PASS:
+            if list_response[0].state == 'Running':
+                break
+        if timeout == 0:
+            raise Exception("List %s call failed!" % type)
+        timeout = timeout - 1
+
+
+def storage_check(self, type, value):
+    """test if system vms are using local or shared storage
+    #1-Get zone id from db using self.zone.id
+    #2-Get service offering id from vm_instance table for running system vms
+    #3-Get use_local_storage value from disk_offering table
+    #4-Verify storage type"""
+    query_zone_id = self.dbclient.execute(
+        "select id from data_center where uuid= '%s';" % self.zone.id
+    )
+    query_so_id = self.dbclient.execute(
+        "select service_offering_id from vm_instance where type='%s'and "
+        "state='Running' and data_center_id= '%s';" %
+        (type, query_zone_id[0][0]))
+
+    query_disk_offering = self.dbclient.execute(
+        "select use_local_storage from disk_offering  where id= '%s';" %
+        query_so_id[0][0])
+
+    if value == 1:
+        self.assertEqual(query_disk_offering[0][0],
+                         1,
+                         "system vm is not using local storage"
+                         )
+    elif value == 0:
+        self.assertEqual(query_disk_offering[0][0],
+                         0,
+                         "system vm is not using shared storage"
+                         )
+    else:
+        # evil ValueError that doesn't tell you what the wrong value was
+        raise ValueError
+
+
+def create_system_so(self, offering_type, storage_type):
+    """Create system offerings """
+    self.testdata["service_offerings"]["issystem"] = "true"
+    self.testdata["service_offerings"]["systemvmtype"] = offering_type
+    self.testdata["service_offerings"]["storagetype"] = storage_type
+
+    service_offering = ServiceOffering.create(
+        self.apiclient,
+        self.testdata["service_offerings"]
+    )
+
+    if service_offering is None:
+        raise Exception("service offering not created")
+
+    list_service_response = list_service_offering(
+        self.apiclient,
+        id=service_offering.id,
+        issystem='true'
+    )
+    self.assertEqual(
+        validateList(list_service_response)[0],
+        PASS,
+        "Check List srvice offering response for  %s" %
+        type)
+
+    self.debug(
+        "Created service offering with ID: %s" %
+        service_offering.id)
+
+    self.assertEqual(
+        list_service_response[0].cpunumber,
+        self.testdata["service_offerings"]["cpunumber"],
+        "Check server id in createServiceOffering"
+    )
+    self.assertEqual(
+        list_service_response[0].cpuspeed,
+        self.testdata["service_offerings"]["cpuspeed"],
+        "Check cpuspeed in createServiceOffering"
+    )
+    self.assertEqual(
+        list_service_response[0].displaytext,
+        self.testdata["service_offerings"]["displaytext"],
+        "Check server displaytext in createServiceOfferings"
+    )
+    self.assertEqual(
+        list_service_response[0].memory,
+        self.testdata["service_offerings"]["memory"],
+        "Check memory in createServiceOffering"
+    )
+    self.assertEqual(
+        list_service_response[0].name,
+        self.testdata["service_offerings"]["name"],
+        "Check name in createServiceOffering"
+    )
+    self.assertEqual(
+        list_service_response[0].storagetype,
+        self.testdata["service_offerings"]["storagetype"],
+        "Check storagetype in createServiceOffering"
+    )
+    self._cleanup.append(service_offering)
+    return service_offering.id
+
+
+def restart_ms(self):
+    """Restart MS
+    #1-ssh into m/c running MS
+    #2-restart ms
+    #3-verify the response
+    #4-loop unitl you get list_zone api answer """
+    sshClient = SshClient(
+        self.mgtSvrDetails["mgtSvrIp"],
+        22,
+        self.mgtSvrDetails["user"],
+        self.mgtSvrDetails["passwd"]
+    )
+    command = "service cloudstack-management restart"
+    ms_restart_response = sshClient.execute(command)
+    self.assertEqual(
+        validateList(ms_restart_response)[0],
+        PASS,
+        "Check the MS restart response")
+    self.assertEqual(
+        ms_restart_response[0],
+        'Stopping cloudstack-management:[  OK  ]',
+        "MS i not stopped"
+    )
+    self.assertEqual(
+        ms_restart_response[1],
+        'Starting cloudstack-management: [  OK  ]',
+        "MS not started"
+    )
+    timeout = self.testdata["timeout"]
+    while True:
+        time.sleep(self.testdata["sleep"])
+        try:
+            list_response = Zone.list(
+                self.apiclient
+            )
+            if validateList(list_response)[0] == PASS:
+                break
+        except ConnectionError as e:
+            self.debug("list zone response is not available due to  %s" % e)
+
+        if timeout == 0:
+            raise Exception("Ms is not comming up !")
+        timeout = timeout - 1
+
+
+def update_global_settings(self, value, name, zoneid=None):
+    """Update Gloabal/zonelevel settings and verify
+    #1-Update configuration
+    #2-Restart ms if zone id is None"""
+    Configurations.update(self.apiclient,
+                          name=name,
+                          zoneid=zoneid,
+                          value=value
+                          )
+    if zoneid is None:
+        restart_ms(self)
+
+    list_conf = Configurations.list(self.apiclient,
+                                    name=name,
+                                    zoneid=zoneid)
+
+    self.assertEqual(
+        validateList(list_conf)[0],
+        PASS,
+        "Check List configuration  response for  %s" % name)
+
+    self.assertEqual(
+        str(list_conf[0].value),
+        str(value),
+        "Check if configuration values are equal"
+    )
+
+
+def str_to_bool(s):
+    """Converts str "True/False to Boolean TRUE/FALSE"""
+    if s == 'true':
+        return True
+    elif s == 'false':
+        return False
+    else:
+        # evil ValueError that doesn't tell you what the wrong value was
+        raise ValueError
+
+
+@ddt
+class TestSystemVmLocalStorage(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        testClient = super(TestSystemVmLocalStorage, cls).getClsTestClient()
+        cls.apiclient = testClient.getApiClient()
+        cls.dbclient = cls.testClient.getDbConnection()
+        cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__
+        cls.testdata = testClient.getParsedTestDataConfig()
+        # Get Zone, and template Domain
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient)
+        cls.testdata["mode"] = cls.zone.networktype
+        cls.hypervisor = testClient.getHypervisorInfo()
+        cls._cleanup = []
+
+        list_local_storage_pool = StoragePool.list(
+            cls.apiclient,
+            scope='HOST',
+            zoneid=cls.zone.id,
+
+        )
+
+        if list_local_storage_pool is None:
+
+            Configurations.update(
+                cls.apiclient,
+                value='true',
+                name='system.vm.use.local.storage',
+                zoneid=cls.zone.id
+            )
+
+            # Restart MS
+            sshClient = SshClient(
+                cls.mgtSvrDetails["mgtSvrIp"],
+                22,
+                cls.mgtSvrDetails["user"],
+                cls.mgtSvrDetails["passwd"]
+            )
+            command = "service cloudstack-management restart"
+            ms_restart_response = sshClient.execute(command)
+
+            if validateList(ms_restart_response)[0] != PASS:
+                raise Exception("Check the MS restart response")
+            if ms_restart_response[
+                    0] != 'Stopping cloudstack-management:[  OK  ]':
+                raise Exception("MS i not stopped")
+
+            if ms_restart_response[
+                    1] != 'Starting cloudstack-management: [  OK  ]':
+                raise Exception("MS not started")
+
+            timeout = cls.testdata["timeout"]
+            while True:
+                # time.sleep(cls.testdata["sleep"])
+                try:
+                    list_response = Zone.list(
+                        cls.apiclient
+                    )
+                    if validateList(list_response)[0] == PASS:
+                        break
+                except ConnectionError as e:
+                    cls.debug(
+                        "list zone response is not available due to  %s" %
+                        e)
+
+                if timeout == 0:
+                    raise Exception("Ms is not comming up !")
+
+                time.sleep(cls.testdata["sleep"])
+                timeout = timeout - 1
+
+            list_local_storage_pool = StoragePool.list(
+                cls.apiclient,
+                scope='HOST',
+                zoneid=cls.zone.id,
+
+            )
+            if list_local_storage_pool is None:
+                raise Exception("Could not discover local storage pool")
+
+        try:
+            cls.account = Account.create(cls.apiclient,
+                                         cls.testdata["account"],
+                                         domainid=cls.domain.id
+                                         )
+            cls._cleanup.append(cls.account)
+
+        except Exception as e:
+            cls.tearDownClass()
+            raise e
+
+        return
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.apiclient, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning:Exception during cleanup: %s" % e)
+
+    @attr(tags=["advanced", "basic"])
+    @data(
+        'consoleproxy',
+        'secondarystoragevm',
+        'domainrouter',
+        'internalloadbalancervm')
+    def test_01_list_system_offerngs(self, value):
+        """List service offerings for systemvms and verify there should be two
+        (local and shared) SO  for each system vm"""
+
+        list_custom_so = ServiceOffering.list(self.apiclient,
+                                              issystem='true',
+                                              listall='true',
+                                              systemvmtype=value
+                                              )
+
+        self.assertEqual(
+            validateList(list_custom_so)[0],
+            PASS,
+            "Check List service offerings response for  %s" %
+            value)
+
+        local_custom_so = []
+        for item in list_custom_so:
+            if(str(item.defaultuse) == 'True'):
+                local_custom_so.append(item.storagetype)
+
+        self.assertEqual(
+            len(local_custom_so),
+            2,
+            "Check default system offering for system vm type %s" % value)
+        if 'local' in local_custom_so and 'shared' in local_custom_so:
+            self.debug(
+                "there are exactly to Service offerings{share,local} are "
+                "there for system vm %s" %
+                value)
+        else:
+            raise Exception(
+                "check local and shared service offerings for %s" %
+                value)
+
+    @attr(tags=["advanced", "basic"])
+    @data('consoleproxy', 'secondarystoragevm')
+    def test_02_system_vm_storage(self, value):
+        """ Check if system vms are honouring zone level setting
+        system.vm.use.local.storage
+        1-List zone level config
+        2-update the zone level config with service offering uuid
+        3-destroy system vms
+        4-check used storage by system vms
+        """
+        # 1 List zone level config
+        if value == "consoleproxy":
+            update_global_settings(
+                self,
+                value=None,
+                name="consoleproxy.service.offering")
+
+        if value == "secondarystoragevm":
+            update_global_settings(
+                self,
+                value=None,
+                name="secstorage.service.offering")
+
+        list_conf = Configurations.list(self.apiclient,
+                                        name="system.vm.use.local.storage",
+                                        zoneid=self.zone.id)
+        self.assertEqual(
+            validateList(list_conf)[0],
+            PASS,
+            "Check List configuration response for "
+            "system.vm.use.local.storage")
+
+        val = str_to_bool(list_conf[0].value)
+        # 2 update the zone level config with service offering uuid
+        update_global_settings(self,
+                               value=((str(not(val)).lower())),
+                               name='system.vm.use.local.storage',
+                               zoneid=self.zone.id)
+
+        # 3,4 for cpvm
+        destroy_systemvm(self, value)
+        storage_check(self, value, int(not(val)))
+
+        # 2 update the zone level config with service offering uuid
+        update_global_settings(
+            self,
+            value=(
+                str(val).lower()),
+            name='system.vm.use.local.storage',
+            zoneid=self.zone.id)
+        # 3,4 for cpvm
+        destroy_systemvm(self, value)
+        storage_check(self, value, int(val))
+
+        # 1 List zone level config
+        if value == "consoleproxy":
+            update_global_settings(
+                self,
+                value=None,
+                name="consoleproxy.service.offering")
+
+        if value == "secondarystoragevm":
+            update_global_settings(
+                self,
+                value=None,
+                name="secstorage.service.offering")
+
+    @attr(tags=["advanced", "basic"])
+    @data('consoleproxy', 'secondarystoragevm')
+    def test_03_custom_so(self, value):
+        """
+        update global setting with system offering and check if it is being
+        honoured
+        1-update zone level settings "system.vm.use.local.storage={true,false}}
+        to use local storage
+        2-create system offerings{shared,local}
+        3-update global settings with system offering uuid and restart ms
+        4-destroy system vms
+        5-Check if new system vms are using offering  updated in global
+        settings
+        """
+
+        # 1-update zone level settings "system.vm.use.local.storage"
+        # to use local storage
+        update_global_settings(
+            self,
+            value='true',
+            name='system.vm.use.local.storage',
+            zoneid=self.zone.id)
+        # 2-create system offerings
+
+        created_so_id = create_system_so(self, value, "shared")
+
+        if value == "consoleproxy":
+            name = "consoleproxy.service.offering"
+        elif value == 'secondarystoragevm':
+            name = 'secstorage.service.offering'
+        else:
+            raise Exception(
+                "type paramter is not correct it should be  system vm "
+                "type{console proxy,secsroragevm}")
+
+        # 3-update global settings with system offering uuid
+        update_global_settings(self, value=created_so_id, name=name)
+
+        # 4-destroy system vms
+        destroy_systemvm(self, value)
+
+        # 5-Check if new system vms are using offering  updated in global
+        # settings
+
+        query_zone_id = self.dbclient.execute(
+            "select id from data_center where uuid= '%s';" % self.zone.id
+        )
+        query_so_id = self.dbclient.execute(
+            "select service_offering_id from vm_instance where type='%s'and "
+            "state='Running' and data_center_id= '%s';" %
+            (value, query_zone_id[0][0]))
+        query_disk_offering = self.dbclient.execute(
+            "select uuid from disk_offering  where id= '%s';" %
+            query_so_id[0][0])
+
+        self.assertEqual(
+            created_so_id,
+            query_disk_offering[0][0],
+            "system vms are not using service offering mentioned in "
+            "global settings")
+
+        # 6-repeate 1 with system.vm.use.local.storage=false
+        update_global_settings(
+            self,
+            value='false',
+            name='system.vm.use.local.storage',
+            zoneid=self.zone.id)
+        # 7-repeate 2 with storage type local
+        created_so_id = create_system_so(self, value, "local")
+        # 8-repeate 3
+        update_global_settings(self, value=created_so_id, name=name)
+
+        # 9-repeate 4
+        destroy_systemvm(self, value)
+        # repeate 5
+        query_zone_id = self.dbclient.execute(
+            "select id from data_center where uuid= '%s';" % self.zone.id
+        )
+        query_so_id = self.dbclient.execute(
+            "select service_offering_id from vm_instance where type='%s'and "
+            "state='Running' and data_center_id= '%s';" %
+            (value, query_zone_id[0][0]))
+        query_disk_offering = self.dbclient.execute(
+            "select uuid from disk_offering  where id= '%s';" %
+            query_so_id[0][0])
+
+        self.assertEqual(
+            created_so_id,
+            query_disk_offering[0][0],
+            "system vms are not using service offering mentioned in"
+            " global settings")
+
+    @attr(tags=["advanced"])
+    def test_04_router_vms(self):
+        """ Check if router  vm is honouring zone level setting
+        system.vm.use.local.storage"""
+
+        # 1-list configurations
+        list_conf = Configurations.list(self.apiclient,
+                                        name="system.vm.use.local.storage",
+                                        zoneid=self.zone.id)
+        self.assertEqual(
+            validateList(list_conf)[0],
+            PASS,
+            "Check List configuration response for "
+            "system.vm.use.local.storage")
+
+        # 2-create network offering
+        self.network_offering = NetworkOffering.create(
+            self.apiclient,
+            self.testdata["network_offering"],
+            ispersistent='true'
+        )
+
+        # 3-list netwrok offerings
+        list_nw_of = NetworkOffering.list(self.apiclient,
+                                          id=self.network_offering.id)
+        self.assertEqual(
+            validateList(list_nw_of)[0],
+            PASS,
+            "Check the list network response"
+        )
+        self.assertEqual(
+            str(list_nw_of[0].id),
+            str(self.network_offering.id),
+            "Check the created network offering id and "
+            "listed network offering id"
+        )
+        self._cleanup.append(self.network_offering)
+
+        # 4-Enable network offering
+        self.network_offering.update(self.apiclient, state='Enabled')
+
+        # 5-List network offering
+        list_nw_of1 = NetworkOffering.list(self.apiclient,
+                                           id=self.network_offering.id)
+        self.assertEqual(
+            validateList(list_nw_of1)[0],
+            PASS,
+            "Check the list network response"
+        )
+        self.assertEqual(
+            str(list_nw_of1[0].state),
+            "Enabled",
+            "Check the created network state"
+        )
+
+        # 6-crete network using network offering
+        self.network = Network.create(
+            self.apiclient,
+            self.testdata["network"],
+            networkofferingid=self.network_offering.id,
+            zoneid=self.zone.id,
+            accountid=self.account.name,
+            domainid=self.account.domainid
+        )
+        # 7-List network
+        list_network = Network.list(self.apiclient,
+                                    accountid=self.account.name,
+                                    domainid=self.account.domainid,
+                                    id=self.network.id)
+        self.assertEqual(validateList(list_network)[0],
+                         PASS,
+                         "check list netwok response ")
+        self.assertEqual(
+            list_network[0].id,
+            self.network.id,
+            "List network id %s and created network id %s  does not match" %
+            (list_network[0].id,
+             self.network.id))
+
+        # 8-List router
+        list_router = Router.list(self.apiclient,
+                                  networkid=self.network.id,
+                                  accountid=self.account.name,
+                                  domainid=self.account.domainid)
+
+        self.assertEqual(
+            validateList(list_router)[0],
+            PASS,
+            "check list router response")
+
+        # 9-List service offerings
+        list_so = ServiceOffering.list(self.apiclient,
+                                       issystem='true',
+                                       id=list_router[0].serviceofferingid
+                                       )
+        self.assertEqual(
+            validateList(list_so)[0],
+            PASS,
+            "check list service offering response")
+        if list_conf[0].value == 'true':
+            storage_type = 'local'
+            value1 = 'false'
+        elif list_conf[0].value == 'false':
+            storage_type = 'shared'
+            value1 = 'true'
+        else:
+            raise Exception("check list_conf[0].value")
+        self.assertEqual(
+            list_so[0].storagetype,
+            storage_type,
+            "Check VR storage type and zone level settig"
+        )
+
+        # 10-Update zone level setting
+        update_global_settings(
+            self,
+            value=value1,
+            name="system.vm.use.local.storage",
+            zoneid=self.zone.id)
+
+        # 11-List configurations
+        list_conf1 = Configurations.list(self.apiclient,
+                                         name="system.vm.use.local.storage",
+                                         zoneid=self.zone.id)
+        self.assertEqual(
+            validateList(list_conf1)[0],
+            PASS,
+            "Check List configuration response for "
+            "system.vm.use.local.storage")
+
+        self.assertEqual(
+            list_conf1[0].value,
+            value1,
+            "Check the system.vm.use.local.storage value"
+        )
+        self.network.restart(self.apiclient,
+                             cleanup='true'
+                             )
+        # 12-List network
+        list_network1 = Network.list(self.apiclient,
+                                     accountid=self.account.name,
+                                     domainid=self.account.domainid,
+                                     id=self.network.id)
+        self.assertEqual(validateList(list_network1)[0],
+                         PASS,
+                         "check list netwok response ")
+
+        # 13-list VR
+        list_router1 = Router.list(self.apiclient,
+                                   networkid=list_network1[0].id,
+                                   accountid=self.account.name,
+                                   domainid=self.account.domainid)
+        self.assertEqual(
+            validateList(list_router1)[0],
+            PASS,
+            "check list router response"
+        )
+        # 14-list service offerings
+        list_so1 = ServiceOffering.list(self.apiclient,
+                                        issystem='true',
+                                        id=list_router1[0].serviceofferingid
+                                        )
+        self.assertEqual(
+            validateList(list_so1)[0],
+            PASS,
+            "check list service offering response"
+        )
+        if list_conf1[0].value == 'true':
+            storage_type1 = 'local'
+        elif list_conf1[0].value == 'false':
+            storage_type1 = 'shared'
+        else:
+            raise Exception("check list_conf[0].value")
+        self.assertEqual(
+            list_so1[0].storagetype,
+            storage_type1,
+            "Check VR storage type and zone level settings"
+        )