Skip to content

Commit ae111e8

Browse files
authored
Merge pull request #37 from cloudgraphdev/feature/CG-1272
feat: Add backupVaults, backupInstances and backupPolicies services
2 parents af80fa0 + 7739244 commit ae111e8

51 files changed

Lines changed: 2192 additions & 923 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ CloudGraph needs read permissions in order to ingest your data. To keep things e
5151
| authRoleAssignment | adApplication, adGroup, adServicePrincipal, adUser, authRoleDefinition |
5252
| authRoleDefinition | actionGroup, authRoleAssignment |
5353
| autoProvisioningSettings | |
54-
| backupInstance | resourceGroup |
55-
| backupPolicy | resourceGroup |
54+
| backupInstance | backupVaults, resourceGroup |
55+
| backupPolicy | backupVaults, resourceGroup |
56+
| backupVaults | backupInstances, backupPolicies, resourceGroup |
5657
| cdnCustomDomains | cdnEndpoints, resourceGroup |
5758
| cdnEndpoints | cdnCustomDomains, cdnOrigins, cdnOriginGroups, cdnProfiles, resourceGroup |
5859
| cdnProfiles | cdnEndpoints, resourceGroup |
@@ -92,7 +93,9 @@ CloudGraph needs read permissions in order to ingest your data. To keep things e
9293
| postgreSqlServers | resourceGroup, databasePostgreSql |
9394
| privateDns | resourceGroup |
9495
| publicIp | networkInterface, resourceGroup |
95-
| recoveryVaults | resourceGroup |
96+
| recoveryInstances | recoveryVaults, resourceGroup |
97+
| recoveryPolicies | recoveryVaults, resourceGroup |
98+
| recoveryVaults | recoveryInstances, recoveryPolicies, resourceGroup |
9699
| redisCaches | resourceGroup |
97100
| replicationAppliances | resourceGroup |
98101
| replicationCenters | resourceGroup |

