Updates to the image for MOSK 25.2.x

* fixed an issue in mos-spt, improve report name and location
* imrpoved cleanup script: show details on dry-run, skip tempest net
* revert to jammy image as base for the toolset dockerfile
* improved ceph collect report location

Related-PROD: PROD-37187
Change-Id: I138d9e550cd244be122ff035bbb67433eb866910
diff --git a/cleanup.py b/cleanup.py
index 55a2f90..6e9305a 100644
--- a/cleanup.py
+++ b/cleanup.py
@@ -45,7 +45,7 @@
 if manila_present:
     shared_file_system = cloud.shared_file_system
 
-mask = "cvp|s_rally|rally_|tempest-|tempest_|spt|fio"
+mask = "cvp|s_rally|rally_|tempest-|tempest_|spt-test|fio"
 full_mask = f"^(?!.*(manual|-static-)).*({mask}).*$"
 mask_pattern = re.compile(full_mask, re.IGNORECASE)
 stack_mask = "api-[0-9]+-[a-z]+"
@@ -83,10 +83,28 @@
     log.info(f"{count} {resource} containing '{pattern}' are found.")
 
 
+def _log_resources_details_at_dry_run(list_to_delete, resource):
+    if len(list_to_delete) > 0:
+        log.info(f"... {len(list_to_delete)} {resource} would be deleted:")
+        for id_ in list_to_delete:
+            log.info(f"... ... {id_} ({list_to_delete[id_]})")
+
+
 def _log_resource_delete(id_, name, type_):
     log.info(f"... deleting {name} (id={id_}) {type_}")
 
 
+def _skip_tempest_fixed_net(nets_to_delete: dict) -> dict:
+    # the "tempest-fixed-net" comes from MOSK itself and should not be deleted
+    keys_to_remove = [
+        net_id for net_id, name in nets_to_delete.items()
+        if name == "tempest-fixed-net"
+    ]
+    for net_id in keys_to_remove:
+        nets_to_delete.pop(net_id, None)
+    return nets_to_delete
+
+
 def _get_volume_groups(all_tenants='true'):
     ep = volume.get_endpoint()
     uri = f"{ep}/groups/detail"
