Script File to Delete Resources
You must create a script file to remove the autoscaling resources before you destroy the stack in Oracle WebLogic Server for OCI.
You can copy the following scripts to the script file, remove_resources.py
file in Cloud Shell.
""" # # Copyright (c) 2021, 2022, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import os import sys import oci from oci.events import models as event_models from oci.functions import models as fn_models from oci.monitoring import models as monitoring_models from oci.artifacts import models as artifacts_models from oci.ons import models as ons_models from oci import pagination import argparse import textwrap REGION = '' def get_config(): if REGION != '': return {"region": REGION} return {} """ Lists and deletes the resources like instances, policies, volumes, VCN related resources, logs and tags etc.. """ class CleanUpResources: def __init__(self, service_name_prefix): self.service_name_prefix = service_name_prefix # delegate token should be present at /etc/oci/delegation_token in cloud shell if os.path.exists('/etc/oci/delegation_token'): with open('/etc/oci/delegation_token', 'r') as file: delegation_token = file.read() self.signer = oci.auth.signers.InstancePrincipalsDelegationTokenSigner(delegation_token=delegation_token) else: print("ERROR: In the Cloud shell the delegation token does not exist at location /etc/oci/delegation_token." "Run the script from the Cloud shell, where you need to delete the resources.") sys.exit(1) self.vcn_client = oci.core.VirtualNetworkClient(config=get_config(), signer=self.signer) self.virtual_network_composite_operations = oci.core.VirtualNetworkClientCompositeOperations(self.vcn_client) self.log_client = oci.logging.LoggingManagementClient(config=get_config(), signer=self.signer) self.log_composite_operations = oci.logging.LoggingManagementClientCompositeOperations(self.log_client) self.identity_client = oci.identity.IdentityClient(config={}, signer=self.signer) self.identity_client_composite_operations = oci.identity.IdentityClientCompositeOperations(self.identity_client) self.events_client = oci.events.EventsClient(config=get_config(), signer=self.signer) self.events_client_composite_operations = oci.events.EventsClientCompositeOperations(self.events_client) self.fn_client = oci.functions.FunctionsManagementClient(config=get_config(), signer=self.signer) self.fn_composite_operations = oci.functions.FunctionsManagementClientCompositeOperations(client=self.fn_client) self.monitoring_client = oci.monitoring.MonitoringClient(config=get_config(), signer=self.signer) self.monitoring_composite_operations = oci.monitoring.MonitoringClientCompositeOperations( client=self.monitoring_client) self.artifacts_client = oci.artifacts.ArtifactsClient(config=get_config(), signer=self.signer) self.artifacts_composite_operations = oci.artifacts.ArtifactsClientCompositeOperations( client=self.artifacts_client) self.ons_control_plane_client = oci.ons.NotificationControlPlaneClient(config=get_config(), signer=self.signer) # Lists all the resources based on the service name prefix def list_all_resources(self): search_client = oci.resource_search.ResourceSearchClient(config=get_config(), signer=self.signer) running_resources = ["RUNNING", "Running", "AVAILABLE", "STOPPED", "Stopped", "ACTIVE", "CREATED", "INACTIVE"] resource_not_required = ["PrivateIp", "Vnic"] # https://docs.oracle.com/en-us/iaas/Content/Search/Concepts/queryoverview.htm#resourcetypes structured_search = oci.resource_search.models.StructuredSearchDetails( query="query all resources where displayname =~ '{}'".format(self.service_name_prefix), type='Structured', matching_context_type=oci.resource_search.models.SearchDetails.MATCHING_CONTEXT_TYPE_NONE) resources = search_client.search_resources(structured_search) resources_details = [] no_of_resources = 0 # Tags and default route table doesn't start with service prefix tagname_resource = "wlsoci-" + self.service_name_prefix default_rt = "Default Route Table for " + self.service_name_prefix # Logs and unified agent config resources use service_prefix with underscore instead of hyphen log_resource = self.service_name_prefix[:-1] + "_" print( "Resource Name Resource Type Resource Lifecycle State OCID DOC") print( "=================================================================================================================================================") for resource in resources.data.items: resource_name = resource.display_name if (resource_name.startswith( self.service_name_prefix) or tagname_resource in resource_name or default_rt in resource_name or log_resource in resource_name) and ( resource.lifecycle_state in running_resources) and ( resource.resource_type not in resource_not_required): resources_details.append(resource) no_of_resources = no_of_resources + 1 print("{} {} {} {} {}".format(resource.display_name, resource.resource_type, resource.lifecycle_state, resource.identifier, resource.time_created)) print( "================================================================================================================================================") print("Total number of resources {}".format(len(resources_details))) return resources_details # Removes all resources based on the service name prefix def cleanup_resources(self, delete_list): print("Deleting the resources") self.delete_all_autoscaling_resources(delete_list) self.delete_policies(delete_list) self.delete_instance(delete_list) self.delete_block_volumes(delete_list) self.delete_load_balancer(delete_list) self.delete_subnet(delete_list) self.delete_sec_list(delete_list) self.delete_route_table(delete_list) self.delete_dhcp_options(delete_list) self.delete_internet_gateway(delete_list) self.delete_service_gateway(delete_list) self.delete_local_peering_gateway(delete_list) self.delete_nat_gateway(delete_list) self.delete_vcn_resources(delete_list) self.delete_unified_agent_configuration(delete_list) self.delete_log(delete_list) self.delete_log_group(delete_list) self.delete_mount_targets(delete_list) self.delete_fss(delete_list) self.delete_tag_namespace(delete_list) self.delete_boot_volumes(delete_list) # Delete Policies def delete_policies(self, delete_list): for resource in delete_list: if resource.resource_type == "Policy": policy_ocid = resource.identifier print("Deleting policy: {0}, with ocid: {1}".format(resource.display_name, policy_ocid)) try: self.identity_client_composite_operations.delete_policy_and_wait_for_state( policy_ocid, wait_for_states=[oci.identity.models.Policy.LIFECYCLE_STATE_DELETED]) print("Deleted policy successfully!") except Exception as e: print("Error while deleting the policy {0}, policy id {1}, Error message {2}".format( resource.display_name, policy_ocid, str(e))) # Delete Dynamic Group def delete_dynamic_group(self): tenancy = os.environ['OCI_TENANCY'] dynamic_group_list = self.identity_client.list_dynamic_groups(tenancy).data for d_group in dynamic_group_list: if self.service_name_prefix in d_group.name: print("Deleting the dynamic group: {0}, with ocid: {1}".format(d_group.name, d_group.id)) try: self.identity_client_composite_operations.delete_dynamic_group_and_wait_for_state( d_group.id, wait_for_states=[oci.identity.models.DynamicGroup.LIFECYCLE_STATE_DELETED]) print("Deleted the dynamic group successfully!") except Exception as e: print("Error while deleting the dynamic group name {}, ocid {}, Error message {}".format( d_group.name, d_group.id, str(e))) # Delete Block Volumes def delete_block_volumes(self, delete_list): bv_client = oci.core.BlockstorageClient(config=get_config(), signer=self.signer) bv_composite_operations = oci.core.BlockstorageClientCompositeOperations(bv_client) for resource in delete_list: if resource.resource_type == "Volume": bv_ocid = resource.identifier try: print( "Deleting the block volume: {0}, with ocid {1}".format(resource.display_name, bv_ocid)) bv_composite_operations.delete_volume_and_wait_for_state( bv_ocid, wait_for_states=[oci.core.models.Volume.LIFECYCLE_STATE_TERMINATED]) print("Deleted the block volume successfully!") except Exception as e: print( "Error while deleting the block volume {0}, ocid {1}, Error message {2}".format( resource.display_name, bv_ocid, str(e))) # Delete all compute instances def delete_instance(self, delete_list): compute_client = oci.core.ComputeClient(config=get_config(), signer=self.signer) compute_composite_operations = oci.core.ComputeClientCompositeOperations(compute_client) for resource in delete_list: if resource.resource_type == "Instance": instance_ocid = resource.identifier instance_name = resource.display_name print("Deleting the compute instance: {0}, with ocid {1}".format(instance_name, instance_ocid)) try: compute_composite_operations.terminate_instance_and_wait_for_state( instance_ocid, wait_for_states=[oci.core.models.Instance.LIFECYCLE_STATE_TERMINATED]) print("Deleted the compute instance successfully!") except Exception as e: print( "Error while deleting the instance {0}, ocid {1}, Error message {2}".format( instance_name, instance_ocid, str(e))) # Delete all Subnets in the VCN def delete_subnet(self, delete_list): for resource in delete_list: if resource.resource_type == "Subnet": subnet_ocid = resource.identifier print( "Deleting subnet: {0}, with ocid {1}".format(resource.display_name, resource.identifier)) try: self.virtual_network_composite_operations.delete_subnet_and_wait_for_state( subnet_ocid, wait_for_states=[oci.core.models.Subnet.LIFECYCLE_STATE_TERMINATED]) print("Deleted subnet successfully!") except Exception as e: print( "Error while deleting the subnet {0}, ocid {1}, Error message {2}".format(resource.display_name, subnet_ocid, str(e))) # Delete Security lists def delete_sec_list(self, delete_list): for resource in delete_list: if resource.resource_type == "SecurityList": sec_list_name = resource.display_name sec_list_ocid = resource.identifier if not ("Default" in sec_list_name): print( "Deleting the security list: {0}, with ocid {1}".format(resource.display_name, resource.identifier)) try: self.virtual_network_composite_operations.delete_security_list_and_wait_for_state( sec_list_ocid, wait_for_states=[oci.core.models.SecurityList.LIFECYCLE_STATE_TERMINATED]) print("Deleted the security list successfully!") except Exception as e: print( "Error while deleting the security list {0}, ocid {1}, Error message {2}".format( resource.display_name, sec_list_ocid, str(e))) # Delete Load balancers def delete_load_balancer(self, delete_list): lb_client = oci.load_balancer.LoadBalancerClient(config=get_config(), signer=self.signer) lb_composite_operations = oci.load_balancer.LoadBalancerClientCompositeOperations(lb_client) for resource in delete_list: if resource.resource_type == "LoadBalancer": lb_name = resource.display_name lb_ocid = resource.identifier print("Deleting Load balancer {0} with ocid {1}".format(lb_name, lb_ocid)) try: lb_composite_operations.delete_load_balancer_and_wait_for_state( lb_ocid, wait_for_states=[oci.load_balancer.models.WorkRequest.LIFECYCLE_STATE_SUCCEEDED]) print("Load balancer deleted successfully!") except Exception as e: print( "Error while deleting the loadbalancer {0}, ocid {1}, Error message {2}".format( lb_name, lb_ocid, str(e))) # Delete Route tables def delete_route_table(self, delete_list): for resource in delete_list: if resource.resource_type == "RouteTable": route_table_name = resource.display_name route_table_ocid = resource.identifier # Removing the route rules from the tables rt_details = oci.core.models.UpdateRouteTableDetails() rt_details.route_rules = [] self.virtual_network_composite_operations.update_route_table_and_wait_for_state( route_table_ocid, rt_details, wait_for_states=[oci.core.models.RouteTable.LIFECYCLE_STATE_AVAILABLE]) self.vcn_client.update_route_table(route_table_ocid, rt_details) # Default route table can't be deleted from VCN if not ("Default" in route_table_name): print( "Deleting the route table: {0}, with ocid {1}".format(resource.display_name, resource.identifier)) try: self.virtual_network_composite_operations.delete_route_table_and_wait_for_state( route_table_ocid, wait_for_states=[oci.core.models.RouteTable.LIFECYCLE_STATE_TERMINATED]) print("Deleted the route table successfully!") except Exception as e: print("Error while deleting the route table {0}, ocid {1}, Error message {2}".format( resource.display_name, route_table_ocid, str(e))) if "associated with Subnet" in str(e): try: self.delete_subnet_route_table_association(route_table_ocid) # After removing the association again retrying the removal of route table # This is for Db subnet route table self.virtual_network_composite_operations.delete_route_table_and_wait_for_state( route_table_ocid, wait_for_states=[oci.core.models.RouteTable.LIFECYCLE_STATE_TERMINATED]) print("Deleted the route table successfully!") except Exception as e: print("Error while deleting the route table after removing the association " "{0}, ocid {1}, Error message {2}".format (resource.display_name, route_table_ocid, str(e))) # Delete Subnet and route table association to remove route table def delete_subnet_route_table_association(self, route_table_ocid): default_rt_id_in_vcn = "" print("Route table is associated with a subnet. Removing the association between the subnet and route table") rt_res = self.vcn_client.get_route_table(route_table_ocid).data vcn_id = rt_res.vcn_id compartment_id = rt_res.compartment_id list_route_rables_vcn = self.vcn_client.list_route_tables(compartment_id=compartment_id, vcn_id=vcn_id).data for rt in list_route_rables_vcn: if "Default Route" in rt.display_name: default_rt_id_in_vcn = rt.id list_subnets = self.vcn_client.list_subnets(compartment_id=compartment_id, vcn_id=vcn_id).data for subnet in list_subnets: subnet_ocid = subnet.id if subnet.route_table_id == route_table_ocid: subnet_details = oci.core.models.UpdateSubnetDetails() subnet_details.route_table_id = default_rt_id_in_vcn try: self.virtual_network_composite_operations.update_subnet_and_wait_for_state( subnet_ocid, subnet_details, wait_for_states=[oci.core.models.Subnet.LIFECYCLE_STATE_AVAILABLE]) print("Removed the association between the subnet and route table.") except Exception as e: print("Error while removing the association between the subnet and route table {}".format(str(e))) # Delete DHCP Options def delete_dhcp_options(self, delete_list): for resource in delete_list: if resource.resource_type == "DHCPOptions": dhcp_name = resource.display_name dhcp_ocid = resource.identifier if not ("Default" in dhcp_name): print( "Deleting the DHCP options: {0}, with ocid {1}".format(resource.display_name, dhcp_ocid)) try: self.virtual_network_composite_operations.delete_dhcp_options_and_wait_for_state(dhcp_ocid, wait_for_states=[ oci.core.models.DhcpOptions.LIFECYCLE_STATE_TERMINATED]) print("Deleted the DHCP options successfully!") except Exception as e: print( "Error while deleting the DHCP options {0}, ocid {1}, Error message {2} ".format( resource.display_name, dhcp_ocid, str(e))) # Delete Internet Gateway def delete_internet_gateway(self, delete_list): for resource in delete_list: if resource.resource_type == "InternetGateway": ig_ocid = resource.identifier print("Deleting the Internet Gateway: {0}, with ocid {1}".format(resource.display_name, ig_ocid)) try: self.virtual_network_composite_operations.delete_internet_gateway_and_wait_for_state(ig_ocid, wait_for_states=[ oci.core.models.InternetGateway.LIFECYCLE_STATE_TERMINATED]) print("Deleted the Internet Gateway successfully!") except Exception as e: print("Error while deleting the Internet Gateway {0}, ocid {1}, Error message {2}".format( resource.display_name, ig_ocid, str(e))) # Delete Service Gateway def delete_service_gateway(self, delete_list): for resource in delete_list: if resource.resource_type == "ServiceGateway": svc_gateway_ocid = resource.identifier print("Deleting the service gateway: {0}, with ocid {1}".format(resource.display_name, svc_gateway_ocid)) try: self.virtual_network_composite_operations.delete_service_gateway_and_wait_for_state( svc_gateway_ocid, wait_for_states=[oci.core.models.ServiceGateway.LIFECYCLE_STATE_TERMINATED]) print("Deleted the service gateway successfully!") except Exception as e: print("Error while deleting the service gateway {0}, ocid {1}, Error message {2}".format( resource.display_name, svc_gateway_ocid, str(e))) # Delete Local Peering Gateway def delete_local_peering_gateway(self, delete_list): for resource in delete_list: if resource.resource_type == "LocalPeeringGateway": lpg_ocid = resource.identifier print("Deleting the local peering gateway: {0}, with ocid {1}".format(resource.display_name, lpg_ocid)) try: self.virtual_network_composite_operations.delete_local_peering_gateway_and_wait_for_state( lpg_ocid, wait_for_states=[oci.core.models.LocalPeeringGateway.LIFECYCLE_STATE_TERMINATED]) print("Deleted local peering gateway successfully!") except Exception as e: print("Error while deleting the local peering gateway {0}, ocid {1}, Error message {2}".format( resource.display_name, lpg_ocid, str(e))) # Delete Nat Gateway def delete_nat_gateway(self, delete_list): for resource in delete_list: if resource.resource_type == "NatGateway": nat_ocid = resource.identifier print("Deleting the NAT gateway: {0}, with ocid {1}".format(resource.display_name, nat_ocid)) try: self.virtual_network_composite_operations.delete_nat_gateway_and_wait_for_state( nat_gateway_id=nat_ocid, wait_for_states=[oci.core.models.NatGateway.LIFECYCLE_STATE_TERMINATED] ) print("Deleted the NAT gateway successfully!") except Exception as e: print("Error while deleting the NAT gateway {0}, ocid {1}, Error message {2}".format( resource.display_name, nat_ocid, str(e))) # Delete VCN def delete_vcn_resources(self, delete_list): for resource in delete_list: if resource.resource_type == "Vcn": vcn_ocid = resource.identifier vcn_name = resource.display_name print("Deleting the VCN: {0}, with ocid {1}".format(vcn_name, vcn_ocid)) try: self.virtual_network_composite_operations.delete_vcn_and_wait_for_state(vcn_ocid, oci.core.models.Vcn.LIFECYCLE_STATE_TERMINATED) print("Deleted the VCN successfully!") except Exception as e: print("Error while deleting the VCN {0}, VCN id {1}, Error message {2}".format(vcn_name, vcn_ocid, str(e))) # Deleting the Unified Agent Configuration def delete_unified_agent_configuration(self, delete_list): for resource in delete_list: if resource.resource_type == "UnifiedAgentConfiguration": uac_ocid = resource.identifier print("Deleting the unified agent configuration: {}, with ocid {}".format(resource.display_name, uac_ocid)) try: self.log_composite_operations.delete_unified_agent_configuration_and_wait_for_state( uac_ocid, wait_for_states=[oci.logging.models.WorkRequest.STATUS_SUCCEEDED]) print("Deleted the unified agent configuration successfully!") except Exception as e: print( "Error while deleting the unified agent configuration name {0}, ocid {1} - Error message {2}".format( resource.display_name, uac_ocid, str(e))) # Delete logs in a Log groups def delete_log(self, delete_list, name=None): """ Delete log resources for the service. :param delete_list: :param name: if name is set, only delete the named log resource, otherwise delete all log resources in the delete_list :return: """ for resource in delete_list: if resource.resource_type == "LogGroup": log_group_ocid = resource.identifier list_logs = self.log_client.list_logs(log_group_ocid).data for log in list_logs: to_delete = True if name is not None: if log.display_name != name: to_delete = False if to_delete: print("Deleting the log name {0}, with log ocid {1}".format(log.display_name, log.id)) try: self.log_composite_operations.delete_log_and_wait_for_state( log_group_ocid, log.id, wait_for_states=[oci.logging.models.WorkRequest.STATUS_SUCCEEDED]) print("Deleted the log {} successfully!".format(log.display_name)) except Exception as e: print("Error while deleting the log name {}, log ocid {}, Error message {}".format( log.display_name, log.id, str(e))) # Delete Log Group def delete_log_group(self, delete_list): for resource in delete_list: if resource.resource_type == "LogGroup": log_group_ocid = resource.identifier print("Deleting the log group: {0}, with ocid {1}".format(resource.display_name, log_group_ocid)) try: self.log_composite_operations.delete_log_group_and_wait_for_state( log_group_ocid, wait_for_states=[oci.logging.models.WorkRequest.STATUS_SUCCEEDED]) print("Deleted log group successfully!") except Exception as e: print("Error while deleting the log group {0}, ocid {1}, Error message {2}".format( resource.display_name, log_group_ocid, str(e))) # Delete the Mount targets def delete_mount_targets(self, delete_list): mt_client = oci.file_storage.FileStorageClient(config=get_config(), signer=self.signer) mt_composite_operations = oci.file_storage.FileStorageClientCompositeOperations(mt_client) for resource in delete_list: if resource.resource_type == "MountTarget": mt_ocid = resource.identifier print("Deleting the mount target {0}, with ocid {1}".format(resource.display_name, mt_ocid)) try: mt_composite_operations.delete_mount_target_and_wait_for_state( mt_ocid, wait_for_states=[oci.file_storage.models.MountTarget.LIFECYCLE_STATE_DELETED]) print("Deleted the mount target successfully!") except Exception as e: print("Error while deleting the mount target {0}, ocid {1}, Error message {2}".format( resource.display_name, mt_ocid, str(e))) # Delete FSS def delete_fss(self, delete_list): fss_client = oci.file_storage.FileStorageClient(config=get_config(), signer=self.signer) fss_composite_operations = oci.file_storage.FileStorageClientCompositeOperations(fss_client) for resource in delete_list: if resource.resource_type == "FileSystem": fss_ocid = resource.identifier try: # Get the list of exports to delete list_exports = fss_client.list_exports(file_system_id=fss_ocid).data for export in list_exports: export_ocid = export.id print("Deleting the export id {}".format(export_ocid)) fss_composite_operations.delete_export_and_wait_for_state( export_id=export_ocid, wait_for_states=[oci.file_storage.models.Export.LIFECYCLE_STATE_DELETED]) print("Deleted the exports successfully!") except Exception as e: print("Error while deleting the export, Error message {}".format(str(e))) try: print("Deleting the FSS: {0}, with ocid {1}".format(resource.display_name, fss_ocid)) fss_composite_operations.delete_file_system_and_wait_for_state( fss_ocid, wait_for_states=[oci.file_storage.models.FileSystem.LIFECYCLE_STATE_DELETED]) print("Deleted the FSS successfully!") except Exception as e: print("Error while deleting the FSS name {0}, ocid {1}, Error message {2}".format( resource.display_name, fss_ocid, str(e))) # Deletion of TagNamespace def delete_tag_namespace(self, delete_list): for resource in delete_list: if resource.resource_type == "TagNamespace": tag_ns_name = resource.display_name tag_ns_ocid = resource.identifier print("Deleting the tag namespace {0}, with ocid {1}".format(tag_ns_name, tag_ns_ocid)) try: # Retiring the tag namespace tag_status = self.identity_client.get_tag_namespace(tag_namespace_id=tag_ns_ocid).data print("Tag namespace: {} and isRetired: {}".format(tag_ns_name, tag_status.is_retired)) if not tag_status.is_retired: print("Retiring the tag namespace {}".format(tag_ns_name)) tag_ns_details = oci.identity.models.UpdateTagNamespaceDetails() tag_ns_details.is_retired = True self.identity_client_composite_operations.update_tag_namespace_and_wait_for_state( tag_namespace_id=tag_ns_ocid, update_tag_namespace_details=tag_ns_details, wait_for_states=[ oci.identity.models.TagNamespace.LIFECYCLE_STATE_INACTIVE]) tag_status = self.identity_client.get_tag_namespace(tag_namespace_id=tag_ns_ocid).data print("Tag status before deleting {}".format(tag_status.is_retired)) print("Deleting the tag namespace {}".format(tag_ns_name)) # Tag namespace deletion is taking too long time. So not waiting for the completion. self.identity_client.cascade_delete_tag_namespace(tag_namespace_id=tag_ns_ocid) print("Asynchronous deletion of Tag namespaces is enabled." "Check the deletion status manually. Tag name {0} with ocid {1}".format(tag_ns_name, tag_ns_ocid)) except Exception as e: print("Error while deleting the Tag namespace {0}, ocid {1}, Error message {2} " .format(tag_ns_name, tag_ns_ocid, str(e))) # Deleting the unattached boot volumes def delete_boot_volumes(self, delete_list): bv_client = oci.core.BlockstorageClient(config=get_config(), signer=self.signer) bv_composite_operations = oci.core.BlockstorageClientCompositeOperations(bv_client) for resource in delete_list: if resource.resource_type == "BootVolume" and resource.lifecycle_state == "AVAILABLE": bv_ocid = resource.identifier bv_name = resource.display_name print("Deleting the boot volume {}, with ocid {} ".format(bv_name, bv_ocid)) try: bv_composite_operations.delete_boot_volume_and_wait_for_state( boot_volume_id=bv_ocid, wait_for_states=[oci.core.models.BootVolume.LIFECYCLE_STATE_TERMINATED]) print("Deleted the boot volume successfully!") except Exception as e: print("Error while deleting the boot volume name {}, ocid {}, Error message {}".format(bv_name, bv_ocid, str(e))) def delete_functions(self, delete_list): """ Deletes OCI functions and function application for the service. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "FunctionsApplication": fn_app_id = resource.identifier fn_app_name = resource.display_name try: result = pagination.list_call_get_all_results( self.fn_client.list_functions, fn_app_id ) # Delete all functions within function application print("Deleting functions within function application {}".format(fn_app_name)) for fn in result.data: self.fn_composite_operations.delete_function_and_wait_for_state( function_id=fn.id, wait_for_states=[fn_models.Function.LIFECYCLE_STATE_DELETED] ) print("Deleted the function {} successfully!".format(fn.display_name)) except Exception as e: print("Error while deleting the functions within application id {}, Error message {}".format(fn_app_id, str(e))) def delete_functions_app(self, delete_list): """ Deletes function application for the service. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "FunctionsApplication": fn_app_id = resource.identifier try: # Delete the function application self.fn_composite_operations.delete_application_and_wait_for_state( application_id = fn_app_id, wait_for_states = [fn_models.Application.LIFECYCLE_STATE_DELETED] ) except Exception as e: print("Error while deleting the Functions application with id {}, Error message {}".format(fn_app_id, str(e))) def delete_event_rules(self, delete_list): """ Deletes the event rules for the service. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "EventRule": event_rule_id = resource.identifier event_rule_name = resource.display_name try: print("Deleting event rule {}".format(event_rule_name)) self.events_client_composite_operations.delete_rule_and_wait_for_state( rule_id=event_rule_id, wait_for_states=[event_models.Rule.LIFECYCLE_STATE_DELETED] ) print("Deleted the event rule {} successfully!".format(event_rule_name)) except Exception as e: print("Error while deleting the event rule id {}, Error message {}".format(event_rule_id, str(e))) def delete_autoscaling_logs(self, delete_list): """ Deletes the event rule invoke log for the service. :param delete_list: :return: """ # trim the extra hyphen char if present from the service_name_prefix service_name = self.service_name_prefix[:-1] if self.service_name_prefix[ -1] == '-' else self.service_name_prefix self.delete_log(delete_list, name="{0}_event_rule_invoke_log".format(service_name)) self.delete_log(delete_list, name="{0}_autoscaling_log".format(service_name)) def predestroy_autoscaling_resources(self, delete_list): """ Deletes pre-destroy resources associated with autoscaling. This is to be invoked when user needs to delete only the resources created via API during provisioning outside of terraform preferably prior to running terraform destroy action. :param delete_list: :return: """ print("Executing pre-destroy of resources created for autoscaling feature") self.delete_functions(delete_list) self.delete_event_rules(delete_list) self.delete_autoscaling_logs(delete_list) def delete_alarms(self, delete_list): """ Delete all alarms created for autoscaling for the service. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "Alarm": alarm_id = resource.identifier alarm_name = resource.display_name try: print("Deleting alarm {}".format(alarm_name)) self.monitoring_composite_operations.delete_alarm_and_wait_for_state( alarm_id=alarm_id, wait_for_states=[monitoring_models.Alarm.LIFECYCLE_STATE_DELETED] ) print("Deleted the alarm {} successfully!".format(alarm_name)) except Exception as e: print("Error while deleting the alarm id {}, Error message {}".format(alarm_id, str(e))) def delete_container_repos(self, delete_list): """ Deletes container repos created for autoscaling for the service. Deleting the repos also deletes the container images in those repos. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "ContainerRepo": repo_id = resource.identifier repo_name = resource.display_name try: print("Deleting container repo {}".format(repo_name)) self.artifacts_composite_operations.delete_container_repository_and_wait_for_state( repository_id=repo_id, wait_for_states=[artifacts_models.ContainerRepository.LIFECYCLE_STATE_DELETED] ) print("Deleted the container repo {} successfully!".format(repo_name)) except Exception as e: print("Error while deleting the container repo id {}, Error message {}".format(repo_id, str(e))) def delete_notification_topics(self, delete_list): """ Deletes the notification topics created for autoscaling for the service. Deleting the notification topics also deletes the associated subscriptions for those topics. :param delete_list: :return: """ for resource in delete_list: if resource.resource_type == "OnsTopic": topic_id = resource.identifier topic_name = resource.display_name try: print("Deleting notification topic {}".format(topic_name)) self.ons_control_plane_client.delete_topic( topic_id=topic_id ) oci.wait_until(self.ons_control_plane_client, self.ons_control_plane_client.get_topic(topic_id), 'lifecycle_state', ons_models.NotificationTopic.LIFECYCLE_STATE_DELETING) print("Deleted the notification topic {} successfully!".format(topic_name)) except Exception as e: print( "Error while deleting the notification topic id {}, Error message {}".format(topic_id, str(e))) def delete_all_autoscaling_resources(self, delete_list): """ Deletes all resources created when autoscaling feature is enabled. :param delete_list: :return: """ self.predestroy_autoscaling_resources(delete_list) self.delete_container_repos(delete_list) self.delete_alarms(delete_list) self.delete_notification_topics(delete_list) self.delete_functions_app(delete_list) def main(): parser = argparse.ArgumentParser(description=textwrap.dedent(''' This script is used for: - pre-destroying autoscaling resources (prior to running destroy job on the stack from OCI Console) - delete all infra resources created for the stack (identified by its service name prefix) '''), formatter_class=argparse.RawDescriptionHelpFormatter) # Required position params parser.add_argument('command', choices=['delete', 'list', 'pre-destroy'], help='Command') parser.add_argument('service_name_prefix', help='Stack service name') # Optional params parser.add_argument('-r', '--region', default='', help='Region other than home region must be specified.') parser.add_argument('-f', '--feature', default='autoscaling', help='Feature to run pre-destroy for.') args = parser.parse_args() command = args.command service_prefix = args.service_name_prefix global REGION REGION = args.region feature = args.feature print("Service prefix name:" + service_prefix) if len(service_prefix) >= 16: service_prefix = service_prefix[0:16] service_prefix = service_prefix + "-" cleanup_util = CleanUpResources(service_prefix) if command == 'list': print("Listing all resources with service prefix name " + service_prefix) cleanup_resources = cleanup_util.list_all_resources() elif command == 'delete': print("Deleting all resources with service prefix name " + service_prefix) cleanup_resources = cleanup_util.list_all_resources() cleanup_util.cleanup_resources(cleanup_resources) cleanup_util.delete_dynamic_group() elif command == 'pre-destroy' and feature == 'autoscaling': print('Deleting pre-destroy autoscaling resources with service prefix name ' + service_prefix) cleanup_resources = cleanup_util.list_all_resources() cleanup_util.predestroy_autoscaling_resources(cleanup_resources) if __name__ == '__main__': main()