diff --git a/wrapanapi/systems/ec2.py b/wrapanapi/systems/ec2.py index 76c1a594..47e0fadf 100644 --- a/wrapanapi/systems/ec2.py +++ b/wrapanapi/systems/ec2.py @@ -832,6 +832,36 @@ def list_templates(self, executable_by_me=True, owned_by_me=True, public=False): return [EC2Image(system=self, raw=self.ec2_resource.Image(image["ImageId"])) for image in images] + def filter_free_images(self, image_list=None): + """ + Returns images which don't have a VM associated to it + + Args: + image_list (list): List of images + """ + occupied_images = [] + vm_list = self.list_vms() + + if len(vm_list) == 0: + # No VMs using the images, images are free + return image_list + + for vm in vm_list: + if vm.raw.image_id in image_list: + occupied_images.append(vm.raw.image_id) + free_images = list(set(image_list) - set(occupied_images)) + return free_images + + def delete_images(self, image_list=None): + """ + Deletes images by ID + + Args: + image_list (list): ["imageID_1", "imageID_2"] + """ + for image in image_list: + img=EC2Image(system=self, raw=self.ec2_resource.Image(image)).delete() + def find_templates(self, name=None, id=None, executable_by_me=True, owned_by_me=True, public=False, filters=None): """ diff --git a/wrapanapi/systems/msazure.py b/wrapanapi/systems/msazure.py index b4ae8c43..481de3a0 100644 --- a/wrapanapi/systems/msazure.py +++ b/wrapanapi/systems/msazure.py @@ -1077,6 +1077,42 @@ def list_compute_images(self): return self.resource_client.resources.list( filter="resourceType eq 'Microsoft.Compute/images'") + def list_compute_images_by_resource_group(self, resource_group=None, free_images=None): + """ + Args: + resource_group (str): Name of the resource group + free_images (bool): Whether to collect image which do not have any resource(VM) linked to it + """ + resource_group = resource_group or self.resource_group + image_list = list( + self.resource_client.resources.list( + filter=f"resourceType eq 'Microsoft.Compute/images' and resourceGroup eq '{resource_group}'" + ) + ) + + if not free_images: + return image_list + + vm_list = self.list_vms(resource_group=resource_group) + if not vm_list: + return image_list + + images_used_by_vm = [] + for vm_name in vm_list: + images_used_by_vm.append( + self.compute_client.virtual_machines.get( + resource_group_name=resource_group, + vm_name=vm_name + ).storage_profile.image_reference.id + ) + + images_with_no_resources = [] + for image in image_list: + if image.id not in images_used_by_vm: + images_with_no_resources.append(image) + + return images_with_no_resources + def list_all_image_names(self): blob_image_names = [item.name for item in self.find_templates()] 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): result) return results + def delete_compute_image_using_name(self, resource_group=None, image_list=None): + """ + Delete compute images using name + + :resource_group: (str) Name of the resource group. "FooBar" + :image_list: (list) List of images. ["imagename1", "imagename2", "imagename3"] + """ + result = [] + resource_group = resource_group or self.resource_group + for image in image_list: + self.logger.info("Deleting '%s' from '%s'", image, resource_group) + response = self.compute_client.images.delete(resource_group_name=resource_group, image_name=image) + result.append((image, response)) + return result + def list_stack_resources(self, stack_name, resource_group=None): self.logger.info("Checking Stack %s resources ", stack_name) # todo: weird implementation to refactor this method later