src/enums/relations.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ export default {
1515
services.cdnOriginGroups,
1616
],
1717
[services.dataFactory]: [services.integrationRuntime],
18-
// [services.backupVault]: [services.backupInstance, services.backupPolicy],
18+
[services.backupVaults]: [services.backupInstances, services.backupPolicies],
19+
[services.recoveryVaults]: [services.recoveryInstances, services.recoveryPolicies],
1920
[services.synapseWorkspaces]: [
2021
services.synapseBigDataPools,
2122
services.synapseSqlPools,

src/enums/schemasMap.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ export default {
2323
[services.authRoleAssignment]: 'azureAuthRoleAssignment',
2424
[services.authRoleDefinition]: 'azureAuthRoleDefinition',
2525
[services.autoProvisioningSettings]: 'azureAutoProvisioningSetting',
26-
// [services.backupVault]: 'azureBackupVault',
27-
[services.backupInstance]: 'azureBackupInstance',
28-
[services.backupPolicy]: 'azureBackupPolicy',
26+
[services.backupVaults]: 'azureBackupVault',
27+
[services.backupInstances]: 'azureBackupInstance',
28+
[services.backupPolicies]: 'azureBackupPolicy',
2929
[services.billing]: 'azureBilling',
3030
[services.cdnCustomDomains]: 'azureCdnCustomDomain',
3131
[services.cdnEndpoints]: 'azureCdnEndpoint',
@@ -67,6 +67,8 @@ export default {
6767
[services.privateDns]: 'azurePrivateDnsZone',
6868
[services.publicIp]: 'azurePublicIp',
6969
[services.recoveryVaults]: 'azureRecoveryVault',
70+
[services.recoveryInstances]: 'azureRecoveryInstance',
71+
[services.recoveryPolicies]: 'azureRecoveryPolicy',
7072
[services.redisCaches]: 'azureRedisCache',
7173
[services.replicationAppliances]: 'azureReplicationAppliance',
7274
[services.replicationCenters]: 'azureReplicationCenter',

src/enums/serviceAliases.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ export default {
1212
[services.authRoleAssignment]: 'authRoleAssignments',
1313
[services.authRoleDefinition]: 'authRoleDefinitions',
1414
[services.autoProvisioningSettings]: 'autoProvisioningSettings',
15-
// [services.backupVault]: 'backupVaults',
16-
[services.backupInstance]: 'backupInstances',
17-
[services.backupPolicy]: 'backupPolicies',
15+
[services.backupVaults]: 'backupVaults',
16+
[services.backupInstances]: 'backupInstances',
17+
[services.backupPolicies]: 'backupPolicies',
1818
[services.cdnCustomDomains]: 'cdnCustomDomains',
1919
[services.cdnEndpoints]: 'cdnEndpoints',
2020
[services.cdnOriginGroups]: 'cdnOriginGroups',
@@ -55,6 +55,8 @@ export default {
5555
[services.privateDns]: 'privateDnsZones',
5656
[services.publicIp]: 'publicIps',
5757
[services.recoveryVaults]: 'recoveryVaults',
58+
[services.recoveryInstances]: 'recoveryInstances',
59+
[services.recoveryPolicies]: 'recoveryPolicies',
5860
[services.redisCaches]: 'redisCaches',
5961
[services.replicationAppliances]: 'replicationAppliances',
6062
[services.replicationCenters]: 'replicationCenters',

src/enums/serviceMap.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ import AzurePostgreSqlServer from '../services/postgreSqlServers'
5151
import AzurePrivateDns from '../services/privateDns'
5252
import AzurePublicIp from '../services/publicIp'
5353
import AzureRecoveryVault from '../services/recoveryVaults'
54+
import AzureRecoveryInstance from '../services/recoveryInstances'
55+
import AzureRecoveryPolicy from '../services/recoveryPolicies'
5456
import AzureRedisCache from '../services/redisCache'
5557
import AzureReplicationAppliance from '../services/replicationAppliances'
5658
import AzureReplicationCenter from '../services/replicationCenters'
@@ -79,9 +81,9 @@ import AzureCosmosDb from '../services/cosmosDb'
7981
import AzureAppInsights from '../services/appInsights'
8082
import AzureIntegrationRuntime from '../services/integrationRuntimes'
8183
import AzureServiceBus from '../services/serviceBus'
82-
// import AzureBackupVault from '../services/backupVault'
83-
import AzureBackupInstance from '../services/backupInstance'
84-
import AzureBackupPolicy from '../services/backupPolicy'
84+
import AzureBackupVault from '../services/backupVaults'
85+
import AzureBackupInstance from '../services/backupInstances'
86+
import AzureBackupPolicy from '../services/backupPolicies'
8587
import AzureBilling from '../services/billing'
8688
import AzureLogProfiles from '../services/logProfiles'
8789
import Subscription from '../services/subscription'
@@ -111,9 +113,9 @@ export default {
111113
[services.authRoleAssignment]: AzureAuthRoleAssignment,
112114
[services.authRoleDefinition]: AzureAuthRoleDefinition,
113115
[services.autoProvisioningSettings]: AzureAutoProvisioningSettings,
114-
// [services.backupVault]: AzureBackupVault,
115-
[services.backupInstance]: AzureBackupInstance,
116-
[services.backupPolicy]: AzureBackupPolicy,
116+
[services.backupVaults]: AzureBackupVault,
117+
[services.backupInstances]: AzureBackupInstance,
118+
[services.backupPolicies]: AzureBackupPolicy,
117119
[services.billing]: AzureBilling,
118120
[services.cdnCustomDomains]: AzureCdnCustomDomains,
119121
[services.cdnEndpoints]: AzureCdnEndpoints,
@@ -155,6 +157,8 @@ export default {
155157
[services.privateDns]: AzurePrivateDns,
156158
[services.publicIp]: AzurePublicIp,
157159
[services.recoveryVaults]: AzureRecoveryVault,
160+
[services.recoveryInstances]: AzureRecoveryInstance,
161+
[services.recoveryPolicies]: AzureRecoveryPolicy,
158162
[services.redisCaches]: AzureRedisCache,
159163
[services.replicationAppliances]: AzureReplicationAppliance,
160164
[services.replicationCenters]: AzureReplicationCenter,

src/enums/services.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ export default {
1717
authRoleAssignment: 'authRoleAssignment',
1818
authRoleDefinition: 'authRoleDefinition',
1919
autoProvisioningSettings: 'autoProvisioningSettings',
20-
// backupVault: 'backupVault',
21-
backupInstance: 'backupInstance',
22-
backupPolicy: 'backupPolicy',
20+
backupVaults: 'backupVaults',
21+
backupInstances: 'backupInstances',
22+
backupPolicies: 'backupPolicies',
2323
billing: 'billing',
2424
cdnCustomDomains: 'cdnCustomDomains',
2525
cdnEndpoints: 'cdnEndpoints',
@@ -61,6 +61,8 @@ export default {
6161
privateDns: 'privateDns',
6262
publicIp: 'publicIp',
6363
recoveryVaults: 'recoveryVaults',
64+
recoveryInstances: 'recoveryInstances',
65+
recoveryPolicies: 'recoveryPolicies',
6466
redisCaches: 'redisCaches',
6567
replicationAppliances: 'replicationAppliances',
6668
replicationCenters: 'replicationCenters',

src/properties/logger.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ export default {
149149
foundPublicIps: (num: number): string => `Found ${num} public ips`,
150150
// Recovery Vaults
151151
foundRecoveryVaults: (num: number): string => `Found ${num} recovery vaults`,
152+
foundRecoveryInstances: (num: number): string =>
153+
`Found ${num} recovery instances`,
154+
foundRecoveryPolicies: (num: number): string => `Found ${num} recovery policies`,
152155
// RedisCache
153156
foundRedisCaches: (num: number): string => `Found ${num} Redis caches`,
154157
// Replication Appliances
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { ServiceConnection } from '@cloudgraph/sdk'
2+
import { isEmpty } from 'lodash'
3+
4+
import services from '../../enums/services'
5+
import { caseInsensitiveEqual } from '../../utils'
6+
import { RawAzureResourceGroup } from '../resourceGroup/data'
7+
import { RawAzureBackupInstanceResource } from './data'
8+
9+
export default ({
10+
service,
11+
data,
12+
region,
13+
}: {
14+
service: RawAzureBackupInstanceResource
15+
data: Array<{ name: string; data: { [property: string]: any[] } }>
16+
region: string
17+
}): {
18+
[property: string]: ServiceConnection[]
19+
} => {
20+
const connections: ServiceConnection[] = []
21+
const { id, resourceGroupId: rgName } = service
22+
23+
/**
24+
* Find resource group related to this backup instance
25+
*/
26+
const resourceGroups: {
27+
name: string
28+
data: { [property: string]: RawAzureResourceGroup[] }
29+
} = data.find(({ name }) => name === services.resourceGroup)
30+
31+
if (resourceGroups?.data?.[region]) {
32+
const resourceGroupsInRegion: RawAzureResourceGroup[] = resourceGroups.data[
33+
region
34+
].filter(({ name: resourceGroupName }: RawAzureResourceGroup) =>
35+
caseInsensitiveEqual(resourceGroupName, rgName)
36+
)
37+
38+
if (!isEmpty(resourceGroupsInRegion)) {
39+
for (const rg of resourceGroupsInRegion) {
40+
connections.push({
41+
id: rg.id,
42+
resourceType: services.resourceGroup,
43+
relation: 'child',
44+
field: 'resourceGroup',
45+
})
46+
}
47+
}
48+
}
49+
50+
const result = {
51+
[id]: connections,
52+
}
53+
return result
54+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import CloudGraph from '@cloudgraph/sdk'
2+
3+
import azureLoggerText from '../../properties/logger'
4+
import { AzureRestApiNewClientParams, AzureServiceInput, BackupInstanceResource } from '../../types'
5+
import { tryCatchWrapper } from '../../utils'
6+
import { RestApiClient } from '../../utils/apiUtils'
7+
import { lowerCaseLocation } from '../../utils/format'
8+
import getAzureVaults, { RawAzureBackupVault } from '../backupVaults/data'
9+
10+
const { logger } = CloudGraph
11+
const lt = { ...azureLoggerText }
12+
const serviceName = 'Backup Instances'
13+
14+
export interface RawAzureBackupInstanceResource extends BackupInstanceResource {
15+
region: string
16+
resourceGroupId: string
17+
vaultName: string
18+
}
19+
20+
export default async ({
21+
regions,
22+
config,
23+
rawData,
24+
opts,
25+
}: AzureServiceInput): Promise<{
26+
[property: string]: RawAzureBackupInstanceResource[]
27+
}> => {
28+
try {
29+
const client = new RestApiClient({
30+
config,
31+
options: { version: '2021-01-01' },
32+
} as AzureRestApiNewClientParams)
33+
34+
const vaults: RawAzureBackupVault[] =
35+
Object.values(
36+
await getAzureVaults({
37+
regions,
38+
config,
39+
rawData,
40+
opts,
41+
})
42+
)?.reduce((acc, val) => acc.concat(val), []) || []
43+
44+
const items: RawAzureBackupInstanceResource[] = []
45+
await tryCatchWrapper(
46+
async () => {
47+
await Promise.all(
48+
(vaults || []).map(async ({ name: vaultName, resourceGroupId }) => {
49+
const backupInstances = await client.listData({
50+
path: `/resourceGroups/${resourceGroupId}/providers/Microsoft.DataProtection/backupVaults/${vaultName}/backupInstances`,
51+
})
52+
for (const item of backupInstances) {
53+
if (item) {
54+
const { location, ...rest } = item
55+
const region =
56+
(location && lowerCaseLocation(location)) || 'global'
57+
items.push({
58+
...rest,
59+
region,
60+
resourceGroupId,
61+
vaultName,
62+
})
63+
}
64+
}
65+
})
66+
)
67+
logger.debug(lt.foundBackupInstances(items.length))
68+
},
69+
{
70+
service: serviceName,
71+
client,
72+
scope: 'backupInstances',
73+
operation: 'list',
74+
}
75+
)
76+
77+
const result: { [property: string]: RawAzureBackupInstanceResource[] } = {}
78+
await Promise.all(
79+
items
80+
.filter(i => i)
81+
.map(async ({ region, ...rest }) => {
82+
if (regions.includes(region)) {
83+
if (!result[region]) {
84+
result[region] = []
85+
}
86+
result[region].push({
87+
region,
88+
...rest,
89+
})
90+
}
91+
})
92+
)
93+
return result
94+
} catch (e) {
95+
logger.error(e)
96+
return {}
97+
}
98+
}

0 commit comments

Comments
 (0)