Skip to content

Commit 54024e5

Browse files
authored
[feat][gcp] Improve the way of collection for DiskTypes and MachineTypes (#2284)
1 parent 73efbf3 commit 54024e5

File tree

6 files changed

+183
-115
lines changed

6 files changed

+183
-115
lines changed

plugins/gcp/fix_plugin_gcp/gcp_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from fixlib.types import Json
1313

1414
InternalZoneProp = "_zone"
15+
ZoneProp = "zone"
1516
RegionProp = "region"
1617

1718
# Store the discovery function as separate variable.

plugins/gcp/fix_plugin_gcp/resources/base.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from googleapiclient.errors import HttpError
1616

1717
from fix_plugin_gcp.config import GcpConfig
18-
from fix_plugin_gcp.gcp_client import GcpClient, GcpApiSpec, InternalZoneProp, RegionProp
18+
from fix_plugin_gcp.gcp_client import GcpClient, GcpApiSpec, InternalZoneProp, ZoneProp, RegionProp
1919
from fix_plugin_gcp.utils import Credentials
2020
from fixlib.baseresources import (
2121
BaseResource,
@@ -187,27 +187,26 @@ def nodes(
187187
result.append(n)
188188
return result
189189

190-
def add_node(self, node: GcpResourceType, source: Optional[Json] = None) -> Optional[GcpResourceType]:
190+
def add_node(self, node: GcpResourceType, source: Optional[Json] = None) -> GcpResourceType:
191191
log.debug(f"{self.name}: add node {node}")
192192
node._cloud = self.cloud
193193
node._account = self.project
194194

195-
if self._standard_edges(node, source):
196-
with self.graph_nodes_access:
197-
self.graph.add_node(node, source=source or {})
198-
return node
199-
return None
195+
self.add_region_to_node(node, source)
196+
with self.graph_nodes_access:
197+
self.graph.add_node(node, source=source or {})
198+
return node
200199

201-
def _standard_edges(self, node: GcpResourceType, source: Optional[Json] = None) -> bool:
200+
def add_region_to_node(self, node: GcpResourceType, source: Optional[Json] = None) -> None:
202201
if isinstance(node, GcpRegion):
203202
self.add_edge(node, node=self.project, reverse=True)
204-
return True
203+
return
205204
if node._zone:
206205
self.add_edge(node, node=node._zone, reverse=True)
207-
return True
206+
return
208207
if node._region:
209208
self.add_edge(node, node=node._region, reverse=True)
210-
return True
209+
return
211210

212211
parts = node.id.split("/", maxsplit=4)
213212
if len(parts) > 3 and parts[0] == "projects":
@@ -218,45 +217,61 @@ def _standard_edges(self, node: GcpResourceType, source: Optional[Json] = None)
218217
node._zone = zone
219218
node._region = self.region_by_zone_name.get(zone.id)
220219
self.add_edge(zone, node=node)
221-
return True
220+
return
222221

223222
# Then check for region
224223
if region := self.region_by_name.get(location_name):
225224
node._region = region
226225
self.add_edge(region, node=node)
227-
return True
226+
return
228227

229228
if source is not None:
229+
if ZoneProp in source:
230+
zone_name = source[ZoneProp].rsplit("/", 1)[-1]
231+
if zone := self.zone_by_name.get(zone_name):
232+
node._zone = zone
233+
node._region = self.region_by_zone_name[zone_name]
234+
self.add_edge(node, node=zone, reverse=True)
235+
return
236+
else:
237+
log.debug(
238+
"Zone property '%s' found in the source but no corresponding zone object is available to associate with the node.",
239+
zone_name,
240+
)
241+
230242
if InternalZoneProp in source:
231243
if zone := self.zone_by_name.get(source[InternalZoneProp]):
232244
node._zone = zone
233245
node._region = self.region_by_zone_name[source[InternalZoneProp]]
234246
self.add_edge(node, node=zone, reverse=True)
235-
return True
247+
return
236248
else:
237-
log.debug(f"Zone {source[InternalZoneProp]} not found for node: {node}. Ignore resource.")
238-
return False
249+
log.debug(
250+
"Internal zone property '%s' exists in the source but no corresponding zone object is available to associate with the node.",
251+
source[InternalZoneProp],
252+
)
239253

240254
if RegionProp in source:
241255
region_name = source[RegionProp].rsplit("/", 1)[-1]
242256
if region := self.region_by_name.get(region_name):
243257
node._region = region
244258
self.add_edge(node, node=region, reverse=True)
245-
return True
259+
return
246260
else:
247-
log.debug(f"Region {region_name} not found for node: {node}. Ignore resource.")
248-
return False
261+
log.debug(
262+
"Region property '%s' found in the source but no corresponding region object is available to associate with the node.",
263+
region_name,
264+
)
249265

250266
# Fallback to GraphBuilder region, i.e. regional collection
251267
if self.region is not None:
252268
node._region = self.region
253269
self.add_edge(node, node=self.region, reverse=True)
254-
return True
270+
return
255271

256272
# Fallback to global region
257273
node._region = self.fallback_global_region
258274
self.add_edge(node, node=self.fallback_global_region, reverse=True)
259-
return True
260275

261276
def add_edge(
262277
self,

plugins/gcp/fix_plugin_gcp/resources/billing.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import ClassVar, Dict, Optional, List, Type, cast, Any
2+
from typing import ClassVar, Dict, Optional, List, Type, Any
33

44
from attr import define, field
55

@@ -146,18 +146,22 @@ class GcpService(GcpResource):
146146
display_name: Optional[str] = field(default=None)
147147

148148
@classmethod
149-
def collect(cls: Type[GcpResource], raw: List[Json], builder: GraphBuilder) -> List[GcpResource]:
149+
def collect(cls, raw: List[Json], builder: GraphBuilder) -> List[GcpResource]:
150150
# Additional behavior: iterate over list of collected GcpService and for each:
151151
# - collect related GcpSku
152-
result: List[GcpResource] = super().collect(raw, builder) # type: ignore
153152
SERVICES_COLLECT_LIST = [
154153
"Compute Engine",
155154
]
156-
service_names = [
157-
service.name for service in cast(List[GcpService], result) if service.display_name in SERVICES_COLLECT_LIST
158-
]
159-
for service_name in service_names:
160-
builder.submit_work(GcpSku.collect_resources, builder, parent=service_name)
155+
service_names: List[str] = []
156+
services = []
157+
for service in raw:
158+
if service.get("displayName") in SERVICES_COLLECT_LIST:
159+
service_names.append(str(service["name"]))
160+
services.append(service)
161+
result = super().collect(services, builder)
162+
163+
for s_name in service_names:
164+
builder.submit_work(GcpSku.collect_resources, builder, parent=s_name)
161165

162166
return result
163167

0 commit comments

Comments
 (0)