in internal/inventory/gcpfetcher/fetcher_assets.go [143:189]
func findRelatedAssetIdsForType(t inventory.AssetType, item *gcpinventory.ExtendedGcpAsset) []string {
ids := []string{}
var fields map[string]*structpb.Value
if item.Resource != nil && item.Resource.Data != nil {
fields = item.GetResource().GetData().GetFields()
}
switch t {
case inventory.AssetClassificationGcpInstance.Type:
if v, ok := fields["networkInterfaces"]; ok {
for _, networkInterface := range v.GetListValue().GetValues() {
networkInterfaceFields := networkInterface.GetStructValue().GetFields()
ids = appendIfExists(ids, networkInterfaceFields, "network")
ids = appendIfExists(ids, networkInterfaceFields, "subnetwork")
}
}
if v, ok := fields["serviceAccounts"]; ok {
for _, serviceAccount := range v.GetListValue().GetValues() {
serviceAccountFields := serviceAccount.GetStructValue().GetFields()
ids = appendIfExists(ids, serviceAccountFields, "email")
}
}
if v, ok := fields["disks"]; ok {
for _, disk := range v.GetListValue().GetValues() {
diskFields := disk.GetStructValue().GetFields()
ids = appendIfExists(ids, diskFields, "source")
}
}
ids = appendIfExists(ids, fields, "machineType")
ids = appendIfExists(ids, fields, "zone")
case inventory.AssetClassificationGcpFirewall.Type, inventory.AssetClassificationGcpSubnet.Type:
ids = appendIfExists(ids, fields, "network")
case inventory.AssetClassificationGcpProject.Type, inventory.AssetClassificationGcpBucket.Type:
if item.IamPolicy == nil {
break
}
for _, binding := range item.IamPolicy.Bindings {
ids = append(ids, binding.Role)
ids = append(ids, binding.Members...)
}
default:
return ids
}
return ids
}