Skip to content

Commit 85fbe2d

Browse files
1101-1aquamatthias
andauthored
[azure][feat] Azure adjust names and connections (#2183)
Co-authored-by: Matthias Veit <aquamatthias@users.noreply.github.com>
1 parent 2b99e41 commit 85fbe2d

28 files changed

+938
-799
lines changed

plugins/azure/fix_plugin_azure/azure_client.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ class AzureResourceSpec:
6868
query_parameters: List[str] = []
6969
access_path: Optional[str] = None
7070
expect_array: bool = False
71-
expected_error_codes: List[str] = field(factory=list)
71+
expected_error_codes: Dict[str, Optional[str]] = field(factory=dict)
72+
"""
73+
A dictionary that maps specific error codes (str) to corresponding hints (Optional[str]) to provide additional context or troubleshooting information when an error occurs.
74+
"""
7275

7376
def request(self, client: "MicrosoftResourceManagementClient", **kwargs: Any) -> HttpRequest:
7477
ser = Serializer()
@@ -118,7 +121,10 @@ class RestApiSpec:
118121
parameters: Optional[Dict[str, str]] = None
119122
access_path: Optional[str] = None
120123
expect_array: bool = False
121-
expected_error_codes: List[str] = field(factory=list)
124+
expected_error_codes: Dict[str, Optional[str]] = field(factory=dict)
125+
"""
126+
A dictionary that maps specific error codes (str) to corresponding hints (Optional[str]) to provide additional context or troubleshooting information when an error occurs.
127+
"""
122128

123129
def __attrs_post_init__(self) -> None:
124130
if self.scope == "":
@@ -317,13 +323,15 @@ def _list_with_retry(self, spec: MicrosoftRestSpec, **kwargs: Any) -> Optional[L
317323
return None
318324
except HttpResponseError as e:
319325
if error := e.error:
326+
code = error.code or "Unknown"
320327
if error.code == "NoRegisteredProviderFound":
321328
return None # API not available in this region
322329
elif error.code in spec.expected_error_codes:
330+
if hint := spec.expected_error_codes.get(code):
331+
self.accumulator.add_error(False, code, spec.service, spec.action, str(hint))
323332
return None
324333
elif error.code == "BadRequest" and spec.service == "metric":
325334
raise MetricRequestError from e
326-
code = error.code or "Unknown"
327335
self.accumulator.add_error(False, code, spec.service, spec.action, str(e), self.location)
328336
log.warning(f"[Azure] Client Error: status={e.status_code}, error={e.error}, message={e}, spec={spec}")
329337
return None

plugins/azure/fix_plugin_azure/collector.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
MicrosoftResource,
1818
)
1919
from fix_plugin_azure.resource.compute import (
20-
AzureVirtualMachineSize,
21-
AzureDiskType,
22-
AzureDiskTypePricing,
20+
AzureComputeVirtualMachineSize,
21+
AzureComputeDiskType,
22+
AzureComputeDiskTypePricing,
2323
resources as compute_resources,
2424
)
2525
from fix_plugin_azure.resource.containerservice import resources as aks_resources
@@ -32,7 +32,7 @@
3232
from fix_plugin_azure.resource.monitor import resources as monitor_resources
3333
from fix_plugin_azure.resource.mysql import AzureMysqlServerType, resources as mysql_resources
3434
from fix_plugin_azure.resource.network import (
35-
AzureExpressRoutePortsLocation,
35+
AzureNetworkExpressRoutePortsLocation,
3636
AzureNetworkVirtualApplianceSku,
3737
AzureNetworkUsage,
3838
resources as network_resources,
@@ -256,10 +256,10 @@ def remove_usage_zero_value() -> None:
256256
remove_nodes.append(node)
257257
self._delete_nodes(remove_nodes)
258258

259-
rm_nodes(AzureVirtualMachineSize, AzureLocation)
260-
rm_nodes(AzureExpressRoutePortsLocation, AzureSubscription)
259+
rm_nodes(AzureComputeVirtualMachineSize, AzureLocation)
260+
rm_nodes(AzureNetworkExpressRoutePortsLocation, AzureSubscription)
261261
rm_nodes(AzureNetworkVirtualApplianceSku, AzureSubscription)
262-
rm_nodes(AzureDiskType, AzureSubscription)
262+
rm_nodes(AzureComputeDiskType, AzureSubscription)
263263
rm_nodes(AzureMachineLearningVirtualMachineSize, AzureLocation)
264264
rm_nodes(AzureStorageSku, AzureLocation)
265265
rm_nodes(AzureMysqlServerType, AzureSubscription)
@@ -269,9 +269,9 @@ def remove_usage_zero_value() -> None:
269269
remove_usage_zero_value()
270270

271271
def after_collect(self) -> None:
272-
# Filter unnecessary nodes such as AzureDiskTypePricing
272+
# Filter unnecessary nodes such as AzureComputeDiskTypePricing
273273
nodes_to_remove = []
274-
node_types = (AzureDiskTypePricing,)
274+
node_types = (AzureComputeDiskTypePricing,)
275275

276276
for node in self.graph.nodes:
277277
if not isinstance(node, node_types):

plugins/azure/fix_plugin_azure/resource/authorization.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ class AzurePrincipal:
5959

6060

6161
@define(eq=False, slots=False)
62-
class AzureDenyAssignment(MicrosoftResource):
63-
kind: ClassVar[str] = "azure_deny_assignment"
62+
class AzureAuthorizationDenyAssignment(MicrosoftResource):
63+
kind: ClassVar[str] = "azure_authorization_deny_assignment"
6464
api_spec: ClassVar[AzureResourceSpec] = AzureResourceSpec(
6565
service="authorization",
6666
version="2022-04-01",
@@ -109,8 +109,8 @@ class AzureDenyAssignment(MicrosoftResource):
109109

110110

111111
@define(eq=False, slots=False)
112-
class AzureRoleAssignment(MicrosoftResource):
113-
kind: ClassVar[str] = "azure_role_assignment"
112+
class AzureAuthorizationRoleAssignment(MicrosoftResource):
113+
kind: ClassVar[str] = "azure_authorization_role_assignment"
114114
api_spec: ClassVar[AzureResourceSpec] = AzureResourceSpec(
115115
service="authorization",
116116
version="2022-04-01",
@@ -130,9 +130,16 @@ class AzureRoleAssignment(MicrosoftResource):
130130
"Resource": "azure_resource",
131131
}
132132
reference_kinds: ClassVar[ModelReference] = {
133-
"successors": {"default": ["azure_role_definition", *(p.kind for p in MicrosoftGraphPrincipalTypes)]},
133+
"successors": {
134+
"default": ["azure_authorization_role_definition", *(p.kind for p in MicrosoftGraphPrincipalTypes)]
135+
},
134136
"predecessors": {
135-
"default": ["azure_role_definition", "azure_subscription", "azure_resource_group", "azure_resource"]
137+
"default": [
138+
"azure_authorization_role_definition",
139+
"azure_subscription",
140+
"azure_resource_group",
141+
"azure_resource",
142+
]
136143
},
137144
}
138145
mapping: ClassVar[Dict[str, Bender]] = {
@@ -171,7 +178,7 @@ class AzureRoleAssignment(MicrosoftResource):
171178
def connect_in_graph(self, builder: GraphBuilder, source: Json) -> None:
172179
# role definition
173180
if rid := self.role_definition_id:
174-
builder.add_edge(self, clazz=AzureRoleDefinition, id=rid)
181+
builder.add_edge(self, clazz=AzureAuthorizationRoleDefinition, id=rid)
175182

176183
# scope
177184
if scope := self.scope:
@@ -206,8 +213,8 @@ class AzurePermission:
206213

207214

208215
@define(eq=False, slots=False)
209-
class AzureRoleDefinition(MicrosoftResource, BaseRole):
210-
kind: ClassVar[str] = "azure_role_definition"
216+
class AzureAuthorizationRoleDefinition(MicrosoftResource, BaseRole):
217+
kind: ClassVar[str] = "azure_authorization_role_definition"
211218
api_spec: ClassVar[AzureResourceSpec] = AzureResourceSpec(
212219
service="authorization",
213220
version="2022-04-01",
@@ -242,8 +249,8 @@ class AzureRoleDefinition(MicrosoftResource, BaseRole):
242249

243250

244251
@define(eq=False, slots=False)
245-
class AzureManagementLock(MicrosoftResource):
246-
kind: ClassVar[str] = "azure_management_lock"
252+
class AzureAuthorizationManagementLock(MicrosoftResource):
253+
kind: ClassVar[str] = "azure_authorization_management_lock"
247254
api_spec: ClassVar[AzureResourceSpec] = AzureResourceSpec(
248255
service="resources",
249256
version="2020-05-01",
@@ -275,8 +282,8 @@ def connect_in_graph(self, builder: GraphBuilder, source: Json) -> None:
275282

276283

277284
resources: List[Type[MicrosoftResource]] = [
278-
AzureDenyAssignment,
279-
AzureManagementLock,
280-
AzureRoleAssignment,
281-
AzureRoleDefinition,
285+
AzureAuthorizationDenyAssignment,
286+
AzureAuthorizationManagementLock,
287+
AzureAuthorizationRoleAssignment,
288+
AzureAuthorizationRoleDefinition,
282289
]

plugins/azure/fix_plugin_azure/resource/base.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def collect_resources_in_group() -> None:
376376
self._resource_ids_in_group = [r["id"] for r in graph_builder.client.list(resources_api_spec)]
377377

378378
def collect_network_gateways() -> None:
379-
from fix_plugin_azure.resource.network import AzureVirtualNetworkGateway
379+
from fix_plugin_azure.resource.network import AzureNetworkVirtualNetworkGateway
380380

381381
api_spec = AzureResourceSpec(
382382
service="network",
@@ -388,10 +388,10 @@ def collect_network_gateways() -> None:
388388
expect_array=True,
389389
)
390390
items = graph_builder.client.list(api_spec)
391-
AzureVirtualNetworkGateway.collect(items, graph_builder)
391+
AzureNetworkVirtualNetworkGateway.collect(items, graph_builder)
392392

393393
def collect_local_network_gateway() -> None:
394-
from fix_plugin_azure.resource.network import AzureLocalNetworkGateway
394+
from fix_plugin_azure.resource.network import AzureNetworkLocalNetworkGateway
395395

396396
api_spec = AzureResourceSpec(
397397
service="network",
@@ -403,10 +403,10 @@ def collect_local_network_gateway() -> None:
403403
expect_array=True,
404404
)
405405
items = graph_builder.client.list(api_spec)
406-
AzureLocalNetworkGateway.collect(items, graph_builder)
406+
AzureNetworkLocalNetworkGateway.collect(items, graph_builder)
407407

408408
def collect_network_gateway_connections() -> None:
409-
from fix_plugin_azure.resource.network import AzureVirtualNetworkGatewayConnection
409+
from fix_plugin_azure.resource.network import AzureNetworkVirtualNetworkGatewayConnection
410410

411411
api_spec = AzureResourceSpec(
412412
service="network",
@@ -418,7 +418,7 @@ def collect_network_gateway_connections() -> None:
418418
expect_array=True,
419419
)
420420
items = graph_builder.client.list(api_spec)
421-
AzureVirtualNetworkGatewayConnection.collect(items, graph_builder)
421+
AzureNetworkVirtualNetworkGatewayConnection.collect(items, graph_builder)
422422

423423
graph_builder.submit_work(service_name, collect_resources_in_group)
424424
graph_builder.submit_work(service_name, collect_network_gateways)
@@ -453,7 +453,7 @@ class AzureBaseUsage:
453453
current_value: Optional[int] = field(default=None, metadata={"description": "The current value of the usage."})
454454
limit: Optional[int] = field(default=None, metadata={"description": "The limit of usage."})
455455
unit: Optional[str] = field(default=None, metadata={"description": "An enum describing the unit of measurement."})
456-
_expected_error_codes: ClassVar[List[str]] = ["SubscriptionHasNoUsages"]
456+
_expected_error_codes: ClassVar[Dict[str, Optional[str]]] = {"SubscriptionHasNoUsages": None}
457457

458458

459459
@define(eq=False, slots=False)

0 commit comments

Comments
 (0)