Skip to content

Commit b7163a8

Browse files
committed
Merge branch 'feature/cg-429-add-gcp-cloud-router' into 'main'
Feature/cg-429 add gcp cloud router See merge request auto-cloud/cloudgraph/provider/cloudgraph-provider-gcp!34
2 parents 116e286 + 27edfdc commit b7163a8

12 files changed

Lines changed: 465 additions & 37 deletions

File tree

README.md

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -62,40 +62,41 @@ CloudGraph GCP Provider will ask you what regions you would like to crawl and wi
6262

6363
# Supported Services
6464

65-
| Service | Relations |
66-
| ------------------ | ------------------------------------------------------------------- |
67-
| alertPolicy | project |
68-
| apiKeys | project |
69-
| assets | project |
70-
| bigQueryDataset | project |
71-
| bigQueryConnection | project |
72-
| bigQueryDataTransfer | bigQueryDataTransferRun, project |
73-
| bigQueryDataTransferRun | project |
74-
| bigQueryReservation | project |
75-
| bigQueryReservationCapacityCommitment | project |
76-
| cloudFunction | project, vpc |
77-
| computeProject | project |
78-
| kmsCryptoKeys | iamPolicy, kmsKeyRing, project |
79-
| dnsManagedZone | project |
80-
| dnsPolicy | project, network |
81-
| firewall | network, project |
82-
| folder | iamPolicy, organization, project |
83-
| kmsKeyRing | kmsCryptoKeys, project |
84-
| iamPolicy | folder, kmsCryptoKeys, project |
85-
| logBucket | logView, project |
86-
| logMetric | project |
87-
| logSink | project |
88-
| logView | logBucket, project |
89-
| network | dnsPolicy, firewall, project, sqlInstances, subnet, vmInstance, vpc |
90-
| organization | folder, project |
91-
| project | ALL SERVICES |
92-
| secretManager | project |
93-
| serviceAccount | project |
94-
| sqlInstances | project, network |
95-
| sslPolicies | project |
96-
| storageBucket | project |
97-
| subnet | project, network, vmInstance, vpc |
98-
| targetSslProxies | project |
99-
| targetHttpsProxies | project |
100-
| vmInstance | project, network, subnet |
101-
| vpcConnectors | cloudFunction, project, network, subnet |
65+
| Service | Relations |
66+
| ------------------------------------- | -------------------------------------------------------------------------------- |
67+
| alertPolicy | project |
68+
| apiKeys | project |
69+
| assets | project |
70+
| bigQueryDataset | project |
71+
| bigQueryConnection | project |
72+
| bigQueryDataTransfer | bigQueryDataTransferRun, project |
73+
| bigQueryDataTransferRun | project |
74+
| bigQueryReservation | project |
75+
| bigQueryReservationCapacityCommitment | project |
76+
| cloudFunction | project, vpc |
77+
| cloudRouter | project |
78+
| computeProject | project |
79+
| kmsCryptoKeys | iamPolicy, kmsKeyRing, project |
80+
| dnsManagedZone | project |
81+
| dnsPolicy | project, network |
82+
| firewall | network, project |
83+
| folder | iamPolicy, organization, project |
84+
| kmsKeyRing | kmsCryptoKeys, project |
85+
| iamPolicy | folder, kmsCryptoKeys, project |
86+
| logBucket | logView, project |
87+
| logMetric | project |
88+
| logSink | project |
89+
| logView | logBucket, project |
90+
| network | cloudRouter, dnsPolicy, firewall, project, sqlInstances, subnet, vmInstance, vpc |
91+
| organization | folder, project |
92+
| project | ALL SERVICES |
93+
| secretManager | project |
94+
| serviceAccount | project |
95+
| sqlInstances | project, network |
96+
| sslPolicies | project |
97+
| storageBucket | project |
98+
| subnet | project, network, vmInstance, vpc |
99+
| targetSslProxies | project |
100+
| targetHttpsProxies | project |
101+
| vmInstance | project, network, subnet |
102+
| vpcConnectors | cloudFunction, project, network, subnet |

