Skip to content

Commit d9e606c

Browse files
james-zhou-inspire11tyler-dunkel
authored andcommitted
feat(dataproc): add dataproc autoscaling policy
1 parent 8461717 commit d9e606c

11 files changed

Lines changed: 169 additions & 1 deletion

File tree

src/enums/schemasMap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ export default {
4141
[services.apiKey]: 'gcpApiKey',
4242
[services.computeProject]: 'gcpComputeProject',
4343
[services.dataprocCluster]: 'gcpDataprocCluster',
44+
[services.dataprocAutoscalingPolicy]: 'gcpDataprocAutoscalingPolicy',
4445
tag: 'gcpTag',
4546
}

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import GcpServiceAccount from '../services/serviceAccount'
3737
import GcpApiKey from '../services/apiKey'
3838
import GcpComputeProject from '../services/computeProject'
3939
import GcpDataprocCluster from '../services/dataprocCluster'
40+
import GcpDataprocAutoscalingPolicy from '../services/dataprocAutoscalingPolicy'
4041

4142
/**
4243
* serviceMap is an object that contains all currently supported services
@@ -80,5 +81,6 @@ export default {
8081
[services.apiKey]: GcpApiKey,
8182
[services.computeProject]: GcpComputeProject,
8283
[services.dataprocCluster]: GcpDataprocCluster,
84+
[services.dataprocAutoscalingPolicy]: GcpDataprocAutoscalingPolicy,
8385
tag: GcpTag,
8486
}

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export default {
2929
// dataCatalog: 'data-catalog',
3030
// dataflow: 'dataflow',
3131
dataprocCluster: 'dataprocClusters',
32+
dataprocAutoscalingPolicy: 'dataprocAutoscalingPolicies',
3233
// metastore: 'metastore',
3334
// pubsub: 'pubsub',
3435
// bigtable: 'bigtable',
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { AutoscalingPolicyServiceClient } from '@google-cloud/dataproc'
2+
import CloudGraph from '@cloudgraph/sdk'
3+
import groupBy from 'lodash/groupBy'
4+
import { google } from '@google-cloud/dataproc/build/protos/protos'
5+
import gcpLoggerText from '../../properties/logger'
6+
import { GcpServiceInput } from '../../types'
7+
import { generateGcpErrorLog } from '../../utils'
8+
9+
const lt = { ...gcpLoggerText }
10+
const { logger } = CloudGraph
11+
const serviceName = 'Dataproc Autoscaling Policy'
12+
13+
export interface RawGcpDataprocAutoscalingPolicy extends Omit<google.cloud.dataproc.v1.IAutoscalingPolicy, 'id'|'labels'> {
14+
id: string
15+
region: string
16+
projectId: string
17+
Labels: { [key: string]: string }
18+
}
19+
20+
export default async ({
21+
regions,
22+
config,
23+
}: GcpServiceInput): Promise<{
24+
[region: string]: RawGcpDataprocAutoscalingPolicy[]
25+
}> => {
26+
const autoscalingPolicyList: RawGcpDataprocAutoscalingPolicy[] = []
27+
const { projectId } = config
28+
29+
for (const region of regions.split(',')) {
30+
/**
31+
* Get all the Dataproc Autoscaling Policies
32+
*/
33+
34+
try {
35+
const dataprocClient = new AutoscalingPolicyServiceClient({
36+
...config,
37+
apiEndpoint: `${region}-dataproc.googleapis.com`,
38+
projectId,
39+
})
40+
const locationName = dataprocClient.locationPath(projectId, region)
41+
const iterable = dataprocClient.listAutoscalingPoliciesAsync({
42+
parent: locationName,
43+
})
44+
for await (const { id, labels, ...response } of iterable) {
45+
if (response) {
46+
autoscalingPolicyList.push({
47+
...response,
48+
id,
49+
projectId,
50+
region,
51+
Labels: labels,
52+
})
53+
}
54+
}
55+
} catch (error) {
56+
generateGcpErrorLog(serviceName, 'dataprocAutoscalingPolicy:listAutoscalingPoliciesAsync', error)
57+
}
58+
}
59+
60+
logger.debug(lt.foundResources(serviceName, autoscalingPolicyList.length))
61+
return groupBy(autoscalingPolicyList, 'region')
62+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import {
2+
GcpDataprocAutoscalingPolicy
3+
} from '../../types/generated'
4+
import { RawGcpDataprocAutoscalingPolicy } from './data'
5+
import { formatLabelsFromMap } from '../../utils/format'
6+
7+
export default ({
8+
service,
9+
region,
10+
}: {
11+
service: RawGcpDataprocAutoscalingPolicy
12+
region: string
13+
}): GcpDataprocAutoscalingPolicy => {
14+
const {
15+
id,
16+
projectId,
17+
name,
18+
basicAlgorithm = {},
19+
workerConfig = {},
20+
secondaryWorkerConfig = {},
21+
Labels = {},
22+
} = service
23+
24+
return {
25+
id,
26+
projectId,
27+
region,
28+
name,
29+
basicAlgorithmYarnConfigGracefulDecommissionTimeout: basicAlgorithm?.yarnConfig?.gracefulDecommissionTimeout?.seconds?.toString() || '',
30+
basicAlgorithmYarnConfigScaleUpFactor: basicAlgorithm?.yarnConfig?.scaleUpFactor || 0.0,
31+
basicAlgorithmYarnConfigScaleDownFactor: basicAlgorithm?.yarnConfig?.scaleDownFactor || 0.0,
32+
basicAlgorithmYarnConfigScaleUpMinWorkerFraction: basicAlgorithm?.yarnConfig?.scaleUpMinWorkerFraction || 0.0,
33+
basicAlgorithmYarnConfigScaleDownMinWorkerFraction: basicAlgorithm?.yarnConfig?.scaleDownMinWorkerFraction || 0.0,
34+
basicAlgorithmCooldownPeriod: basicAlgorithm?.cooldownPeriod?.seconds?.toString() || '',
35+
workerConfigMinInstances: workerConfig?.minInstances || 0,
36+
workerConfigMaxInstances: workerConfig?.maxInstances || 0,
37+
workerConfigWeight: workerConfig?.weight || 0,
38+
secondaryWorkerConfigMinInstances: secondaryWorkerConfig?.minInstances || 0,
39+
secondaryWorkerConfigMaxInstances: secondaryWorkerConfig?.maxInstances || 0,
40+
secondaryWorkerConfigWeight: secondaryWorkerConfig?.weight || 0,
41+
labels: formatLabelsFromMap(Labels),
42+
}
43+
}
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 GcpDataprocAutoscalingPolicy 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: [AddgcpDataprocAutoscalingPolicyInput!]!) {
2+
addgcpDataprocAutoscalingPolicy(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
type gcpDataprocAutoscalingPolicy implements gcpBaseResource
2+
@generate(
3+
query: { get: true, query: true, aggregate: true }
4+
mutation: { add: true, delete: false }
5+
subscription: false
6+
)
7+
@key(fields: "id") {
8+
basicAlgorithmYarnConfigGracefulDecommissionTimeout: String @search(by: [hash, regexp])
9+
basicAlgorithmYarnConfigScaleUpFactor: Float @search
10+
basicAlgorithmYarnConfigScaleDownFactor: Float @search
11+
basicAlgorithmYarnConfigScaleUpMinWorkerFraction: Float @search
12+
basicAlgorithmYarnConfigScaleDownMinWorkerFraction: Float @search
13+
basicAlgorithmCooldownPeriod: String @search(by: [hash, regexp])
14+
workerConfigMinInstances: Int @search
15+
workerConfigMaxInstances: Int @search
16+
workerConfigWeight: Int @search
17+
secondaryWorkerConfigMinInstances: Int @search
18+
secondaryWorkerConfigMaxInstances: Int @search
19+
secondaryWorkerConfigWeight: Int @search
20+
labels: [gcpRawLabel]
21+
project: [gcpProject] @hasInverse(field: dataprocAutoscalingPolicies)
22+
}

src/services/dataprocCluster/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import format from './format'
44
import getData from './data'
55
import mutation from './mutation'
66

7-
export default class GcpDataproc extends BaseService implements Service {
7+
export default class GcpDataprocCluster extends BaseService implements Service {
88
format = format.bind(this)
99

1010
getData = getData.bind(this)

src/services/project/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ type gcpProject @key(fields: "id") {
4747
kmsCryptoKeys: [gcpKmsCryptoKey] @hasInverse(field: project)
4848
dataprocCluster: [gcpDataprocCluster] @hasInverse(field: project)
4949
dataprocClusters: [gcpDataprocCluster] @hasInverse(field: project)
50+
dataprocAutoscalingPolicies: [gcpDataprocAutoscalingPolicy] @hasInverse(field: project)
5051
}

0 commit comments

Comments
 (0)