Skip to content

Commit c9fd809

Browse files
feat(cdn): add cdn backend bucket
1 parent 91f0ae9 commit c9fd809

10 files changed

Lines changed: 249 additions & 7 deletions

File tree

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.cdnBackendBucket]: 'gcpCdnBackendBucket',
1718
[services.cloudRouter]: 'gcpCloudRouter',
1819
[services.dnsManagedZone]: 'gcpDnsManagedZone',
1920
[services.dnsPolicy]: 'gcpDnsPolicy',

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ 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'
1213
import GcpDnsManagedZone from '../services/dnsManagedZone'
1314
import GcpVpc from '../services/vpc'
1415
import GcpIam from '../services/iam'
@@ -53,6 +54,7 @@ export default {
5354
[services.kmsKeyRing]: GcpKmsKeyRing,
5455
[services.kmsCryptoKeys]: GcpKmsCryptoKey,
5556
[services.cloudRouter]: GcpCloudRouter,
57+
[services.cdnBackendBucket]: GcpCdnBackendBucket,
5658
[services.dnsManagedZone]: GcpDnsManagedZone,
5759
[services.dnsPolicy]: GcpDnsPolicy,
5860
[services.vpcConnector]: GcpVpc,

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default {
2222
// bms: 'bms',
2323
// compute: 'compute',
2424
// container: 'container',
25+
cdnBackendBucket: 'cdnBackendBucket',
2526
cloudFunction: 'cloudFunction',
2627
computeProject: 'computeProject',
2728
// 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+
}

src/services/project/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type gcpProject @key(fields: "id") {
1212
labels: [gcpRawLabel]
1313
alertPolicy: [gcpAlertPolicy] @hasInverse(field: project)
1414
apiKeys: [gcpApiKey] @hasInverse(field: project)
15+
cdnBackendBucket: [gcpCdnBackendBucket] @hasInverse(field: project)
1516
cloudFunction: [gcpCloudFunction] @hasInverse(field: project)
1617
computeProject: [gcpComputeProject] @hasInverse(field: project)
1718
dnsManagedZone: [gcpDnsManagedZone] @hasInverse(field: project)

src/types/generated.ts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,38 @@ export type GcpBoolValue = {
639639
value?: Maybe<Scalars['Boolean']>;
640640
};
641641

642+
export type GcpCdnBackendBucket = GcpBaseResource & {
643+
bucketName?: Maybe<Scalars['String']>;
644+
cdnPolicy?: Maybe<GcpCdnBackendBucketCdnPolicy>;
645+
creationTimestamp?: Maybe<Scalars['String']>;
646+
customResponseHeaders?: Maybe<Array<Maybe<Scalars['String']>>>;
647+
description?: Maybe<Scalars['String']>;
648+
enableCdn?: Maybe<Scalars['Boolean']>;
649+
kind?: Maybe<Scalars['String']>;
650+
project?: Maybe<Array<Maybe<GcpProject>>>;
651+
selfLink?: Maybe<Scalars['String']>;
652+
};
653+
654+
export type GcpCdnBackendBucketCdnPolicy = {
655+
bypassCacheOnRequestHeaderNames?: Maybe<Array<Maybe<Scalars['String']>>>;
656+
cacheMode?: Maybe<Scalars['String']>;
657+
clientTtl?: Maybe<Scalars['Int']>;
658+
defaultTtl?: Maybe<Scalars['Int']>;
659+
maxTtl?: Maybe<Scalars['Int']>;
660+
negativeCaching?: Maybe<Scalars['Boolean']>;
661+
negativeCachingPolicy?: Maybe<Array<Maybe<GcpCdnBackendBucketCdnPolicyNegativeCachingPolicy>>>;
662+
requestCoalescing?: Maybe<Scalars['Boolean']>;
663+
serveWhileStale?: Maybe<Scalars['Int']>;
664+
signedUrlCacheMaxAgeSec?: Maybe<Scalars['String']>;
665+
signedUrlKeyNames?: Maybe<Array<Maybe<Scalars['String']>>>;
666+
};
667+
668+
export type GcpCdnBackendBucketCdnPolicyNegativeCachingPolicy = {
669+
code?: Maybe<Scalars['Int']>;
670+
id: Scalars['String'];
671+
ttl?: Maybe<Scalars['Int']>;
672+
};
673+
642674
export type GcpCloudFunction = GcpBaseResource & {
643675
availableMemoryMb?: Maybe<Scalars['Float']>;
644676
buildId?: Maybe<Scalars['String']>;
@@ -693,23 +725,23 @@ export type GcpCloudRouter = GcpBaseResource & {
693725
kind?: Maybe<Scalars['String']>;
694726
name?: Maybe<Scalars['String']>;
695727
nats?: Maybe<Array<Maybe<GcpCloudRouterNat>>>;
696-
selfLink?: Maybe<Scalars['String']>;
697728
network?: Maybe<Array<Maybe<GcpNetwork>>>;
698729
project?: Maybe<Array<Maybe<GcpProject>>>;
730+
selfLink?: Maybe<Scalars['String']>;
699731
};
700732

701733
export type GcpCloudRouterBgpAdvertisedIpRange = {
702-
id: Scalars['String'];
703734
description?: Maybe<Scalars['String']>;
735+
id: Scalars['String'];
704736
range?: Maybe<Scalars['String']>;
705737
};
706738

707739
export type GcpCloudRouterBgpPeer = {
708-
id: Scalars['String'];
709740
advertiseMode?: Maybe<Scalars['String']>;
710741
advertisedGroups?: Maybe<Array<Maybe<Scalars['String']>>>;
711742
advertisedIpRanges?: Maybe<Array<Maybe<GcpCloudRouterBgpPeerAdvertisedIpRange>>>;
712743
advertisedRoutePriority?: Maybe<Scalars['Int']>;
744+
id: Scalars['String'];
713745
interfaceName?: Maybe<Scalars['String']>;
714746
ipAddress?: Maybe<Scalars['String']>;
715747
managementType?: Maybe<Scalars['String']>;
@@ -719,8 +751,8 @@ export type GcpCloudRouterBgpPeer = {
719751
};
720752

721753
export type GcpCloudRouterBgpPeerAdvertisedIpRange = {
722-
id: Scalars['String'];
723754
description?: Maybe<Scalars['String']>;
755+
id: Scalars['String'];
724756
range?: Maybe<Scalars['String']>;
725757
};
726758

@@ -734,10 +766,10 @@ export type GcpCloudRouterInterface = {
734766
};
735767

736768
export type GcpCloudRouterNat = {
737-
id: Scalars['String'];
738769
drainNatIps?: Maybe<Array<Maybe<Scalars['String']>>>;
739770
enableEndpointIndependentMapping?: Maybe<Scalars['Boolean']>;
740771
icmpIdleTimeoutSec?: Maybe<Scalars['Int']>;
772+
id: Scalars['String'];
741773
logConfigEnable?: Maybe<Scalars['Boolean']>;
742774
logConfigFilter?: Maybe<Scalars['String']>;
743775
minPortsPerVm?: Maybe<Scalars['Int']>;
@@ -1242,6 +1274,7 @@ export type GcpMetadata = {
12421274

12431275
export type GcpNetwork = GcpBaseResource & {
12441276
autoCreateSubnetworks?: Maybe<Scalars['Boolean']>;
1277+
cloudRouters?: Maybe<Array<Maybe<GcpCloudRouter>>>;
12451278
creationTimestamp?: Maybe<Scalars['String']>;
12461279
description?: Maybe<Scalars['String']>;
12471280
dnsPolicy?: Maybe<Array<Maybe<GcpDnsPolicy>>>;
@@ -1258,7 +1291,6 @@ export type GcpNetwork = GcpBaseResource & {
12581291
subnet?: Maybe<Array<Maybe<GcpSubnet>>>;
12591292
vmInstance?: Maybe<Array<Maybe<GcpVmInstance>>>;
12601293
vpcConnectors?: Maybe<Array<Maybe<GcpVpcConnector>>>;
1261-
cloudRouters?: Maybe<Array<Maybe<GcpCloudRouter>>>;
12621294
};
12631295

12641296
export type GcpNetworkPeering = {
@@ -1302,7 +1334,9 @@ export type GcpProject = {
13021334
bigQueryDataset?: Maybe<Array<Maybe<GcpBigQueryDataset>>>;
13031335
bigQueryReservation?: Maybe<Array<Maybe<GcpBigQueryReservation>>>;
13041336
bigQueryReservationCapacityCommitment?: Maybe<Array<Maybe<GcpBigQueryReservationCapacityCommitment>>>;
1337+
cdnBackendBucket?: Maybe<Array<Maybe<GcpCdnBackendBucket>>>;
13051338
cloudFunction?: Maybe<Array<Maybe<GcpCloudFunction>>>;
1339+
cloudRouters?: Maybe<Array<Maybe<GcpCloudRouter>>>;
13061340
computeProject?: Maybe<Array<Maybe<GcpComputeProject>>>;
13071341
createTime?: Maybe<Scalars['String']>;
13081342
deleteTime?: Maybe<Scalars['String']>;
@@ -1312,7 +1346,6 @@ export type GcpProject = {
13121346
etag?: Maybe<Scalars['String']>;
13131347
firewall?: Maybe<Array<Maybe<GcpFirewall>>>;
13141348
folder?: Maybe<Array<Maybe<GcpFolder>>>;
1315-
cloudRouters?: Maybe<Array<Maybe<GcpCloudRouter>>>;
13161349
iamPolicy?: Maybe<Array<Maybe<GcpIamPolicy>>>;
13171350
id: Scalars['String'];
13181351
kmsCryptoKeys?: Maybe<Array<Maybe<GcpKmsCryptoKey>>>;

0 commit comments

Comments
 (0)