src/enums/schemasMap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default {
1414
[services.bigQueryDataTransferRun]: 'gcpBigQueryDataTransferRun',
1515
[services.kmsKeyRing]: 'gcpKmsKeyRing',
1616
[services.kmsCryptoKeys]: 'gcpKmsCryptoKey',
17+
[services.cloudRouter]: 'gcpCloudRouter',
1718
[services.dnsManagedZone]: 'gcpDnsManagedZone',
1819
[services.dnsPolicy]: 'gcpDnsPolicy',
1920
[services.vpcConnector]: 'gcpVpcConnector',

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import GcpBigQueryDataTransfer from '../services/bigQueryDataTransfer'
88
import GcpBigQueryDataTransferRun from '../services/bigQueryDataTransferRun'
99
import GcpKmsKeyRing from '../services/kms'
1010
import GcpKmsCryptoKey from '../services/kmsCryptoKey'
11+
import GcpCloudRouter from '../services/cloudRouter'
1112
import GcpDnsManagedZone from '../services/dnsManagedZone'
1213
import GcpVpc from '../services/vpc'
1314
import GcpIam from '../services/iam'
@@ -51,6 +52,7 @@ export default {
5152
[services.bigQueryDataTransferRun]: GcpBigQueryDataTransferRun,
5253
[services.kmsKeyRing]: GcpKmsKeyRing,
5354
[services.kmsCryptoKeys]: GcpKmsCryptoKey,
55+
[services.cloudRouter]: GcpCloudRouter,
5456
[services.dnsManagedZone]: GcpDnsManagedZone,
5557
[services.dnsPolicy]: GcpDnsPolicy,
5658
[services.vpcConnector]: GcpVpc,

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export default {
4141
// databaseMigration: 'database-migration',
4242
// datastore: 'datastore',
4343
// firestore: 'firestore',
44+
cloudRouter: 'cloudRouters',
4445
firewall: 'firewall',
4546
// spanner: 'spanner',
4647
// activeDirectory: 'active-directory',

src/services/cloudRouter/data.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import groupBy from 'lodash/groupBy'
2+
import { RoutersClient } from '@google-cloud/compute'
3+
import { google } from '@google-cloud/compute/build/protos/protos'
4+
import CloudGraph from '@cloudgraph/sdk'
5+
import gcpLoggerText from '../../properties/logger'
6+
import { GcpServiceInput } from '../../types'
7+
import { generateGcpErrorLog, initTestEndpoint } from '../../utils'
8+
9+
const lt = { ...gcpLoggerText }
10+
const { logger } = CloudGraph
11+
const serviceName = 'Cloud Router'
12+
const apiEndpoint = initTestEndpoint(serviceName)
13+
14+
export interface RawGcpCloudRouter extends
15+
Omit<google.cloud.compute.v1.IRouter, 'id' | 'region' | 'network'> {
16+
id: string,
17+
region: string,
18+
projectId: string,
19+
network: string[],
20+
}
21+
22+
export default async ({
23+
regions,
24+
config,
25+
}: GcpServiceInput): Promise<{
26+
[region: string]: RawGcpCloudRouter[]
27+
}> => {
28+
const { projectId } = config
29+
30+
const routerData: RawGcpCloudRouter[] = []
31+
const computeClient = new RoutersClient({ ...config, apiEndpoint })
32+
const allRegions = regions.split(',')
33+
for (const region of allRegions) {
34+
try {
35+
const cloudRoutersIter = computeClient.listAsync({
36+
project: projectId,
37+
region,
38+
})
39+
for await (const {id, network, ...cloudRouter} of cloudRoutersIter) {
40+
routerData.push({
41+
id: id.toString(),
42+
projectId,
43+
...cloudRouter,
44+
region,
45+
network: [network]
46+
})
47+
}
48+
} catch (error) {
49+
generateGcpErrorLog(serviceName, 'cloud router:listAsync', error)
50+
}
51+
}
52+
53+
logger.debug(lt.foundResources(serviceName, routerData.length))
54+
55+
return groupBy(routerData, 'region')
56+
}

src/services/cloudRouter/format.ts

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import cuid from 'cuid'
2+
import { google } from '@google-cloud/compute/build/protos/protos'
3+
import { RawGcpCloudRouter } from './data'
4+
import { enumKeyToString } from '../../utils/format'
5+
import { GcpCloudRouter, GcpCloudRouterBgpPeer, GcpCloudRouterNat } from '../../types/generated'
6+
7+
const formatBgpPeer = ({
8+
advertisedGroups,
9+
advertisedIpRanges,
10+
advertisedRoutePriority,
11+
advertiseMode,
12+
interfaceName,
13+
ipAddress,
14+
managementType,
15+
name,
16+
peerAsn,
17+
peerIpAddress,
18+
}: google.cloud.compute.v1.IRouterBgpPeer): GcpCloudRouterBgpPeer => {
19+
return {
20+
id: cuid(),
21+
advertiseMode: enumKeyToString(google.cloud.compute.v1.RouterBgpPeer.AdvertiseMode, advertiseMode),
22+
advertisedGroups: advertisedGroups?.map(
23+
advertisedGroup => enumKeyToString(google.cloud.compute.v1.RouterBgpPeer.AdvertisedGroups, advertisedGroup)
24+
) || [],
25+
advertisedIpRanges:
26+
advertisedIpRanges?.map(({ description, range }) => ({
27+
id: cuid(),
28+
description,
29+
range,
30+
})) || [],
31+
advertisedRoutePriority,
32+
interfaceName,
33+
ipAddress,
34+
managementType: enumKeyToString(google.cloud.compute.v1.RouterInterface.ManagementType, managementType),
35+
name,
36+
peerAsn,
37+
peerIpAddress,
38+
}
39+
}
40+
41+
const formatNat = ({
42+
drainNatIps,
43+
enableEndpointIndependentMapping,
44+
icmpIdleTimeoutSec,
45+
logConfig,
46+
minPortsPerVm,
47+
name: natName,
48+
natIpAllocateOption,
49+
natIps,
50+
sourceSubnetworkIpRangesToNat,
51+
subnetworks,
52+
tcpEstablishedIdleTimeoutSec,
53+
tcpTransitoryIdleTimeoutSec,
54+
udpIdleTimeoutSec,
55+
}: google.cloud.compute.v1.IRouterNat): GcpCloudRouterNat => {
56+
return {
57+
id: cuid(),
58+
drainNatIps,
59+
enableEndpointIndependentMapping,
60+
icmpIdleTimeoutSec,
61+
logConfigEnable: logConfig?.enable,
62+
logConfigFilter: enumKeyToString(google.cloud.compute.v1.RouterNatLogConfig.Filter, logConfig?.filter),
63+
minPortsPerVm,
64+
name: natName,
65+
natIpAllocateOption: enumKeyToString(google.cloud.compute.v1.RouterNat.NatIpAllocateOption, natIpAllocateOption),
66+
natIps,
67+
sourceSubnetworkIpRangesToNat:
68+
enumKeyToString(google.cloud.compute.v1.RouterNat.SourceSubnetworkIpRangesToNat, sourceSubnetworkIpRangesToNat),
69+
subnetworks:
70+
subnetworks?.map(
71+
({ name, secondaryIpRangeNames, sourceIpRangesToNat }) => ({
72+
id: cuid(),
73+
name,
74+
secondaryIpRangeNames,
75+
sourceIpRangesToNat: sourceIpRangesToNat?.map(
76+
sourceIpRangeToNat => enumKeyToString(google.cloud.compute.v1.RouterNatSubnetworkToNat.SourceIpRangesToNat, sourceIpRangeToNat)
77+
) || [],
78+
})
79+
) || [],
80+
tcpEstablishedIdleTimeoutSec,
81+
tcpTransitoryIdleTimeoutSec,
82+
udpIdleTimeoutSec,
83+
}
84+
}
85+
86+
export default ({
87+
service,
88+
account,
89+
region,
90+
}: {
91+
service: RawGcpCloudRouter
92+
account: string
93+
region: string
94+
}): GcpCloudRouter => {
95+
const {
96+
bgp,
97+
bgpPeers,
98+
creationTimestamp,
99+
description,
100+
encryptedInterconnectRouter,
101+
id,
102+
interfaces,
103+
kind,
104+
name,
105+
nats,
106+
selfLink,
107+
} = service
108+
109+
return {
110+
id,
111+
projectId: account,
112+
region,
113+
bgpAdvertiseMode: enumKeyToString(google.cloud.compute.v1.RouterBgp.AdvertiseMode, bgp?.advertiseMode),
114+
bgpAdvertisedGroups: bgp?.advertisedGroups?.map(
115+
advertisedGroup => enumKeyToString(google.cloud.compute.v1.RouterBgp.AdvertiseMode, advertisedGroup)
116+
) || [],
117+
bgpAdvertisedIpRanges:
118+
bgp?.advertisedIpRanges?.map(({ description: advIpRangeDDesc, range }) => ({
119+
id: cuid(),
120+
description: advIpRangeDDesc,
121+
range,
122+
})) || [],
123+
bgpAsn: bgp?.asn || 0,
124+
bgpPeers: bgpPeers?.map(bgpPeer => formatBgpPeer(bgpPeer)) || [],
125+
creationTimestamp,
126+
description,
127+
encryptedInterconnectRouter,
128+
interfaces: interfaces?.map(
129+
({
130+
ipRange,
131+
linkedInterconnectAttachment,
132+
linkedVpnTunnel,
133+
managementType,
134+
name: interfaceName,
135+
}) => ({
136+
id: cuid(),
137+
ipRange,
138+
linkedInterconnectAttachment,
139+
linkedVpnTunnel,
140+
managementType: enumKeyToString(google.cloud.compute.v1.RouterInterface.ManagementType, managementType),
141+
name: interfaceName,
142+
})
143+
) || [],
144+
kind,
145+
name,
146+
nats: nats?.map(nat => formatNat(nat)) || [],
147+
selfLink,
148+
}
149+
}

src/services/cloudRouter/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Service } from '@cloudgraph/sdk'
2+
import BaseService from '../base'
3+
import format from './format'
4+
import getData from './data'
5+
import mutation from './mutation'
6+
7+
export default class GcpCloudRouter extends BaseService implements Service {
8+
format = format.bind(this)
9+
10+
getData = getData.bind(this)
11+
12+
mutation = mutation;
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default `mutation($input: [AddgcpCloudRouterInput!]!) {
2+
addgcpCloudRouter(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;

0 commit comments

Comments
 (0)