Repository: cloudstack Updated Branches: refs/heads/master 52ffccff5 -> ead41f921
changes made after second review Signed-off-by: Sowmya Krishnan <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ead41f92 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ead41f92 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ead41f92 Branch: refs/heads/master Commit: ead41f9215546d38d29023e44fde7ec6b946dc9d Parents: 52ffccf Author: Abhinav Roy <[email protected]> Authored: Tue Mar 24 14:07:57 2015 +0530 Committer: Sowmya Krishnan <[email protected]> Committed: Tue Mar 24 17:46:22 2015 +0530 ---------------------------------------------------------------------- .../component/test_escalations_hosts.py | 362 +++++++++++++++++++ tools/marvin/marvin/lib/base.py | 16 +- 2 files changed, 377 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ead41f92/test/integration/component/test_escalations_hosts.py ---------------------------------------------------------------------- diff --git a/test/integration/component/test_escalations_hosts.py b/test/integration/component/test_escalations_hosts.py new file mode 100644 index 0000000..811cd1a --- /dev/null +++ b/test/integration/component/test_escalations_hosts.py @@ -0,0 +1,362 @@ +# 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 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 from the Marvin - Testing in Python wiki + +# All tests inherit from cloudstackTestCase +from marvin.cloudstackTestCase import cloudstackTestCase, unittest + +# Import Integration Libraries + +# base - contains all resources as entities and defines create, delete, +# list operations on them +from marvin.lib.base import Host, Cluster, Zone, Pod + +# utils - utility classes for common cleanup, external library wrappers etc +from marvin.lib.utils import cleanup_resources + +# common - commonly used methods for all tests are listed here +from marvin.lib.common import get_zone, get_domain, list_hosts, get_pod + +from nose.plugins.attrib import attr + +import time + +# These tests need to be run separately and not in parallel with other tests. +# Because it disables the infrastructure for brief periods + +def update_host(self, state, host_id): + """ + Function to Enable/Disable Host + """ + host_status = Host.update( + self.apiclient, + id=host_id, + allocationstate=state + ) + return host_status.resourcestate + +def update_cluster(self, state, cluster_id, managed_state): + """ + Function to Enable/Disable cluster + """ + cluster_status = Cluster.update( + self.apiclient, + id=cluster_id, + allocationstate=state, + managedstate=managed_state + ) + return cluster_status.managedstate,cluster_status.allocationstate + +def update_pod(self, state, pod_id): + """ + Function to Enable/Disable pod + """ + pod_status = Pod.update( + self.apiclient, + id=pod_id, + allocationstate=state + ) + return pod_status.allocationstate + +def update_zone(self, state, zone_id): + """ + Function to Enable/Disable zone + """ + zone_status = self.zone.update( + self.apiclient, + id=zone_id, + allocationstate=state + ) + return zone_status.allocationstate + +def check_db(self,host_state): + """ + Function to check capacity_state in op_host_capacity table + """ + capacity_state = self.dbclient.execute("select capacity_state from op_host_capacity where host_id='%s';" % self.host_db_id[0][0]) + self.assertEqual( + capacity_state[0][0], + host_state + "d", + "Invalid db query response for capacity_state %s" % self.host_db_id[0][0] + ) + return capacity_state[0][0] + +class TestHosts(cloudstackTestCase): + + """ + Testing Hosts + """ + @classmethod + def setUpClass(cls): + cls.testClient = super(TestHosts, cls).getClsTestClient() + cls.testdata = cls.testClient.getParsedTestDataConfig() + cls.apiclient = cls.testClient.getApiClient() + cls.dbclient = cls.testClient.getDbConnection() + cls._cleanup = [] + + #get zone, domain etc + cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) + cls.domain = get_domain(cls.apiclient) + cls.pod = get_pod(cls.apiclient, cls.zone.id) + + # list hosts + hosts = list_hosts(cls.apiclient) + if len(hosts) > 0 : + cls.my_host_id = hosts[0].id + cls.host_db_id = cls.dbclient.execute("select id from host where uuid='%s';" % cls.my_host_id) + cls.my_cluster_id = hosts[0].clusterid + else : + raise unittest.SkipTest("There is no host available in the setup") + + @classmethod + def tearDownClass(cls): + cleanup_resources(cls.apiclient, cls._cleanup) + return + + def setUp(self): + self.cleanup = [] + return + + def tearDown(self): + # Clean up + cleanup_resources(self.apiclient, self.cleanup) + return + + @attr(tags=["advanced", "basic"], required_hardware="false") + def test_01_op_host_capacity_disable_cluster(self) : + """ + Disable the host and it's cluster, + make sure that capacity_state is not affected by enabling/disabling + of cluster in the op_host_capacity table + """ + #disable the host and check op_host_capacity table + + host_state = "Disable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + #disable the cluster and check op_host_capacity table + cluster_state= "Disabled" + managed_state= "Managed" + cluster_managedstate,cluster_allocationstate = update_cluster(cluster_state, self.my_cluster_id, managed_state) + self.assertEqual( + cluster_allocationstate, + cluster_state, + "Not able to enable/disable the cluster" + ) + self.assertEqual( + cluster_managedstate, + managed_state, + "Not able to managed/unmanage the cluster" + ) + + check_db(host_state) + #enable the cluster and check op_host_capacity table + cluster_state= "Enabled" + cluster_managedstate,cluster_allocationstate = update_cluster(cluster_state, self.my_cluster_id, managed_state) + self.assertEqual( + cluster_allocationstate, + cluster_state, + "Not able to enable/disable the cluster" + ) + self.assertEqual( + cluster_managedstate, + managed_state, + "Not able to managed/unmanage the cluster" + ) + check_db(host_state) + #enable the host and check op_host_capacity table + + host_state = "Enable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + return + + @attr(tags=["advanced", "basic"], required_hardware="false") + def test_02_op_host_capacity_disable_pod(self) : + """ + Disable the host and it's pod, + make sure that capacity_state is not affected by enabling/disabling + of pod in the op_host_capacity table + """ + #disable the host and check op_host_capacity table + + host_state = "Disable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + #disable the pod and check op_host_capacity table + pod_state= "Disabled" + pod_allocationstate = update_pod(pod_state, self.pod.id) + self.assertEqual( + pod_allocationstate, + pod_state, + "Not able to enable/disable the pod" + ) + check_db(host_state) + #enable the pod and check op_host_capacity table + pod_state= "Enabled" + pod_allocationstate = update_pod(pod_state, self.pod.id) + self.assertEqual( + pod_allocationstate, + pod_state, + "Not able to enable/disable the pod" + ) + check_db(host_state) + #enable the host and check op_host_capacity table + + host_state = "Enable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + return + + + @attr(tags=["advanced", "basic", "tag1"], required_hardware="false") + def test_03_op_host_capacity_disable_zone(self) : + """ + Disable the host and it's zone, + make sure that capacity_state is not affected by enabling/disabling + of zone in the op_host_capacity table + """ + #disable the host and check op_host_capacity table + + host_state = "Disable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + #disbale the zone and check op_host_capacity table + zone_state= "Disabled" + zone_allocationstate = update_zone(zone_state, self.zone.id) + self.assertEqual( + zone_allocationstate, + zone_state, + "Not able to enable/disable the zone" + ) + check_db(host_state) + #enable the zone and check op_host_capacity table + zone_state= "Enabled" + zone_allocationstate = update_zone(zone_state, self.zone.id) + self.assertEqual( + zone_allocationstate, + zone_state, + "Not able to enable/disable the zone" + ) + check_db(host_state) + #enable the host and check op_host_capacity table + + host_state = "Enable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + check_db(host_state) + return + + @attr(tags=["advanced", "basic"], required_hardware="false") + def test_04_disable_host_unmanage_cluster_check_hosts_status(self) : + """ + Disable the host then unmanage the cluster, + make sure that the host goes to Disconnected state + """ + #disable host + host_state = "Disable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + #unmanage cluster + cluster_state= "Enabled" + managed_state= "Unmanaged" + cluster_managedstate,cluster_allocationstate = update_cluster(cluster_state, self.my_cluster_id, managed_state) + self.assertEqual( + cluster_allocationstate, + cluster_state, + "Not able to enable/disable the cluster" + ) + self.assertEqual( + cluster_managedstate, + managed_state, + "Not able to managed/unmanage the cluster" + ) + #check host state now + time.sleep(30) + host_list = list_hosts(self.apiclient, id=self.my_host_id) + + self.assertEqual( + host_list[0].state, + "Disconnected", + " Host is not in Disconnected state after unmanaging cluster" + ) + #manage the cluster again and let the hosts come back to Up state. + managed_state= "Managed" + cluster_managedstate,cluster_allocationstate = update_cluster(cluster_state, self.my_cluster_id, managed_state) + self.assertEqual( + cluster_allocationstate, + cluster_state, + "Not able to enable/disable the cluster" + ) + self.assertEqual( + cluster_managedstate, + managed_state, + "Not able to managed/unmanage the cluster" + ) + #check host state now + time.sleep(90) + host_list = list_hosts(self.apiclient, id=self.my_host_id) + + self.assertEqual( + host_list[0].state, + "Up", + " Host is not in Up state after managing cluster" + ) + #enable the host + host_state = "Enable" + host_resourcestate = update_host(host_state, self.my_host_id) + self.assertEqual( + host_resourcestate, + host_state + "d", + "Host state not correct" + ) + return + http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ead41f92/tools/marvin/marvin/lib/base.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/lib/base.py b/tools/marvin/marvin/lib/base.py index 0ea1858..7f609e7 100755 --- a/tools/marvin/marvin/lib/base.py +++ b/tools/marvin/marvin/lib/base.py @@ -2346,6 +2346,14 @@ class Cluster: cmd.listall = True return(apiclient.listClusters(cmd)) + @classmethod + def update(cls, apiclient, **kwargs): + """Update cluster information""" + + cmd = updateCluster.updateClusterCmd() + [setattr(cmd, k, v) for k, v in kwargs.items()] + return(apiclient.updateCluster(cmd)) + class Host: """Manage Host life cycle""" @@ -3002,7 +3010,6 @@ class Zone: cmd.listall = True return(apiclient.listZones(cmd)) - class Pod: """Manage Pod""" @@ -3039,6 +3046,13 @@ class Pod: cmd.listall = True return apiclient.listPods(cmd) + @classmethod + def update(self, apiclient, **kwargs): + """Update the pod""" + + cmd = updatePod.updatePodCmd() + [setattr(cmd, k, v) for k, v in kwargs.items()] + return apiclient.updatePod(cmd) class PublicIpRange: """Manage VlanIpRange"""
