Skip to content

Commit a7de139

Browse files
committed
Merge branch 'feature/CG-668-firestore' into 'main'
Resolve CG-668 "Feature/ firestore" Closes CG-668 See merge request auto-cloud/cloudgraph/provider/cloudgraph-provider-gcp!48
2 parents 402ddf7 + 6b93c39 commit a7de139

14 files changed

Lines changed: 211 additions & 5 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ CloudGraph GCP Provider will ask you what regions you would like to crawl and wi
8686
| kmsCryptoKeys | iamPolicy, kmsKeyRing, project |
8787
| dnsManagedZone | project |
8888
| dnsPolicy | project, network |
89+
| firestores | project |
8990
| firewall | network, project |
9091
| folder | iamPolicy, organization, project |
9192
| kmsKeyRing | kmsCryptoKeys, project |

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
"@google-cloud/bigquery-reservation": "^1.4.0",
4141
"@google-cloud/compute": "^3.0.0",
4242
"@google-cloud/dataproc": "^3.2.0",
43+
"@google-cloud/datastore": "^6.6.2",
4344
"@google-cloud/dns": "^2.2.3",
45+
"@google-cloud/firestore": "^5.0.2",
4446
"@google-cloud/functions": "^1.2.0",
4547
"@google-cloud/kms": "^2.10.0",
4648
"@google-cloud/logging": "^9.6.4",

src/enums/schemasMap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ export default {
4747
[services.dataprocAutoscalingPolicy]: 'gcpDataprocAutoscalingPolicy',
4848
[services.dataprocJob]: 'gcpDataprocJob',
4949
[services.dataprocWorkflowTemplate]: 'gcpDataprocWorkflowTemplate',
50+
[services.firestoreDatabase]: 'gcpFirestoreDatabase',
5051
tag: 'gcpTag',
5152
}

src/enums/serviceMap.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import GcpDataprocCluster from '../services/dataprocCluster'
4343
import GcpDataprocAutoscalingPolicy from '../services/dataprocAutoscalingPolicy'
4444
import GcpDataprocJob from '../services/dataprocJob'
4545
import GcpDataprocWorkflowTemplate from '../services/dataprocWorkflowTemplate'
46+
import GcpFirestoreDatabase from '../services/firestore'
47+
4648
/**
4749
* serviceMap is an object that contains all currently supported services
4850
* serviceMap is used by the serviceFactory to produce instances of service classes
@@ -91,5 +93,6 @@ export default {
9193
[services.dataprocAutoscalingPolicy]: GcpDataprocAutoscalingPolicy,
9294
[services.dataprocJob]: GcpDataprocJob,
9395
[services.dataprocWorkflowTemplate]: GcpDataprocWorkflowTemplate,
96+
[services.firestoreDatabase]: GcpFirestoreDatabase,
9497
tag: GcpTag,
9598
}

src/enums/services.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default {
4646
bigQueryDataTransferRun: 'bigQueryDataTransferRun',
4747
// databaseMigration: 'database-migration',
4848
// datastore: 'datastore',
49-
// firestore: 'firestore',
49+
firestoreDatabase: 'firestoreDatabases',
5050
cloudRouter: 'cloudRouters',
5151
firewall: 'firewall',
5252
// spanner: 'spanner',

src/services/firestore/data.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import CloudGraph from '@cloudgraph/sdk'
2+
import groupBy from 'lodash/groupBy'
3+
import { Datastore } from '@google-cloud/datastore'
4+
import gcpLoggerText from '../../properties/logger'
5+
import { GcpServiceInput } from '../../types'
6+
import { initTestEndpoint, generateGcpErrorLog } from '../../utils'
7+
import { GLOBAL_REGION } from '../../config/constants'
8+
import { listData } from '../../utils/fetchUtils'
9+
10+
const lt = { ...gcpLoggerText }
11+
const { logger } = CloudGraph
12+
const serviceName = 'Firestore Database'
13+
const apiEndpoint = initTestEndpoint(serviceName)
14+
15+
export interface RawGcpFirestoreDatabase {
16+
id: string
17+
projectId: string
18+
region: string
19+
name: string
20+
createTime: string
21+
updateTime: string
22+
locationId: string
23+
type: string
24+
concurrencyMode: string
25+
appEngineIntegrationMode: string
26+
keyPrefix: string
27+
}
28+
29+
export default async ({
30+
config,
31+
}: GcpServiceInput): Promise<{
32+
[region: string]: RawGcpFirestoreDatabase[]
33+
}> =>
34+
new Promise(async resolve => {
35+
const firestoreDatabaseList: RawGcpFirestoreDatabase[] = []
36+
const { projectId } = config
37+
38+
try {
39+
const service = new Datastore({ ...config, apiEndpoint })
40+
const data = await listData({
41+
accessToken: await service.auth.getAccessToken(),
42+
apiUri: `https://firestore.googleapis.com/v1/projects/${projectId}/databases`,
43+
dataFieldName: 'databases',
44+
})
45+
46+
for (const {name, createTime, updateTime, locationId, type, concurrencyMode, appEngineIntegrationMode, keyPrefix} of data) {
47+
firestoreDatabaseList.push({
48+
id: name,
49+
projectId,
50+
region: GLOBAL_REGION,
51+
name,
52+
createTime,
53+
updateTime,
54+
locationId,
55+
type,
56+
concurrencyMode,
57+
appEngineIntegrationMode,
58+
keyPrefix,
59+
})
60+
}
61+
} catch (error) {
62+
generateGcpErrorLog(serviceName, 'firestore:listDatabase', error)
63+
}
64+
65+
logger.debug(lt.foundResources(serviceName, firestoreDatabaseList.length))
66+
resolve(groupBy(firestoreDatabaseList, 'region'))
67+
})

src/services/firestore/format.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { GcpFirestoreDatabase } from '../../types/generated'
2+
import { RawGcpFirestoreDatabase } from './data'
3+
4+
export default ({
5+
service,
6+
}: {
7+
service: RawGcpFirestoreDatabase
8+
region: string
9+
}): GcpFirestoreDatabase => {
10+
const {
11+
id,
12+
projectId,
13+
region,
14+
name,
15+
createTime,
16+
updateTime,
17+
locationId,
18+
type,
19+
concurrencyMode,
20+
appEngineIntegrationMode,
21+
keyPrefix,
22+
} = service
23+
24+
return {
25+
id,
26+
projectId,
27+
region,
28+
name,
29+
createTime,
30+
updateTime,
31+
locationId,
32+
type,
33+
concurrencyMode,
34+
appEngineIntegrationMode,
35+
keyPrefix,
36+
}
37+
}

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

src/services/firestore/mutation.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default `mutation($input: [AddgcpFirestoreDatabaseInput!]!) {
2+
addgcpFirestoreDatabase(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
type gcpFirestoreDatabase 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+
createTime: String @search(by: [hash, regexp])
9+
updateTime: String @search(by: [hash, regexp])
10+
locationId: String @search(by: [hash, regexp])
11+
type: String @search(by: [hash, regexp])
12+
concurrencyMode: String @search(by: [hash, regexp])
13+
appEngineIntegrationMode: String @search(by: [hash, regexp])
14+
keyPrefix: String @search(by: [hash, regexp])
15+
project: [gcpProject] @hasInverse(field: firestoreDatabases)
16+
}

0 commit comments

Comments
 (0)