@@ -204,6 +222,7 @@
     users_to_delete = _filter_test_resources(users, 'name')
     _log_resources_count(len(users_to_delete), 'user(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(users_to_delete, 'user(s)')
         return
     for id_ in users_to_delete:
         _log_resource_delete(id_, users_to_delete[id_], 'user')
@@ -215,6 +234,7 @@
     roles_to_delete = _filter_test_resources(roles, 'name')
     _log_resources_count(len(roles_to_delete), 'role(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(roles_to_delete, 'role(s)')
         return
     for id_ in roles_to_delete:
         _log_resource_delete(id_, roles_to_delete[id_], 'role')
@@ -226,6 +246,7 @@
     projects_to_delete = _filter_test_resources(projects, 'name')
     _log_resources_count(len(projects_to_delete), 'project(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(projects_to_delete, 'project(s)')
         return
     for id_ in projects_to_delete:
         _log_resource_delete(id_, projects_to_delete[id_], 'project')
@@ -237,6 +258,7 @@
     regions_to_delete = _filter_test_resources(regions, 'id')
     _log_resources_count(len(regions_to_delete), 'region(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(regions_to_delete, 'region(s)')
         return
     for id_ in regions_to_delete:
         _log_resource_delete(id_, id_, 'region')
@@ -248,6 +270,7 @@
     services_to_delete = _filter_test_resources(services, 'name')
     _log_resources_count(len(services_to_delete), 'service(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(services_to_delete, 'service(s)')
         return
     for id_ in services_to_delete:
         _log_resource_delete(id_, services_to_delete[id_], 'service')
@@ -268,6 +291,7 @@
         stacks_to_delete.update(stacks_alt_to_delete)
 
     if args.dry_run:
+        _log_resources_details_at_dry_run(stacks_to_delete, 'stack(s)')
         return
 
     for id_ in stacks_to_delete:
@@ -282,6 +306,7 @@
     flavors_to_delete = _filter_test_resources(flavors, 'name')
     _log_resources_count(len(flavors_to_delete), 'flavor(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(flavors_to_delete, 'flavor(s)')
         return
     for id_ in flavors_to_delete:
         _log_resource_delete(id_, flavors_to_delete[id_], 'flavor')
@@ -293,6 +318,7 @@
     images_to_delete = _filter_test_resources(images, 'name')
     _log_resources_count(len(images_to_delete), 'image(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(images_to_delete, 'image(s)')
         return
     for id_ in images_to_delete:
         _log_resource_delete(id_, images_to_delete[id_], 'image')
@@ -304,6 +330,7 @@
     keypairs_to_delete = _filter_test_resources(keypairs, 'name')
     _log_resources_count(len(keypairs_to_delete), 'keypair(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(keypairs_to_delete, 'keypair(s)')
         return
     for id_ in keypairs_to_delete:
         _log_resource_delete(id_, keypairs_to_delete[id_], 'keypair')
@@ -315,6 +342,7 @@
     servers_to_delete = _filter_test_resources(servers, 'name')
     _log_resources_count(len(servers_to_delete), 'server(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(servers_to_delete, 'server(s)')
         return
     for id_ in servers_to_delete:
         if args.servers_active:
@@ -334,6 +362,7 @@
     shares_to_delete = _filter_test_resources(shares, 'name')
     _log_resources_count(len(shares_to_delete), 'share(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(shares_to_delete, 'share(s)')
         return
     for id_ in shares_to_delete:
         _log_resource_delete(id_, shares_to_delete[id_], 'share')
@@ -349,6 +378,8 @@
     share_types_to_delete = _filter_test_resources(share_types, 'name')
     _log_resources_count(len(share_types_to_delete), 'share type(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(share_types_to_delete,
+                                          'share_type(s)')
         return
     for id_ in share_types_to_delete:
         _log_resource_delete(id_, share_types_to_delete[id_], 'type')
@@ -361,6 +392,8 @@
     share_networks_to_delete = _filter_test_resources(share_networks, 'name')
     _log_resources_count(len(share_networks_to_delete), 'share network(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(share_networks_to_delete,
+                                          'share_network(s)')
         return
     for id_ in share_networks_to_delete:
         _log_resource_delete(id_, share_networks_to_delete[id_], 'type')
@@ -372,6 +405,7 @@
     snapshots_to_delete = _filter_test_resources(snapshots, 'name')
     _log_resources_count(len(snapshots_to_delete), 'snapshot(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(snapshots_to_delete, 'snapshot(s)')
         return
     for id_ in snapshots_to_delete:
         snapshot_obj = volume.get_snapshot(id_)
@@ -386,6 +420,7 @@
     volumes_to_delete = _filter_test_resources(volumes, 'name')
     _log_resources_count(len(volumes_to_delete), 'volume(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(volumes_to_delete, 'volume(s)')
         return
     for id_ in volumes_to_delete:
         _reset_volume_status(id_, 'available', 'detached', 'None')
@@ -401,6 +436,7 @@
     groups_to_delete = _filter_test_resources(groups, 'name')
     _log_resources_count(len(groups_to_delete), 'volume group(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(groups_to_delete, 'volume group(s)')
         return
     for id_ in groups_to_delete:
         _log_resource_delete(id_, groups_to_delete[id_], 'volume group')
@@ -413,6 +449,8 @@
     backups_to_delete = _filter_test_resources(backups, 'name')
     _log_resources_count(len(backups_to_delete), 'volume backup(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(backups_to_delete,
+                                          'volume backup(s)')
         return
     for id_ in backups_to_delete:
         backup_obj = volume.get_backup(id_)
@@ -426,6 +464,8 @@
     group_types_to_delete = _filter_test_resources(group_types, 'name')
     _log_resources_count(len(group_types_to_delete), 'volume group type(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(group_types_to_delete,
+                                          'volume group type(s)')
         return
     for id_ in group_types_to_delete:
         _log_resource_delete(
@@ -438,6 +478,8 @@
     volume_types_to_delete = _filter_test_resources(volume_types, 'name')
     _log_resources_count(len(volume_types_to_delete), 'volume type(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(volume_types_to_delete,
+                                          'volume type(s)')
         return
     for id_ in volume_types_to_delete:
         _log_resource_delete(id_, volume_types_to_delete[id_], 'volume type')
@@ -449,6 +491,8 @@
     sec_groups_to_delete = _filter_test_resources(sec_groups, 'name')
     _log_resources_count(len(sec_groups_to_delete), 'security group(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(sec_groups_to_delete,
+                                          'security group(s)')
         return
     for id_ in sec_groups_to_delete:
         _log_resource_delete(id_, sec_groups_to_delete[id_], 'security group')
@@ -460,6 +504,7 @@
     containers_to_delete = _filter_test_resources(containers, 'name')
     _log_resources_count(len(containers_to_delete), 'container(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(containers_to_delete, 'container(s)')
         return
     for id_ in containers_to_delete:
         _log_resource_delete(id_, containers_to_delete[id_], 'container')
@@ -471,6 +516,7 @@
     routers_to_delete = _filter_test_resources(routers, 'name')
     _log_resources_count(len(routers_to_delete), 'router(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(routers_to_delete, 'router(s)')
         return
     for id_ in routers_to_delete:
         _log_resource_delete(id_, routers_to_delete[id_], 'router')
@@ -490,8 +536,10 @@
 def cleanup_networks():
     nets = network.networks()
     nets_to_delete = _filter_test_resources(nets, 'name')
+    _skip_tempest_fixed_net(nets_to_delete)
     _log_resources_count(len(nets_to_delete), 'network(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(nets_to_delete, 'network(s)')
         return
     for id_ in nets_to_delete:
         _log_resource_delete(id_, nets_to_delete[id_], 'network')
@@ -515,6 +563,7 @@
     lbs_to_delete = _filter_test_resources(lbs, 'name')
     _log_resources_count(len(lbs_to_delete), 'load_balancer(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(lbs_to_delete, 'load_balancer(s)')
         return
     for id_ in lbs_to_delete:
         _log_resource_delete(id_, lbs_to_delete[id_], 'load_balancer')
@@ -540,6 +589,7 @@
                 fips_to_delete[ip.id] = ip.floating_ip_address
     _log_resources_count(len(fips_to_delete), 'floating ip(s)')
     if args.dry_run:
+        _log_resources_details_at_dry_run(fips_to_delete, 'floating ip(s)')
         return
     for id_ in fips_to_delete:
         _log_resource_delete(id_, fips_to_delete[id_], 'floating ip')
@@ -609,5 +659,8 @@
     if args.projects:
         cleanup_projects()
 
-    msg = "Cleanup is FINISHED"
+    if args.dry_run:
+        msg = "DRY-RUN mode, no cleanup is done"
+    else:
+        msg = "Cleanup is FINISHED"
     log.info(f"\n{'=' * len(msg)}\n{msg}")