Skip to content

Commit e7d9c83

Browse files
committed
Merge branch 'feature/CG-666-cdn' into 'main'
Resolve CG-666 "Feature/ cdn" Closes CG-666 See merge request auto-cloud/cloudgraph/provider/cloudgraph-provider-gcp!44
2 parents 3055e05 + 9332c02 commit e7d9c83

23 files changed

Lines changed: 1916 additions & 42 deletions

README.md

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -62,45 +62,48 @@ 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-
| cloudRouter | project |
78-
| computeProject | project |
79-
| dataprocClusters | project, dataprocJobs, dataprocWorkflowTemplate |
80-
| dataprocAutoscalingPolicies | project |
81-
| dataprocJobs | project, dataprocClusters |
82-
| dataprocWorkflowTemplate | project, dataprocClusters |
83-
| kmsCryptoKeys | iamPolicy, kmsKeyRing, project |
84-
| dnsManagedZone | project |
85-
| dnsPolicy | project, network |
86-
| firewall | network, project |
87-
| folder | iamPolicy, organization, project |
88-
| kmsKeyRing | kmsCryptoKeys, project |
89-
| iamPolicy | folder, kmsCryptoKeys, project |
90-
| logBucket | logView, project |
91-
| logMetric | project |
92-
| logSink | project |
93-
| logView | logBucket, project |
94-
| network | cloudRouter, dnsPolicy, firewall, project, sqlInstances, subnet, vmInstance, vpc |
95-
| organization | folder, project |
96-
| project | ALL SERVICES |
97-
| secretManager | project |
98-
| serviceAccount | project |
99-
| sqlInstances | project, network |
100-
| sslPolicies | project |
101-
| storageBucket | project |
102-
| subnet | project, network, vmInstance, vpc |
103-
| targetSslProxies | project |
104-
| targetHttpsProxies | project |
105-
| vmInstance | project, network, subnet |
106-
| 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+
| cdnBackendBucket | project, cdnUrlMap |
77+
| cdnBackendService | project, cdnUrlMap, network |
78+
| cdnUrlMap | project, cdnBackendBucket, cdnBackendService |
79+
| cloudFunction | project, vpc |
80+
| cloudRouter | project |
81+
| computeProject | project |
82+
| dataprocClusters | project, dataprocJobs, dataprocWorkflowTemplate |
83+
| dataprocAutoscalingPolicies | project |
84+
| dataprocJobs | project, dataprocClusters |
85+
| dataprocWorkflowTemplate | project, dataprocClusters |
86+
| kmsCryptoKeys | iamPolicy, kmsKeyRing, project |
87+
| dnsManagedZone | project |
88+
| dnsPolicy | project, network |
89+
| firewall | network, project |
90+
| folder | iamPolicy, organization, project |
91+
| kmsKeyRing | kmsCryptoKeys, project |
92+
| iamPolicy | folder, kmsCryptoKeys, project |
93+
| logBucket | logView, project |
94+
| logMetric | project |
95+
| logSink | project |
96+
| logView | logBucket, project |
97+
| network | cloudRouter, dnsPolicy, firewall, project, sqlInstances, subnet, vmInstance, vpc, cdnBackendService |
98+
| organization | folder, project |
99+
| project | ALL SERVICES |
100+
| secretManager | project |
101+
| serviceAccount | project |
102+
| sqlInstances | project, network |
103+
| sslPolicies | project |
104+
| storageBucket | project |
105+
| subnet | project, network, vmInstance, vpc |
106+
| targetSslProxies | project |
107+
| targetHttpsProxies | project |
108+
| vmInstance | project, network, subnet |
109+
| vpcConnectors | cloudFunction, project, network, subnet |

