Skip to content

Commit cd479f4

Browse files
committed
Marvin tests for backup policies
1 parent 0541c6d commit cd479f4

File tree

2 files changed

+107
-20
lines changed

2 files changed

+107
-20
lines changed

test/integration/smoke/test_backup_recovery.py

Lines changed: 101 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@
4444
wait_for_cleanup)
4545
from nose.plugins.attrib import attr
4646
import logging
47-
from marvin.cloudstackException import CloudstackAPIException
48-
from marvin.codes import PASS
47+
from marvin.codes import PASS, FAILED
4948

5049
class TestBackupAndRecovery(cloudstackTestCase):
5150

@@ -61,7 +60,45 @@ def setUpClass(cls):
6160

6261
cls.services = cls.testClient.getParsedTestDataConfig()
6362
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
63+
cls.services["mode"] = cls.zone.networktype
6464
cls.hypervisor = cls.testClient.getHypervisorInfo()
65+
cls.domain = get_domain(cls.api_client)
66+
67+
cls.template = get_template(
68+
cls.api_client,
69+
cls.zone.id,
70+
cls.services["ostype"]
71+
)
72+
if cls.template == FAILED:
73+
assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
74+
75+
cls.services["small"]["zoneid"] = cls.zone.id
76+
cls.services["small"]["template"] = cls.template.id
77+
78+
cls.account = Account.create(
79+
cls.api_client,
80+
cls.services["account"],
81+
domainid=cls.domain.id
82+
)
83+
84+
cls.offering = ServiceOffering.create(
85+
cls.api_client,
86+
cls.services["service_offerings"]["small"]
87+
)
88+
89+
cls.vm = VirtualMachine.create(
90+
cls.api_client,
91+
cls.services["small"],
92+
accountid=cls.account.name,
93+
domainid=cls.account.domainid,
94+
serviceofferingid=cls.offering.id,
95+
mode=cls.services["mode"]
96+
)
97+
98+
cls._cleanup = [
99+
cls.offering,
100+
cls.account
101+
]
65102

66103
backup_enabled_cfg = Configurations.list(
67104
cls.api_client,
@@ -76,7 +113,12 @@ def setUpClass(cls):
76113

77114
cls.backup_available = cls.backup_enabled and cls.backup_provider == "dummy"
78115

79-
cls._cleanup = []
116+
if cls.backup_available:
117+
cls.external_policies = BackupPolicy.listExternal(cls.api_client, cls.zone.id)
118+
cls.logger.debug("Importing backup policy %s - %s" % (cls.external_policies[0].policyid, cls.external_policies[0].name))
119+
cls.policy = BackupPolicy.importExisting(cls.api_client, cls.zone.id, cls.external_policies[0].policyid, cls.external_policies[0].name)
120+
cls._cleanup.append(cls.policy)
121+
80122
return
81123

82124
@classmethod
@@ -110,18 +152,64 @@ def test_ImportBackupPolicies(self):
110152
if not self.backup_available:
111153
self.skipTest("This test is only available when backup is enabled and dummy provider selected")
112154

113-
external_policies = BackupPolicy.listExternal(self.apiclient, self.zone.id)
114-
self.logger.debug("External policies on dummy provider")
115-
self.logger.debug(external_policies)
116-
117-
for p in external_policies:
118-
self.logger.debug("Importing backup policy %s - %s" % (p.policyid, p.name))
119-
policy = BackupPolicy.importExisting(self.apiclient, self.zone.id, p.policyid, p.name)
155+
ext_policy = self.external_policies[1]
156+
self.logger.debug("Importing backup policy %s - %s" % (ext_policy.policyid, ext_policy.name))
157+
policy = BackupPolicy.importExisting(self.apiclient, self.zone.id, ext_policy.policyid, ext_policy.name)
120158

121159
imported_policies = BackupPolicy.listInternal(self.apiclient, self.zone.id)
160+
self.assertIsInstance(
161+
imported_policies,
162+
list,
163+
"List Backup Policies should return a valid response"
164+
)
165+
self.assertNotEqual(
166+
len(imported_policies),
167+
0,
168+
"Check if the list API returns a non-empty response"
169+
)
170+
122171
self.logger.debug("Listing internal backup policies")
123172
self.logger.debug(imported_policies)
124173

125-
for p in imported_policies:
126-
self.logger.debug("Deleting backup policy %s" % p.id)
127-
BackupPolicy.delete(self.apiclient, p.id)
174+
self.logger.debug("Deleting backup policy %s" % policy.id)
175+
policy.delete(self.apiclient)
176+
177+
@attr(tags=["advanced", "backup"], required_hardware="false")
178+
def test_AssignVMToBackupPolicy(self):
179+
"""
180+
Assign a VM to a backup policy
181+
"""
182+
if not self.backup_available:
183+
self.skipTest("This test is only available when backup is enabled and dummy provider selected")
184+
185+
self.logger.debug("Assigning VM %s to backup policy %s" % (self.vm.id, self.policy.id))
186+
187+
self.policy.assignVM(
188+
self.apiclient,
189+
self.vm.id,
190+
self.zone.id
191+
)
192+
193+
qresultset = self.dbclient.execute(
194+
"select id from vm_instance where uuid='%s';"
195+
% self.vm.id
196+
)
197+
vm_id = qresultset[0][0]
198+
199+
qresultset = self.dbclient.execute(
200+
"select id from backup_policy where uuid='%s';"
201+
% self.policy.id
202+
)
203+
policy_id = qresultset[0][0]
204+
205+
qresultset = self.dbclient.execute(
206+
"select id from backup_policy_vm_map where policy_id='%d' and vm_id = '%d';"
207+
% (policy_id, vm_id)
208+
)
209+
210+
map = qresultset[0]
211+
self.assertNotEqual(
212+
map[0],
213+
None,
214+
"A mapping between VM and backup policy should exist on DB"
215+
)

tools/marvin/marvin/lib/base.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5391,7 +5391,7 @@ def importExisting(self, apiclient, zoneid, externalid, name):
53915391
cmd.zoneid = zoneid
53925392
cmd.externalid = externalid
53935393
cmd.name = name
5394-
return (apiclient.importBackupPolicy(cmd))
5394+
return BackupPolicy(apiclient.importBackupPolicy(cmd).__dict__)
53955395

53965396
@classmethod
53975397
def listInternal(self, apiclient, zoneid):
@@ -5410,19 +5410,18 @@ def listExternal(self, apiclient, zoneid):
54105410
cmd.external = True
54115411
return (apiclient.listBackupPolicies(cmd))
54125412

5413-
@classmethod
5414-
def delete(self, apiclient, policyid):
5413+
def delete(self, apiclient):
54155414
"""Delete an imported backup policy"""
54165415

54175416
cmd = deleteBackupPolicy.deleteBackupPolicyCmd()
5418-
cmd.backuppolicyid = policyid
5417+
cmd.backuppolicyid = self.id
54195418
return (apiclient.deleteBackupPolicy(cmd))
54205419

5421-
@classmethod
5422-
def assignVM(self, apiclient, policyid, vmid):
5420+
def assignVM(self, apiclient, vmid, zoneid):
54235421
"""Assign a VM to a backup policy"""
54245422

54255423
cmd = assignBackupPolicy.assignBackupPolicyCmd()
5426-
cmd.backuppolicyid = policyid
5424+
cmd.backuppolicyid = self.id
54275425
cmd.virtualmachineid = vmid
5426+
cmd.zoneid = zoneid
54285427
return (apiclient.assignBackupPolicy(cmd))

0 commit comments

Comments
 (0)