4444 wait_for_cleanup )
4545from nose .plugins .attrib import attr
4646import logging
47- from marvin .cloudstackException import CloudstackAPIException
48- from marvin .codes import PASS
47+ from marvin .codes import PASS , FAILED
4948
5049class 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+ )
0 commit comments