2323 resources as compute_resources ,
2424)
2525from fix_plugin_azure .resource .containerservice import resources as aks_resources
26+ from fix_plugin_azure .resource .cosmosdb import (
27+ AzureCosmosDBLocation ,
28+ resources as cosmosdb_resources ,
29+ )
2630from fix_plugin_azure .resource .keyvault import resources as keyvault_resources
31+ from fix_plugin_azure .resource .machinelearning import (
32+ AzureMachineLearningUsage ,
33+ AzureMachineLearningVirtualMachineSize ,
34+ resources as ml_resources ,
35+ )
2736from fix_plugin_azure .resource .microsoft_graph import (
2837 MicrosoftGraphOrganization ,
2938 resources as graph_resources ,
4352)
4453from fix_plugin_azure .resource .security import resources as security_resources
4554from fix_plugin_azure .resource .sql_server import resources as sql_resources
46- from fix_plugin_azure .resource .cosmosdb import (
47- AzureCosmosDBLocation ,
48- resources as cosmosdb_resources ,
49- )
5055from fix_plugin_azure .resource .storage import AzureStorageAccountUsage , AzureStorageSku , resources as storage_resources
5156from fix_plugin_azure .resource .web import resources as web_resources
52- from fix_plugin_azure .resource .machinelearning import (
53- AzureMachineLearningUsage ,
54- AzureMachineLearningVirtualMachineSize ,
55- resources as ml_resources ,
56- )
5757from fixlib .baseresources import Cloud , GraphRoot , BaseAccount , BaseRegion
5858from fixlib .core .actions import CoreFeedback , ErrorAccumulator
5959from fixlib .graph import Graph
@@ -100,6 +100,7 @@ def __init__(
100100 core_feedback : CoreFeedback ,
101101 task_data : Optional [Json ] = None ,
102102 max_resources_per_account : Optional [int ] = None ,
103+ filter_unused_resources : bool = True ,
103104 ):
104105 self .config = config
105106 self .cloud = cloud
@@ -108,6 +109,7 @@ def __init__(
108109 self .core_feedback = core_feedback
109110 self .graph = Graph (root = account , max_nodes = max_resources_per_account )
110111 self .task_data = task_data
112+ self .filter_unused_resources = filter_unused_resources
111113
112114 def collect (self ) -> None :
113115 with ThreadPoolExecutor (
@@ -165,13 +167,14 @@ def get_last_run() -> Optional[datetime]:
165167 queue .wait_for_submitted_work ()
166168
167169 # post-process nodes
168- self .remove_unused ()
170+ if self .filter_unused_resources :
171+ self .remove_unused (builder )
169172 for node , data in list (self .graph .nodes (data = True )):
170173 if isinstance (node , MicrosoftResource ):
171174 node .after_collect (builder , data .get ("source" , {}))
172175
173176 # delete unnecessary nodes after all work is completed
174- self .after_collect ()
177+ self .after_collect (builder )
175178 # report all accumulated errors
176179 error_accumulator .report_all (self .core_feedback )
177180 self .core_feedback .progress_done (self .account .id , 1 , 1 , context = [self .cloud .id ])
@@ -205,10 +208,10 @@ def collect_with(self, builder: GraphBuilder, locations: Dict[str, BaseRegion])
205208 def locations (self , builder : GraphBuilder ) -> Dict [str , BaseRegion ]:
206209 pass
207210
208- def remove_unused (self ) -> None :
211+ def remove_unused (self , builder : GraphBuilder ) -> None :
209212 pass
210213
211- def after_collect (self ) -> None :
214+ def after_collect (self , builder : GraphBuilder ) -> None :
212215 pass
213216
214217
@@ -234,10 +237,10 @@ def collect_with(self, builder: GraphBuilder, locations: Dict[str, BaseRegion])
234237 self .collect_resource_list (location .safe_name , builder .with_location (location ), regional_resources )
235238 processed_locations .add (location .safe_name )
236239
237- def remove_unused (self ) -> None :
240+ def remove_unused (self , builder : GraphBuilder ) -> None :
238241 remove_nodes = []
239242
240- def rm_nodes (cls , ignore_kinds : Optional [Type [Any ]] = None , check_pred : bool = True ) -> None : # type: ignore
243+ def rm_leaf_nodes (cls : Any , ignore_kinds : Optional [Type [Any ]] = None , check_pred : bool = True ) -> None :
241244 for node in self .graph .nodes :
242245 if not isinstance (node , cls ):
243246 continue
@@ -263,19 +266,20 @@ def remove_usage_zero_value() -> None:
263266 remove_nodes .append (node )
264267 self ._delete_nodes (remove_nodes )
265268
266- rm_nodes (AzureComputeVirtualMachineSize , AzureLocation )
267- rm_nodes (AzureNetworkExpressRoutePortsLocation , AzureSubscription )
268- rm_nodes (AzureNetworkVirtualApplianceSku , AzureSubscription )
269- rm_nodes (AzureComputeDiskType , AzureSubscription )
270- rm_nodes (AzureMachineLearningVirtualMachineSize , AzureLocation )
271- rm_nodes (AzureStorageSku , AzureLocation )
272- rm_nodes (AzureMysqlServerType , AzureSubscription )
273- rm_nodes (AzurePostgresqlServerType , AzureSubscription )
274- rm_nodes (AzureCosmosDBLocation , AzureLocation , check_pred = False )
275- rm_nodes (AzureLocation , check_pred = False )
269+ rm_leaf_nodes (AzureComputeVirtualMachineSize , AzureLocation )
270+ rm_leaf_nodes (AzureNetworkExpressRoutePortsLocation , AzureSubscription )
271+ rm_leaf_nodes (AzureNetworkVirtualApplianceSku , AzureSubscription )
272+ rm_leaf_nodes (AzureComputeDiskType , AzureSubscription )
273+ rm_leaf_nodes (AzureMachineLearningVirtualMachineSize , AzureLocation )
274+ rm_leaf_nodes (AzureStorageSku , AzureLocation )
275+ rm_leaf_nodes (AzureMysqlServerType , AzureSubscription )
276+ rm_leaf_nodes (AzurePostgresqlServerType , AzureSubscription )
277+ rm_leaf_nodes (AzureCosmosDBLocation , AzureLocation , check_pred = False )
278+ rm_leaf_nodes (AzureLocation , check_pred = False )
276279 remove_usage_zero_value ()
280+ self .graph .remove_recursively (builder .nodes (AzureLocation , lambda r : r .region_in_use is False ))
277281
278- def after_collect (self ) -> None :
282+ def after_collect (self , builder : GraphBuilder ) -> None :
279283 # Filter unnecessary nodes such as AzureComputeDiskTypePricing
280284 nodes_to_remove = []
281285 node_types = (AzureComputeDiskTypePricing ,)
0 commit comments