@@ -1077,6 +1077,42 @@ def list_compute_images(self):
1077
1077
return self .resource_client .resources .list (
1078
1078
filter = "resourceType eq 'Microsoft.Compute/images'" )
1079
1079
1080
+ def list_compute_images_by_resource_group (self , resource_group = None , free_images = None ):
1081
+ """
1082
+ Args:
1083
+ resource_group (str): Name of the resource group
1084
+ free_images (bool): Whether to collect image which do not have any resource(VM) linked to it
1085
+ """
1086
+ resource_group = resource_group or self .resource_group
1087
+ image_list = list (
1088
+ self .resource_client .resources .list (
1089
+ filter = f"resourceType eq 'Microsoft.Compute/images' and resourceGroup eq '{ resource_group } '"
1090
+ )
1091
+ )
1092
+
1093
+ if not free_images :
1094
+ return image_list
1095
+
1096
+ vm_list = self .list_vms (resource_group = resource_group )
1097
+ if not vm_list :
1098
+ return image_list
1099
+
1100
+ images_used_by_vm = []
1101
+ for vm_name in vm_list :
1102
+ images_used_by_vm .append (
1103
+ self .compute_client .virtual_machines .get (
1104
+ resource_group_name = resource_group ,
1105
+ vm_name = vm_name
1106
+ ).storage_profile .image_reference .id
1107
+ )
1108
+
1109
+ images_with_no_resources = []
1110
+ for image in image_list :
1111
+ if image .id not in images_used_by_vm :
1112
+ images_with_no_resources .append (image )
1113
+
1114
+ return images_with_no_resources
1115
+
1080
1116
def list_all_image_names (self ):
1081
1117
blob_image_names = [item .name for item in self .find_templates ()]
1082
1118
compute_image_names = [item .name for item in self .list_compute_images ()]
@@ -1130,6 +1166,21 @@ def delete_stack_by_date(self, days_old, resource_group=None):
1130
1166
result )
1131
1167
return results
1132
1168
1169
+ def delete_compute_image_using_name (self , resource_group = None , image_list = None ):
1170
+ """
1171
+ Delete compute images using name
1172
+
1173
+ :resource_group: (str) Name of the resource group. "FooBar"
1174
+ :image_list: (list) List of images. ["imagename1", "imagename2", "imagename3"]
1175
+ """
1176
+ result = []
1177
+ resource_group = resource_group or self .resource_group
1178
+ for image in image_list :
1179
+ self .logger .info ("Deleting '%s' from '%s'" , image , resource_group )
1180
+ response = self .compute_client .images .delete (resource_group_name = resource_group , image_name = image )
1181
+ result .append ((image , response ))
1182
+ return result
1183
+
1133
1184
def list_stack_resources (self , stack_name , resource_group = None ):
1134
1185
self .logger .info ("Checking Stack %s resources " , stack_name )
1135
1186
# todo: weird implementation to refactor this method later
0 commit comments