-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathdata.ts
More file actions
117 lines (102 loc) · 3.13 KB
/
data.ts
File metadata and controls
117 lines (102 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import CloudGraph from '@cloudgraph/sdk'
import { AWSError } from 'aws-sdk/lib/error'
import { Config } from 'aws-sdk/lib/config'
import isEmpty from 'lodash/isEmpty'
import flatMap from 'lodash/flatMap'
import groupBy from 'lodash/groupBy'
import awsLoggerText from '../../properties/logger'
import { initTestEndpoint, setAwsRetryOptions } from '../../utils'
import AwsErrorLog from '../../utils/errorLog'
import { API_GATEWAY_CUSTOM_DELAY } from '../../config/constants'
import OpsWorks, { App, DescribeAppsResult } from 'aws-sdk/clients/opsworks'
import OpsWorksStack from '../opsworksStack'
import { RawAwsOpsWorksStack } from '../opsworksStack/data'
const lt = { ...awsLoggerText }
const { logger } = CloudGraph
const serviceName = 'OpsWorks Stack'
const errorLog = new AwsErrorLog(serviceName)
const endpoint = initTestEndpoint(serviceName)
const customRetrySettings = setAwsRetryOptions({
baseDelay: API_GATEWAY_CUSTOM_DELAY,
})
export const getOpsWorksAppsForRegion = async (
opsWorks: OpsWorks,
StackId: string,
): Promise<App[]> =>
new Promise(async resolve => {
const listAllApps = (): void => {
try {
opsWorks.describeApps(
{StackId},
(err: AWSError, data: DescribeAppsResult) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'opsWorks:describeApps',
err,
})
}
if (isEmpty(data)) {
return resolve([])
}
const { Apps: apps = [] } = data || {}
logger.debug(lt.fetchedOpsWorksApps(apps.length))
resolve(apps)
}
);
} catch (error) {
resolve([])
}
}
listAllApps()
})
export interface RawAwsOpsWorksApp extends Omit<App, 'tags'> {
region: string
account
}
export default async ({
regions,
config,
account,
}: {
account: string
regions: string
config: Config
}): Promise<{
[region: string]: RawAwsOpsWorksApp[]
}> =>
new Promise(async resolve => {
const opsWorksResult: RawAwsOpsWorksApp[] = []
const opsWorksStackClass = new OpsWorksStack({ logger: CloudGraph.logger })
const stacksResult = await opsWorksStackClass.getData({
...config,
regions,
})
const opsWorksStacks: RawAwsOpsWorksStack[] = flatMap(stacksResult)
const regionPromises = regions.split(',').map(region => {
const opsWorks = new OpsWorks({
...config,
region,
endpoint,
...customRetrySettings,
})
return new Promise<void>(async resolveOpsWorksData => {
// Get OpsWorks Apps Data
opsWorksStacks.map(async ({StackId}: RawAwsOpsWorksStack) => {
const opsWorksApps = await getOpsWorksAppsForRegion(opsWorks, StackId)
if (!isEmpty(opsWorksApps)) {
for (const app of opsWorksApps) {
opsWorksResult.push({
...app,
region,
account,
})
}
}
})
resolveOpsWorksData()
})
})
await Promise.all(regionPromises)
errorLog.reset()
resolve(groupBy(opsWorksResult, 'region'))
})