diff --git a/README.md b/README.md index 08cdce7..91ad0aa 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ CloudGraph Tencent Provider will ask you what regions you would like to crawl an | Service | Relations | | ------------------- | ------------------- | +| camGroup | | | camPolicy | | | camUser | | | ccn | ccnAttachment | diff --git a/src/enums/schemasMap.ts b/src/enums/schemasMap.ts index 6c0f4b0..1c8039c 100644 --- a/src/enums/schemasMap.ts +++ b/src/enums/schemasMap.ts @@ -4,6 +4,7 @@ import services from './services' * schemasMap is an object that contains schemas name by resource */ export default { + [services.camGroup]: 'tencentCamGroup', [services.camPolicy]: 'tencentCamPolicy', [services.camUser]: 'tencentCamUser', [services.ccn]: 'tencentCcn', diff --git a/src/enums/serviceAliases.ts b/src/enums/serviceAliases.ts index ad86d46..e18f749 100644 --- a/src/enums/serviceAliases.ts +++ b/src/enums/serviceAliases.ts @@ -1,4 +1,5 @@ export default { + camGroup: 'camGroups', camPolicy: 'camPolicies', ccn: 'ccns', ccnAttachment: 'ccnAttachments', diff --git a/src/enums/serviceMap.ts b/src/enums/serviceMap.ts index 745bedb..941334c 100644 --- a/src/enums/serviceMap.ts +++ b/src/enums/serviceMap.ts @@ -15,12 +15,14 @@ import TencentVpnGatewayRoute from '../services/vpnGatewayRoute' import TencentCustomerGateway from '../services/customerGateway' import TencentCamUser from '../services/camUser' import TencentVpnConnection from '../services/vpnConnection' +import TencentCamGroup from '../services/camGroup' /** * serviceMap is an object that contains all currently supported services * serviceMap is used by the serviceFactory to produce instances of service classes */ export default { + [services.camGroup]: TencentCamGroup, [services.camPolicy]: TencentCamPolicy, [services.camUser]: TencentCamUser, [services.ccn]: TencentCcn, diff --git a/src/enums/services.ts b/src/enums/services.ts index 501de7b..66c571f 100644 --- a/src/enums/services.ts +++ b/src/enums/services.ts @@ -1,4 +1,5 @@ export default { + camGroup: 'camGroup', camPolicy: 'camPolicy', camUser: 'camUser', ccn: 'ccn', diff --git a/src/services/camGroup/data.ts b/src/services/camGroup/data.ts new file mode 100644 index 0000000..91017aa --- /dev/null +++ b/src/services/camGroup/data.ts @@ -0,0 +1,52 @@ +import * as tencentcloud from 'tencentcloud-sdk-nodejs' +import { ClientConfig } from 'tencentcloud-sdk-nodejs/tencentcloud/common/interface' +import CloudGraph from '@cloudgraph/sdk' +import groupBy from 'lodash/groupBy' +import isEmpty from 'lodash/isEmpty' +import { GroupInfo } from 'tencentcloud-sdk-nodejs/tencentcloud/services/cam/v20190116/cam_models' +import loggerText from '../../properties/logger' +import { TencentServiceInput } from '../../types' +import { initTestEndpoint, generateTencentErrorLog } from '../../utils' +import { GLOBAL_REGION } from '../../config/constants' + +const lt = { ...loggerText } +const { logger } = CloudGraph +export const serviceName = 'CamGroup' +const apiEndpoint = initTestEndpoint(serviceName) + +export interface RawTencentCamGroup extends GroupInfo { + id: string + region: string +} + +export default async ({ + config, +}: TencentServiceInput): Promise<{ + [region: string]: RawTencentCamGroup[] +}> => + new Promise(async resolve => { + const camGroupList: RawTencentCamGroup[] = [] + + try { + const CamClient = tencentcloud.cam.v20190116.Client + const clientConfig: ClientConfig = { credential: config, profile: { httpProfile: { endpoint: apiEndpoint } } } + const cam = new CamClient(clientConfig) + + const response = await cam.ListGroups(null) + + if (response && !isEmpty(response.GroupInfo)) { + for (const instance of response.GroupInfo) { + camGroupList.push({ + id: `${instance.GroupId}`, + ...instance, + region: GLOBAL_REGION, + }) + } + } + } catch (error) { + generateTencentErrorLog(serviceName, 'cam:ListGroups', error) + } + + logger.debug(lt.foundResources(serviceName, camGroupList.length)) + resolve(groupBy(camGroupList, 'region')) + }) diff --git a/src/services/camGroup/format.ts b/src/services/camGroup/format.ts new file mode 100644 index 0000000..60e4e44 --- /dev/null +++ b/src/services/camGroup/format.ts @@ -0,0 +1,24 @@ +import { TencentCamGroup } from '../../types/generated' +import { RawTencentCamGroup } from './data' + +export default ({ + service, +}: { + service: RawTencentCamGroup +}): TencentCamGroup => { + const { + id, + region, + GroupName: name, + CreateTime: createTime, + Remark: remark + } = service + + return { + id, + region, + name, + createTime, + remark, + } +} diff --git a/src/services/camGroup/index.ts b/src/services/camGroup/index.ts new file mode 100644 index 0000000..5769311 --- /dev/null +++ b/src/services/camGroup/index.ts @@ -0,0 +1,15 @@ +import { Service } from '@cloudgraph/sdk' +import BaseService from '../base' +import format from './format' +import getData from './data' +import { getMutation } from '../../utils' +import services from '../../enums/services' +import schemasMap from '../../enums/schemasMap' + +export default class TencentCamGroup extends BaseService implements Service { + format = format.bind(this) + + getData = getData.bind(this) + + mutation = getMutation(schemasMap[services.camGroup]) +} diff --git a/src/services/camGroup/schema.graphql b/src/services/camGroup/schema.graphql new file mode 100644 index 0000000..7a132b8 --- /dev/null +++ b/src/services/camGroup/schema.graphql @@ -0,0 +1,5 @@ +type tencentCamGroup implements tencentBaseService @key(fields: "id") { + name: String @search(by: [hash, regexp]) + createTime: String @search(by: [hash, regexp]) + remark: String @search(by: [hash, regexp]) +} diff --git a/src/types/generated.ts b/src/types/generated.ts index e38c1fb..9e389cf 100644 --- a/src/types/generated.ts +++ b/src/types/generated.ts @@ -17,6 +17,12 @@ export type TencentBaseService = { region?: Maybe; }; +export type TencentCamGroup = TencentBaseService & { + createTime?: Maybe; + name?: Maybe; + remark?: Maybe; +}; + export type TencentCamPolicy = TencentBaseService & { addTime?: Maybe; attachEntityBoundaryCount?: Maybe;