Skip to content

Commit f1768bf

Browse files
authored
Merge pull request #153 from cloudgraphdev/feature/EP-3203-add-codepipeline-services
feat(aws): Add codepipeline services
2 parents b3df3d0 + 31c841f commit f1768bf

File tree

20 files changed

+585
-11
lines changed

20 files changed

+585
-11
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ CloudGraph AWS Provider will ask you what regions you would like to crawl and wi
9393
| cloudwatchLog | cloudtrail, cloudwatch, ecsCluster, elasticSearchDomain, kms, managedAirflow, rdsDbInstance |
9494
| codeCommitRepository | |
9595
| codebuild | iamRole, kms, vpc, securityGroup, subnet |
96+
| codePipeline | |
97+
| codePipelineWebhook | |
9698
| cognitoIdentityPool | iamRole, iamOpenIdConnectProvider, iamSamlProvider, elasticSearchDomain |
9799
| cognitoUserPool | appSync, elasticSearchDomain, lambda |
98100
| configurationDeliveryChannel | |

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"terraform:cleanup": "rimraf ./tests/terraform/{.terraform,.terraform.lock.hcl,tfplan} ./tests/terraform/*.{tfstate,tfplan,backup}"
3232
},
3333
"dependencies": {
34-
"@aws-sdk/client-codecommit": "^3.342.0",
34+
"@aws-sdk/client-codecommit": "^3.344.0",
35+
"@aws-sdk/client-codepipeline": "^3.344.0",
3536
"@aws-sdk/client-elastic-beanstalk": "^3.338.0",
3637
"@aws-sdk/client-glue": "^3.342.0",
3738
"@aws-sdk/client-ssm": "^3.341.0",

src/enums/schemasMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export default {
2525
[services.cloudwatch]: 'awsCloudwatch',
2626
[services.cloudwatchLog]: 'awsCloudwatchLog',
2727
[services.codebuild]: 'awsCodebuild',
28+
[services.codePipeline]: 'awsCodePipeline',
29+
[services.codePipelineWebhook]: 'awsCodePipelineWebhook',
2830
[services.codeCommitRepository]: 'awsCodeCommitRepository',
2931
[services.cognitoIdentityPool]: 'awsCognitoIdentityPool',
3032
[services.cognitoUserPool]: 'awsCognitoUserPool',

src/enums/serviceAliases.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export default {
2121
[services.cloudwatchDashboard]: 'cloudwatchDashboards',
2222
[services.cloudwatchEventRule]: 'cloudwatchEventRules',
2323
[services.codebuild]: 'codebuilds',
24+
[services.codePipeline]: 'codePipelines',
25+
[services.codePipelineWebhook]: 'codePipelineWebhooks',
2426
[services.codeCommitRepository]: 'codeCommitRepositories',
2527
[services.configurationDeliveryChannel]: 'configurationDeliveryChannels',
2628
[services.configurationRecorder]: 'configurationRecorders',

src/enums/serviceMap.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ import VpnConnection from '../services/vpnConnection'
125125
import VpnGateway from '../services/vpnGateway'
126126
import WafV2WebAcl from '../services/wafV2WebAcl'
127127
import services from './services'
128+
import CodePipeline from '../services/codePipeline'
129+
import CodePipelineWebhook from '../services/codePipelineWebhook'
128130

129131
/**
130132
* serviceMap is an object that contains all currently supported services for AWS
@@ -157,6 +159,8 @@ export default {
157159
[services.cloudwatchEventRule]: CloudWatchEventRule,
158160
[services.cloudwatchLog]: CloudWatchLog,
159161
[services.codebuild]: CodeBuild,
162+
[services.codePipeline]: CodePipeline,
163+
[services.codePipelineWebhook]: CodePipelineWebhook,
160164
[services.codeCommitRepository]: CodeCommitRepository,
161165
[services.cognitoIdentityPool]: CognitoIdentityPool,
162166
[services.cognitoUserPool]: CognitoUserPool,

src/enums/services.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export default {
2424
cloudwatchEventRule: 'cloudwatchEventRule',
2525
cloudwatchLog: 'cloudwatchLog',
2626
codebuild: 'codebuild',
27+
codePipeline: 'codePipeline',
28+
codePipelineWebhook: 'codePipelineWebhook',
2729
codeCommitRepository: 'codeCommitRepository',
2830
cognitoIdentityPool: 'cognitoIdentityPool',
2931
cognitoUserPool: 'cognitoUserPool',

src/services/account/schema.graphql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ type awsAccount implements awsOptionalService @key(fields: "id") {
2222
cloudwatch: [awsCloudwatch]
2323
cloudwatchLogs: [awsCloudwatchLog]
2424
codebuilds: [awsCodebuild]
25+
codePipelines: [awsCodePipeline]
26+
codePipelineWebhooks: [awsCodePipelineWebhook]
2527
codeCommitRepository: [awsCodeCommitRepository]
2628
cognitoIdentityPool: [awsCognitoIdentityPool]
2729
cognitoUserPool: [awsCognitoUserPool]

src/services/codePipeline/data.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import {
2+
CodePipelineClient,
3+
ListPipelinesCommand,
4+
ListPipelinesInput,
5+
PipelineSummary,
6+
} from '@aws-sdk/client-codepipeline'
7+
import CloudGraph from '@cloudgraph/sdk'
8+
import { Config } from 'aws-sdk'
9+
import { groupBy } from 'lodash'
10+
import isEmpty from 'lodash/isEmpty'
11+
import awsLoggerText from '../../properties/logger'
12+
import AwsErrorLog from '../../utils/errorLog'
13+
14+
const lt = { ...awsLoggerText }
15+
const { logger } = CloudGraph
16+
const serviceName = 'Code Pipeline'
17+
const errorLog = new AwsErrorLog(serviceName)
18+
const MAX_ITEMS = 500
19+
20+
export interface RawAwsPipelineSummary extends PipelineSummary {
21+
region: string
22+
}
23+
24+
const listPipelines = async (
25+
cp: CodePipelineClient
26+
): Promise<PipelineSummary[]> =>
27+
new Promise(async resolve => {
28+
const codePipelines: PipelineSummary[] = []
29+
30+
const input: ListPipelinesInput = {
31+
maxResults: MAX_ITEMS,
32+
}
33+
34+
const listAllPipelines = (token?: string): void => {
35+
if (token) {
36+
input.nextToken = token
37+
}
38+
const command = new ListPipelinesCommand(input)
39+
cp.send(command)
40+
.then(data => {
41+
if (isEmpty(data)) {
42+
return resolve([])
43+
}
44+
45+
const { pipelines = [], nextToken } = data || {}
46+
47+
codePipelines.push(...pipelines)
48+
49+
if (nextToken) {
50+
logger.debug(lt.foundAnotherThousand)
51+
listAllPipelines(nextToken)
52+
} else {
53+
resolve(codePipelines)
54+
}
55+
})
56+
.catch(err => {
57+
errorLog.generateAwsErrorLog({
58+
functionName: 'codepipeline:listPipelines',
59+
err,
60+
})
61+
resolve([])
62+
})
63+
}
64+
listAllPipelines()
65+
})
66+
67+
export default async ({
68+
regions,
69+
config,
70+
}: {
71+
regions: string
72+
config: Config
73+
}): Promise<{ [property: string]: RawAwsPipelineSummary[] }> =>
74+
new Promise(async resolve => {
75+
const { credentials } = config
76+
const pipelinesData: RawAwsPipelineSummary[] = []
77+
78+
const regionPromises = regions.split(',').map(region => {
79+
const cpClient = new CodePipelineClient({
80+
credentials,
81+
region,
82+
})
83+
return new Promise<void>(async resolveRegion => {
84+
const pipelines = (await listPipelines(cpClient)) || []
85+
if (!isEmpty(pipelines))
86+
pipelinesData.push(...pipelines.map(val => ({ ...val, region })))
87+
resolveRegion()
88+
})
89+
})
90+
91+
await Promise.all(regionPromises)
92+
errorLog.reset()
93+
94+
resolve(groupBy(pipelinesData, 'region'))
95+
})
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
import { AwsCodePipeline } from '../../types/generated'
3+
import { codePipelineArn } from '../../utils/generateArns'
4+
import { RawAwsPipelineSummary } from './data'
5+
6+
/**
7+
* Code Pipeline
8+
*/
9+
export default ({
10+
account,
11+
region,
12+
service: pipeline,
13+
}: {
14+
account: string
15+
region: string
16+
service: RawAwsPipelineSummary
17+
}): AwsCodePipeline => {
18+
const { name } = pipeline
19+
20+
const arn = codePipelineArn({ region, account, name })
21+
22+
return {
23+
accountId: account,
24+
arn,
25+
id: arn,
26+
name,
27+
region,
28+
}
29+
}

src/services/codePipeline/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 CodePipeline extends BaseService implements Service {
8+
format = format.bind(this)
9+
10+
getData = getData.bind(this)
11+
12+
mutation = mutation
13+
}

0 commit comments

Comments
 (0)