77from rockoon .tests .functional .exporter import base
88from rockoon .tests .functional import data_utils
99from rockoon .tests .functional .base import LOG
10+ from rockoon .tests .functional import config
11+
12+ CONF = config .Config ()
1013
1114
1215class NovaCollectorFunctionalTestCase (base .BaseFunctionalExporterTestCase ):
@@ -16,6 +19,10 @@ class NovaCollectorFunctionalTestCase(base.BaseFunctionalExporterTestCase):
1619 "osdpl_nova_instances" : {"labels" : []},
1720 "osdpl_nova_active_instances" : {"labels" : []},
1821 "osdpl_nova_error_instances" : {"labels" : []},
22+ "osdpl_nova_verify_resize_instances" : {"labels" : []},
23+ # "osdpl_nova_instance_status": {
24+ # "labels": ["name", "id", "status"]
25+ # },
1926 "osdpl_nova_hypervisor_instances" : {"labels" : ["host" , "zone" ]},
2027 # "osdpl_nova_aggregate_hosts": {"labels": ["name"]},
2128 # "osdpl_nova_host_aggregate_info": {"labels": ["hosts", "name"]},
@@ -218,6 +225,136 @@ def test_nova_error_instances(self):
218225 f"Expected numbers of error servers: { len (error_servers )} ." ,
219226 )
220227
228+ def test_nova_verify_resize_instances (self ):
229+ """Total number of instances in VERIFY_RESIZE status.
230+
231+ **Steps**
232+
233+ #. Get exporter metric `osdpl_nova_verify_resize_instances` with initial value
234+ #. Create test instance
235+ #. Resize instance and wait until it reaches VERIFY_RESIZE status
236+ #. Check that number of VERIFY_RESIZE instances increased in exporter metrics
237+ #. Confirm resize and delete test instance
238+ #. Check that number of VERIFY_RESIZE instances decreased in exporter metrics
239+ """
240+
241+ metric_name = "osdpl_nova_verify_resize_instances"
242+
243+ initial_metric = self .get_metric_after_refresh (
244+ metric_name , self .scrape_collector
245+ )
246+ initial_servers = self .ocm .compute_get_all_servers (
247+ status = "VERIFY_RESIZE"
248+ )
249+
250+ self .assertEqual (
251+ int (initial_metric .samples [0 ].value ),
252+ len (initial_servers ),
253+ f"Current number of VERIFY_RESIZE servers in exporter's metrics is "
254+ f"{ int (initial_metric .samples [0 ].value )} . "
255+ f"Expected number of VERIFY_RESIZE servers: { len (initial_servers )} ." ,
256+ )
257+ # Create a server with a smaller flavor to test resize
258+ flavor_id = self .get_flavor_id (CONF .TEST_FLAVOR_TINY_NAME )
259+ resize_flavor_id = self .get_flavor_id (CONF .TEST_FLAVOR_NAME )
260+ server = self .server_create (flavorRef = flavor_id )
261+ self .resize_server (server , resize_flavor_id )
262+
263+ metric_after_resize = self .get_metric_after_refresh (
264+ metric_name , self .scrape_collector
265+ )
266+ servers_after_resize = self .ocm .compute_get_all_servers (
267+ status = "VERIFY_RESIZE"
268+ )
269+
270+ self .assertEqual (
271+ int (metric_after_resize .samples [0 ].value ),
272+ len (servers_after_resize ),
273+ f"Current number of VERIFY_RESIZE servers in exporter's metrics is "
274+ f"{ int (metric_after_resize .samples [0 ].value )} . "
275+ f"Expected number of VERIFY_RESIZE servers: { len (servers_after_resize )} ." ,
276+ )
277+
278+ self .server_delete (server )
279+
280+ metric = self .get_metric_after_refresh (
281+ metric_name , self .scrape_collector
282+ )
283+ self .assertEqual (
284+ int (metric .samples [0 ].value ),
285+ len (servers_after_resize ) - 1 ,
286+ f"Current number of VERIFY_RESIZE servers in exporter's metrics is "
287+ f"{ int (metric .samples [0 ].value )} . "
288+ f"Expected number of VERIFY_RESIZE servers: { len (servers_after_resize ) - 1 } ." ,
289+ )
290+
291+ def test_instance_status (self ):
292+ """Check that instance_status metric appears when VM is in VERIFY_RESIZE status.
293+
294+ **Steps:**
295+
296+ #. Create a test instance
297+ #. Get initial samples for metric `osdpl_nova_instance_status`
298+ #. Check that metric doesn't have sample for the test instance
299+ #. Resize test instance
300+ #. Refresh metric and check that a new sample with the VM's name, id and status appears
301+ #. Delete the test instance
302+ #. Refresh metric and check that the sample disappears
303+ """
304+ metric_name = "osdpl_nova_instance_status"
305+
306+ # Create a server with a smaller flavor to test resize
307+ flavor_id = self .get_flavor_id (CONF .TEST_FLAVOR_TINY_NAME )
308+ resize_flavor_id = self .get_flavor_id (CONF .TEST_FLAVOR_NAME )
309+ server = self .server_create (flavorRef = flavor_id )
310+ metric = self .get_metric_after_refresh (
311+ metric_name , self .scrape_collector
312+ )
313+ labels = {
314+ "id" : server ["id" ],
315+ "name" : server ["name" ],
316+ "status" : server ["status" ].lower (),
317+ }
318+ samples = self .filter_metric_samples (metric , labels )
319+ self .assertEqual (
320+ len (samples ),
321+ 0 ,
322+ f"Instance_status metric contain sample for VM { server ['name' ]} " ,
323+ )
324+
325+ self .resize_server (server , resize_flavor_id )
326+ server = self .ocm .oc .get_server (server .id )
327+ labels = {
328+ "id" : server ["id" ],
329+ "name" : server ["name" ],
330+ "status" : server ["status" ].lower (),
331+ }
332+ metric = self .get_metric_after_refresh (
333+ metric_name , self .scrape_collector
334+ )
335+ samples = self .filter_metric_samples (metric , labels )
336+ self .assertEqual (
337+ len (samples ),
338+ 1 ,
339+ f"Instance_status metric does not contain sample for VM { server ['name' ]} " ,
340+ )
341+ self .assertCountEqual (
342+ ["name" , "id" , "status" ],
343+ samples [0 ].labels .keys (),
344+ )
345+ self .server_delete (server )
346+ metric_after_delete = self .get_metric_after_refresh (
347+ metric_name , self .scrape_collector
348+ )
349+ deleted_samples = self .filter_metric_samples (
350+ metric_after_delete , labels
351+ )
352+ self .assertEqual (
353+ len (deleted_samples ),
354+ 0 ,
355+ f"Instance_status metric sample for VM { server ['name' ]} still exists after deletion" ,
356+ )
357+
221358
222359@pytest .mark .xdist_group ("exporter-compute-network" )
223360class NovaAvailabilityZonesTestCase (base .BaseFunctionalExporterTestCase ):
0 commit comments