src/enums/schemasMap.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export default {
1414
[services.bigQueryDataTransferRun]: 'gcpBigQueryDataTransferRun',
1515
[services.kmsKeyRing]: 'gcpKmsKeyRing',
1616
[services.kmsCryptoKeys]: 'gcpKmsCryptoKey',
17+
[services.cdnBackendBucket]: 'gcpCdnBackendBucket',
1718
[services.cloudRouter]: 'gcpCloudRouter',
19+
[services.cdnBackendService]: 'gcpCdnBackendService',
20+
[services.cdnUrlMap]: 'gcpCdnUrlMap',
1821
[services.dnsManagedZone]: 'gcpDnsManagedZone',
1922
[services.dnsPolicy]: 'gcpDnsPolicy',
2023
[services.vpcConnector]: 'gcpVpcConnector',

src/enums/serviceMap.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import GcpBigQueryDataTransferRun from '../services/bigQueryDataTransferRun'
99
import GcpKmsKeyRing from '../services/kms'
1010
import GcpKmsCryptoKey from '../services/kmsCryptoKey'
1111
import GcpCloudRouter from '../services/cloudRouter'
12+
import GcpCdnBackendBucket from '../services/cdnBackendBucket'
13+
import GcpCdnBackendService from '../services/cdnBackendService'
14+
import GcpCdnUrlMap from '../services/cdnUrlMap'
1215
import GcpDnsManagedZone from '../services/dnsManagedZone'
1316
import GcpVpc from '../services/vpc'
1417
import GcpIam from '../services/iam'
@@ -56,6 +59,9 @@ export default {
5659
[services.kmsKeyRing]: GcpKmsKeyRing,
5760
[services.kmsCryptoKeys]: GcpKmsCryptoKey,
5861
[services.cloudRouter]: GcpCloudRouter,
62+
[services.cdnBackendBucket]: GcpCdnBackendBucket,
63+
[services.cdnBackendService]: GcpCdnBackendService,
64+
[services.cdnUrlMap]: GcpCdnUrlMap,
5965
[services.dnsManagedZone]: GcpDnsManagedZone,
6066
[services.dnsPolicy]: GcpDnsPolicy,
6167
[services.vpcConnector]: GcpVpc,

src/enums/services.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ export default {
2222
// bms: 'bms',
2323
// compute: 'compute',
2424
// container: 'container',
25+
cdnBackendBucket: 'cdnBackendBucket',
26+
cdnBackendService: 'cdnBackendService',
27+
cdnUrlMap: 'cdnUrlMap',
2528
cloudFunction: 'cloudFunction',
2629
computeProject: 'computeProject',
2730
// run: 'run',
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import groupBy from 'lodash/groupBy'
2+
import CloudGraph from '@cloudgraph/sdk'
3+
import { BackendBucketsClient } from '@google-cloud/compute'
4+
import { google } from '@google-cloud/compute/build/protos/protos'
5+
import gcpLoggerText from '../../properties/logger'
6+
import { GcpServiceInput } from '../../types'
7+
import { generateGcpErrorLog, initTestEndpoint } from '../../utils'
8+
import { GLOBAL_REGION } from '../../config/constants'
9+
10+
const lt = { ...gcpLoggerText }
11+
const { logger } = CloudGraph
12+
const serviceName = 'CDN Backend Bucket'
13+
const apiEndpoint = initTestEndpoint(serviceName)
14+
15+
export interface RawGcpCdnBackendBucket extends Omit<google.cloud.compute.v1.IBackendBucket, 'id'> {
16+
id: string
17+
projectId: string
18+
region: string
19+
}
20+
21+
export default async ({
22+
config,
23+
}: GcpServiceInput): Promise<{
24+
[region: string]: RawGcpCdnBackendBucket[]
25+
}> => {
26+
const backendBuckets: RawGcpCdnBackendBucket[] = []
27+
const { projectId } = config
28+
29+
const computeClient = new BackendBucketsClient({ ...config, apiEndpoint })
30+
31+
try {
32+
const backendBucketIter = computeClient.listAsync({project: projectId})
33+
for await (const backendBucket of backendBucketIter) {
34+
backendBuckets.push({
35+
...backendBucket,
36+
id: backendBucket.id.toString(),
37+
projectId,
38+
region: GLOBAL_REGION,
39+
})
40+
}
41+
} catch (error) {
42+
generateGcpErrorLog(serviceName, 'cdnBackendBucket:listAsync', error)
43+
}
44+
45+
logger.debug(lt.foundResources(serviceName, backendBuckets.length))
46+
47+
return groupBy(backendBuckets, 'region')
48+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { google } from '@google-cloud/compute/build/protos/protos'
2+
3+
import cuid from 'cuid'
4+
import { RawGcpCdnBackendBucket } from './data'
5+
import { enumKeyToString } from '../../utils/format'
6+
import {
7+
GcpCdnBackendBucket,
8+
GcpCdnBackendBucketCdnPolicy,
9+
GcpCdnBackendBucketCdnPolicyNegativeCachingPolicy,
10+
} from '../../types/generated'
11+
12+
const formatCdnPolicyNegativeCachingPolicy = ({
13+
code,
14+
ttl,
15+
}: google.cloud.compute.v1.IBackendBucketCdnPolicyNegativeCachingPolicy): GcpCdnBackendBucketCdnPolicyNegativeCachingPolicy => {
16+
return {
17+
id: cuid(),
18+
code,
19+
ttl,
20+
}
21+
}
22+
23+
const formatCdnPolicy = ({
24+
bypassCacheOnRequestHeaders,
25+
cacheMode,
26+
clientTtl,
27+
defaultTtl,
28+
maxTtl,
29+
negativeCaching,
30+
negativeCachingPolicy,
31+
requestCoalescing,
32+
serveWhileStale,
33+
signedUrlCacheMaxAgeSec,
34+
signedUrlKeyNames,
35+
}: google.cloud.compute.v1.IBackendBucketCdnPolicy): GcpCdnBackendBucketCdnPolicy => {
36+
return {
37+
bypassCacheOnRequestHeaderNames: bypassCacheOnRequestHeaders?.map(
38+
header => header?.headerName || ''
39+
) || [],
40+
cacheMode: enumKeyToString(google.cloud.compute.v1.BackendBucketCdnPolicy.CacheMode, cacheMode),
41+
clientTtl,
42+
defaultTtl,
43+
maxTtl,
44+
negativeCaching,
45+
negativeCachingPolicy: negativeCachingPolicy?.map(policy => formatCdnPolicyNegativeCachingPolicy(policy)) || [],
46+
requestCoalescing,
47+
serveWhileStale,
48+
signedUrlCacheMaxAgeSec: signedUrlCacheMaxAgeSec?.toString() || '',
49+
signedUrlKeyNames,
50+
}
51+
}
52+
53+
export default ({
54+
service,
55+
account,
56+
region,
57+
}: {
58+
service: RawGcpCdnBackendBucket
59+
account: string
60+
region: string
61+
}): GcpCdnBackendBucket => {
62+
const {
63+
bucketName,
64+
cdnPolicy = {},
65+
creationTimestamp,
66+
customResponseHeaders,
67+
description,
68+
enableCdn,
69+
id,
70+
kind,
71+
name,
72+
selfLink,
73+
} = service
74+
75+
return {
76+
id,
77+
projectId: account,
78+
region,
79+
name,
80+
bucketName,
81+
cdnPolicy: formatCdnPolicy(cdnPolicy),
82+
creationTimestamp,
83+
customResponseHeaders,
84+
description,
85+
enableCdn,
86+
kind,
87+
selfLink,
88+
}
89+
}
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 GcpCdnBackendBucket 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: [AddgcpCdnBackendBucketInput!]!) {
2+
addgcpCdnBackendBucket(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
type gcpCdnBackendBucketCdnPolicyNegativeCachingPolicy
2+
@generate(
3+
query: { get: false, query: true, aggregate: false }
4+
mutation: { add: false, delete: false }
5+
subscription: false
6+
)
7+
@key(fields: "id") {
8+
id: String! @id
9+
code: Int @search
10+
ttl: Int @search
11+
}
12+
13+
type gcpCdnBackendBucketCdnPolicy
14+
@generate(
15+
query: { get: false, query: true, aggregate: false }
16+
mutation: { add: false, delete: false }
17+
subscription: false
18+
) {
19+
bypassCacheOnRequestHeaderNames: [String] @search(by: [hash])
20+
cacheMode: String @search(by: [hash, regexp])
21+
clientTtl: Int @search
22+
defaultTtl: Int @search
23+
maxTtl: Int @search
24+
negativeCaching: Boolean @search
25+
negativeCachingPolicy: [gcpCdnBackendBucketCdnPolicyNegativeCachingPolicy]
26+
requestCoalescing: Boolean @search
27+
serveWhileStale: Int @search
28+
signedUrlCacheMaxAgeSec: String @search(by: [hash, regexp])
29+
signedUrlKeyNames: [String] @search(by: [hash])
30+
}
31+
32+
type gcpCdnBackendBucket implements gcpBaseResource
33+
@generate(
34+
query: { get: true, query: true, aggregate: true }
35+
mutation: { add: true, delete: false }
36+
subscription: false
37+
)
38+
@key(fields: "id") {
39+
bucketName: String @search(by: [hash, regexp])
40+
cdnPolicy: gcpCdnBackendBucketCdnPolicy
41+
creationTimestamp: String @search(by: [hash, regexp])
42+
customResponseHeaders: [String] @search(by: [hash])
43+
description: String @search(by: [hash, regexp])
44+
enableCdn: Boolean @search
45+
kind: String @search(by: [hash, regexp])
46+
selfLink: String @search(by: [hash, regexp])
47+
cdnUrlMap: [gcpCdnUrlMap] @hasInverse(field: cdnBackendBucket)
48+
project: [gcpProject] @hasInverse(field: cdnBackendBucket)
49+
}

0 commit comments

Comments
 (0)