forked from apache/cloudstack
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathtest_capacity_host_delete.py
More file actions
211 lines (176 loc) · 7.44 KB
/
test_capacity_host_delete.py
File metadata and controls
211 lines (176 loc) · 7.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# 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
import 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
import logging
# These tests need to be run separately and not in parallel with other tests.
# Because it disables the host
# host_id column of op_host_capacity refers to host_id or a storage pool id
#
# This test is to make sure that Disable host only disables the capacities of type
# CPU and MEMORY
#
# TEST:
# Base Condition: There exists a host and storage pool with same id
#
# Steps:
# 1. Find a host and storage pool having same id
# 2. Disable the host
# 3. verify that the CPU(1) and MEMORY(0) capacity in op_host_capacity for above host
# is disabled
# 4. verify that the STORAGE(3) capacity in op_host_capacity for storage pool with id
# same as above host is not disabled
#
def update_host(apiclient, state, host_id):
"""
Function to Enable/Disable Host
"""
host_status = Host.update(
apiclient,
id=host_id,
allocationstate=state
)
return host_status.resourcestate
def check_db(self, host_state):
"""
Function to check capacity_state in op_host_capacity table
"""
capacity_state = None
if self.host_db_id and self.host_db_id[0]:
capacity_state = self.dbclient.execute(
"select capacity_state from op_host_capacity where host_id='%s' and capacity_type in (0,1) order by capacity_type asc;" %
self.host_db_id[0][0])
if capacity_state and len(capacity_state)==2:
if capacity_state[0]:
self.assertEqual(
capacity_state[0][0],
host_state +
"d",
"Invalid db query response for capacity_state %s" %
capacity_state[0][0])
if capacity_state[1]:
self.assertEqual(
capacity_state[1][0],
host_state +
"d",
"Invalid db query response for capacity_state %s" %
capacity_state[1][0])
else:
self.logger.debug("Could not find capacities of type 1 and 0. Does not have necessary data to run this test")
capacity_state = None
if self.host_db_id and self.host_db_id[0]:
capacity_state = self.dbclient.execute(
"select capacity_state from op_host_capacity where host_id='%s' and capacity_type = 3 order by capacity_type asc;" %
self.host_db_id[0][0])
if capacity_state and capacity_state[0]:
self.assertNotEqual(
capacity_state[0][0],
host_state +
"d",
"Invalid db query response for capacity_state %s" %
capacity_state[0][0])
else:
self.logger.debug("Could not find capacities of type 3. Does not have necessary data to run this test")
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 = Zone(get_zone(cls.apiclient, cls.testClient.getZoneForTests()).__dict__)
cls.domain = get_domain(cls.apiclient)
cls.pod = get_pod(cls.apiclient, cls.zone.id)
cls.logger = logging.getLogger('TestHosts')
cls.stream_handler = logging.StreamHandler()
cls.logger.setLevel(logging.DEBUG)
cls.logger.addHandler(cls.stream_handler)
cls.storage_pool_db_id = None
# list hosts
hosts = list_hosts(cls.apiclient, type="Routing")
i = 0
while (i < len(hosts)):
host_id = hosts[i].id
cls.logger.debug("Trying host id : %s" % host_id)
host_db_id = cls.dbclient.execute(
"select id from host where uuid='%s';" %
host_id)
if host_db_id and host_db_id[0]:
cls.logger.debug("found host db id : %s" % host_db_id)
storage_pool_db_id = cls.dbclient.execute(
"select id from storage_pool where id='%s' and removed is null;" %
host_db_id[0][0])
if storage_pool_db_id and storage_pool_db_id[0]:
cls.logger.debug("Found storage_pool_db_id : %s" % storage_pool_db_id[0][0])
capacity_state = cls.dbclient.execute(
"select count(capacity_state) from op_host_capacity where host_id='%s' and capacity_type in (0,1,3) and capacity_state = 'Enabled'" %
host_db_id[0][0])
if capacity_state and capacity_state[0]:
cls.logger.debug("Check capacity count : %s" % capacity_state[0][0])
if capacity_state[0][0] == 3:
cls.logger.debug("found host id : %s, can be used for this test" % host_id)
cls.my_host_id = host_id
cls.host_db_id = host_db_id
cls.storage_pool_db_id = storage_pool_db_id
break
if not cls.storage_pool_db_id:
i = i + 1
if cls.storage_pool_db_id is None:
raise unittest.SkipTest("There is no host and storage pool available in the setup to run this test")
@classmethod
def tearDownClass(cls):
cleanup_resources(cls.apiclient, cls._cleanup)
return
def setUp(self):
self.logger.debug("Capacity check for Disable host")
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_host(self):
host_state = "Disable"
host_resourcestate = update_host(
self.apiclient,
host_state,
self.my_host_id)
self.assertEqual(
host_resourcestate,
host_state + "d",
"Host state not correct"
)
check_db(self, host_state)
return