Skip to content

Commit eb171b2

Browse files
authored
Merge pull request #148 from cloudgraphdev/feat/EP-3196
feat: add ecr missing services
2 parents 002190f + 9b41282 commit eb171b2

File tree

5 files changed

+142
-4
lines changed

5 files changed

+142
-4
lines changed

src/properties/logger.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,10 @@ export default {
501501
`Found another ${num} ECR repos in this region...`,
502502
gettingECRRepos: 'Fetching ECR repos...',
503503
gettingECRRepoTags: 'Fetching tags for each ECR repo...',
504+
gettingECRRepoLifecyclePolicy:
505+
'Fetching lifecycle policy for each ECR repo...',
506+
gettingECRRepoRepositoryPolicy:
507+
'Fetching repository policy for each ECR repo...',
504508
/**
505509
* Transit Gateway
506510
*/

src/services/ecr/data.ts

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { AWSError } from 'aws-sdk/lib/error'
33
import ECR, {
44
DescribeRepositoriesRequest,
55
DescribeRepositoriesResponse,
6+
GetLifecyclePolicyResponse,
7+
GetRepositoryPolicyResponse,
68
ListTagsForResourceResponse,
79
Repository,
810
RepositoryList,
@@ -27,6 +29,8 @@ const MAX_ITEMS = 1000
2729
export interface RawAwsEcr extends Repository {
2830
region: string
2931
Tags?: TagMap
32+
lifecyclePolicy: GetLifecyclePolicyResponse
33+
repositoryPolicy: GetRepositoryPolicyResponse
3034
}
3135

3236
const listReposForRegion = async ({
@@ -99,6 +103,56 @@ const getResourceTags = async (ecr: ECR, arn: string): Promise<TagMap> =>
99103
}
100104
})
101105

106+
const getLifecyclePolicy = async (
107+
ecr: ECR,
108+
registryId: string,
109+
repositoryName: string
110+
): Promise<GetLifecyclePolicyResponse> =>
111+
new Promise(resolve => {
112+
try {
113+
ecr.getLifecyclePolicy(
114+
{ registryId, repositoryName },
115+
(err: AWSError, data: GetLifecyclePolicyResponse) => {
116+
if (err) {
117+
errorLog.generateAwsErrorLog({
118+
functionName: 'ecr:getLifecyclePolicy',
119+
err,
120+
})
121+
return resolve({})
122+
}
123+
resolve(data)
124+
}
125+
)
126+
} catch (error) {
127+
resolve({})
128+
}
129+
})
130+
131+
const getRepositoryPolicy = async (
132+
ecr: ECR,
133+
registryId: string,
134+
repositoryName: string
135+
): Promise<GetRepositoryPolicyResponse> =>
136+
new Promise(resolve => {
137+
try {
138+
ecr.getRepositoryPolicy(
139+
{ registryId, repositoryName },
140+
(err: AWSError, data: GetRepositoryPolicyResponse) => {
141+
if (err) {
142+
errorLog.generateAwsErrorLog({
143+
functionName: 'ecr:getRepositoryPolicy',
144+
err,
145+
})
146+
return resolve({})
147+
}
148+
resolve(data)
149+
}
150+
)
151+
} catch (error) {
152+
resolve({})
153+
}
154+
})
155+
102156
export default async ({
103157
regions,
104158
config,
@@ -112,9 +166,11 @@ export default async ({
112166
const ecrData: RawAwsEcr[] = []
113167
const regionPromises = []
114168
const tagsPromises = []
169+
const lifecyclePoliciesPromises = []
170+
const repositoryPoliciesPromises = []
115171

116172
// get all repositories for all regions
117-
regions.split(',').map(region => {
173+
regions.split(',').forEach(region => {
118174
const ecr = new ECR({ ...config, region, endpoint })
119175
const regionPromise = new Promise<void>(async resolveRegion => {
120176
const repositoryList = await listReposForRegion({
@@ -126,6 +182,8 @@ export default async ({
126182
...repositoryList.map(repo => ({
127183
...repo,
128184
region,
185+
lifecyclePolicy: {},
186+
repositoryPolicy: {},
129187
}))
130188
)
131189
}
@@ -138,7 +196,7 @@ export default async ({
138196
await Promise.all(regionPromises)
139197

140198
// get all tags for each repository
141-
ecrData.map(({ repositoryArn, region }, idx) => {
199+
ecrData.forEach(({ repositoryArn, region }, idx) => {
142200
const ecr = new ECR({ ...config, region, endpoint })
143201
const tagsPromise = new Promise<void>(async resolveTags => {
144202
const envTags: TagMap = await getResourceTags(ecr, repositoryArn)
@@ -150,6 +208,47 @@ export default async ({
150208

151209
logger.debug(lt.gettingECRRepoTags)
152210
await Promise.all(tagsPromises)
211+
212+
// get lifecycle policy for each repository
213+
ecrData.forEach(({ registryId, repositoryName, region }, idx) => {
214+
const ecr = new ECR({ ...config, region, endpoint })
215+
const lifecyclePolicyPromise = new Promise<void>(
216+
async resolveLifecyclePolicy => {
217+
const lifecyclePolicy = await getLifecyclePolicy(
218+
ecr,
219+
registryId,
220+
repositoryName
221+
)
222+
ecrData[idx].lifecyclePolicy = lifecyclePolicy
223+
resolveLifecyclePolicy()
224+
}
225+
)
226+
lifecyclePoliciesPromises.push(lifecyclePolicyPromise)
227+
})
228+
229+
logger.debug(lt.gettingECRRepoLifecyclePolicy)
230+
await Promise.all(lifecyclePoliciesPromises)
231+
232+
// get repository policy for each repository
233+
ecrData.forEach(({ registryId, repositoryName, region }, idx) => {
234+
const ecr = new ECR({ ...config, region, endpoint })
235+
const repositoryPolicyPromise = new Promise<void>(
236+
async resolveRepositoryPolicy => {
237+
const repositoryPolicy = await getRepositoryPolicy(
238+
ecr,
239+
registryId,
240+
repositoryName
241+
)
242+
ecrData[idx].repositoryPolicy = repositoryPolicy
243+
resolveRepositoryPolicy()
244+
}
245+
)
246+
repositoryPoliciesPromises.push(repositoryPolicyPromise)
247+
})
248+
249+
logger.debug(lt.gettingECRRepoRepositoryPolicy)
250+
await Promise.all(repositoryPoliciesPromises)
251+
153252
errorLog.reset()
154253

155254
resolve(groupBy(ecrData, 'region'))

src/services/ecr/format.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { RawAwsEcr } from './data'
55
export default ({
66
service: rawData,
77
account,
8-
region
8+
region,
99
}: {
1010
service: RawAwsEcr
1111
account: string
@@ -19,8 +19,13 @@ export default ({
1919
createdAt,
2020
imageTagMutability,
2121
imageScanningConfiguration: { scanOnPush: imageScanOnPush = false } = {},
22-
encryptionConfiguration: { encryptionType: type = 'none', kmsKey = '' } = {},
22+
encryptionConfiguration: {
23+
encryptionType: type = 'none',
24+
kmsKey = '',
25+
} = {},
2326
Tags,
27+
lifecyclePolicy,
28+
repositoryPolicy,
2429
} = rawData
2530

2631
return {
@@ -36,5 +41,7 @@ export default ({
3641
registryAccountId,
3742
repositoryUri,
3843
tags: formatTagsFromMap(Tags),
44+
lifecyclePolicy,
45+
repositoryPolicy,
3946
}
4047
}

src/services/ecr/schema.graphql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ type awsEcr implements awsBaseService @key(fields: "arn") {
88
repositoryUri: String @search(by: [hash, regexp])
99
scanOnPush: Boolean @search
1010
tags: [awsRawTag]
11+
lifecyclePolicy: awsEcrLifecyclePolicy
12+
repositoryPolicy: awsEcrRepositoryPolicy
1113
}
1214

1315
type awsEcrEncryptionConfiguration
@@ -19,3 +21,15 @@ type awsEcrEncryptionConfiguration
1921
type: String @search(by: [hash, regexp])
2022
kmsKey: String @search(by: [hash, regexp])
2123
}
24+
25+
type awsEcrLifecyclePolicy {
26+
registryId: String
27+
repositoryName: String
28+
lifecyclePolicyText: String
29+
}
30+
31+
type awsEcrRepositoryPolicy {
32+
registryId: String
33+
repositoryName: String
34+
policyText: String
35+
}

src/types/generated.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,8 +1749,10 @@ export type AwsEcr = AwsBaseService & {
17491749
encryptionConfig?: Maybe<AwsEcrEncryptionConfiguration>;
17501750
imageScanOnPush?: Maybe<Scalars['Boolean']>;
17511751
imageTagMutability?: Maybe<Scalars['String']>;
1752+
lifecyclePolicy?: Maybe<AwsEcrLifecyclePolicy>;
17521753
name?: Maybe<Scalars['String']>;
17531754
registryAccountId?: Maybe<Scalars['String']>;
1755+
repositoryPolicy?: Maybe<AwsEcrRepositoryPolicy>;
17541756
repositoryUri?: Maybe<Scalars['String']>;
17551757
scanOnPush?: Maybe<Scalars['Boolean']>;
17561758
tags?: Maybe<Array<Maybe<AwsRawTag>>>;
@@ -1761,6 +1763,18 @@ export type AwsEcrEncryptionConfiguration = {
17611763
type?: Maybe<Scalars['String']>;
17621764
};
17631765

1766+
export type AwsEcrLifecyclePolicy = {
1767+
lifecyclePolicyText?: Maybe<Scalars['String']>;
1768+
registryId?: Maybe<Scalars['String']>;
1769+
repositoryName?: Maybe<Scalars['String']>;
1770+
};
1771+
1772+
export type AwsEcrRepositoryPolicy = {
1773+
policyText?: Maybe<Scalars['String']>;
1774+
registryId?: Maybe<Scalars['String']>;
1775+
repositoryName?: Maybe<Scalars['String']>;
1776+
};
1777+
17641778
export type AwsEcsAttachment = {
17651779
details?: Maybe<Array<Maybe<AwsEcsAttachmentDetail>>>;
17661780
id: Scalars['String'];

0 commit comments

Comments
 (0)