From 112f1d561208e122b36b51e842f2802cf1ee76be Mon Sep 17 00:00:00 2001 From: James Zhou Date: Mon, 9 May 2022 22:58:58 -0500 Subject: [PATCH] feat(routeTable): add routeTable --- src/enums/schemasMap.ts | 1 + src/enums/serviceAliases.ts | 1 + src/enums/serviceMap.ts | 2 + src/enums/services.ts | 1 + src/services/routeTable/data.ts | 56 +++++++++++++++++ src/services/routeTable/format.ts | 84 ++++++++++++++++++++++++++ src/services/routeTable/index.ts | 13 ++++ src/services/routeTable/schema.graphql | 57 +++++++++++++++++ src/services/vpc/schema.graphql | 1 + src/types/generated.ts | 41 +++++++++++++ src/utils/format.ts | 8 +++ 11 files changed, 265 insertions(+) create mode 100644 src/services/routeTable/data.ts create mode 100644 src/services/routeTable/format.ts create mode 100644 src/services/routeTable/index.ts create mode 100644 src/services/routeTable/schema.graphql diff --git a/src/enums/schemasMap.ts b/src/enums/schemasMap.ts index 4d1970a..02b3ced 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.routeTable]: 'tencentRouteTable', [services.subnet]: 'tencentSubnet', [services.vpc]: 'tencentVpc', tag: 'tencentTag', diff --git a/src/enums/serviceAliases.ts b/src/enums/serviceAliases.ts index 4b2c26c..30a9b45 100644 --- a/src/enums/serviceAliases.ts +++ b/src/enums/serviceAliases.ts @@ -1,4 +1,5 @@ export default { + routeTable: 'routeTables', subnet: 'subnets', vpc: 'vpcInstances', } \ No newline at end of file diff --git a/src/enums/serviceMap.ts b/src/enums/serviceMap.ts index 83c6a12..009229b 100644 --- a/src/enums/serviceMap.ts +++ b/src/enums/serviceMap.ts @@ -2,12 +2,14 @@ import services from './services' import TencentSubnet from '../services/subnet' import TencentVpc from '../services/vpc' import TencentTag from '../services/tag' +import TencentRouteTable from '../services/routeTable' /** * 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.routeTable]: TencentRouteTable, [services.subnet]: TencentSubnet, [services.vpc]: TencentVpc, tag: TencentTag, diff --git a/src/enums/services.ts b/src/enums/services.ts index 9c55e7b..f7d79d6 100644 --- a/src/enums/services.ts +++ b/src/enums/services.ts @@ -1,4 +1,5 @@ export default { + routeTable: 'routeTable', subnet: 'subnet', vpc: 'vpc', } diff --git a/src/services/routeTable/data.ts b/src/services/routeTable/data.ts new file mode 100644 index 0000000..db918e3 --- /dev/null +++ b/src/services/routeTable/data.ts @@ -0,0 +1,56 @@ +import * as tencentcloud from 'tencentcloud-sdk-nodejs' +import CloudGraph from '@cloudgraph/sdk' +import groupBy from 'lodash/groupBy' +import isEmpty from 'lodash/isEmpty' + +import { ClientConfig } from 'tencentcloud-sdk-nodejs/tencentcloud/common/interface' +import { RouteTable } from 'tencentcloud-sdk-nodejs/tencentcloud/services/vpc/v20170312/vpc_models' +import loggerText from '../../properties/logger' +import { TencentServiceInput } from '../../types' +import { initTestEndpoint, generateTencentErrorLog } from '../../utils' + +export const serviceName = 'RouteTable' + +const lt = { ...loggerText } +const apiEndpoint = initTestEndpoint(serviceName) +const { logger } = CloudGraph + +export interface RawTencentRouteTable extends RouteTable { + id: string + region: string +} + +export default async ({ + regions, + config, +}: TencentServiceInput): Promise<{ + [region: string]: RawTencentRouteTable[] +}> => + new Promise(async resolve => { + const routeTableList: RawTencentRouteTable[] = [] + + for (const region of regions.split(',')) { + try { + const VpcClient = tencentcloud.vpc.v20170312.Client + const clientConfig: ClientConfig = { credential: config, region, profile: { httpProfile: { endpoint: apiEndpoint } } } + const vpc = new VpcClient(clientConfig) + const response = await vpc.DescribeRouteTables({}) + + if (response && !isEmpty(response.RouteTableSet)) { + for (const instance of response.RouteTableSet) { + routeTableList.push({ + id: instance.RouteTableId, + ...instance, + region, + }) + } + } + } catch (error) { + generateTencentErrorLog(serviceName, 'vpc:DescribeRouteTables', error) + } + } + + logger.debug(lt.foundResources(serviceName, routeTableList.length)) + + resolve(groupBy(routeTableList, 'region')) + }) diff --git a/src/services/routeTable/format.ts b/src/services/routeTable/format.ts new file mode 100644 index 0000000..13a2553 --- /dev/null +++ b/src/services/routeTable/format.ts @@ -0,0 +1,84 @@ +import cuid from 'cuid' +import { Route } from 'tencentcloud-sdk-nodejs/tencentcloud/services/vpc/v20170312/vpc_models' +import { TencentRouteTable, TencentRouteTableRoute } from '../../types/generated' +import { formatTagSet } from '../../utils/format' +import { RawTencentRouteTable } from './data' + +const formatRouteTableRoute = (route: Route): TencentRouteTableRoute => { + const { + DestinationCidrBlock: destinationCidrBlock, + GatewayType: gatewayType, + GatewayId: gatewayId, + RouteId: routeId = 0, + RouteDescription: routeDescription = '', + Enabled: enabled = false, + RouteType: routeType = '', + RouteTableId: routeTableId = '', + DestinationIpv6CidrBlock: destinationIpv6CidrBlock = '', + RouteItemId: routeItemId = '', + PublishedToVbc: publishedToVbc = false, + CreatedTime: createdTime = '', + } = route + + return { + id: cuid(), + destinationCidrBlock, + gatewayType, + gatewayId, + routeId, + routeDescription, + enabled, + routeType, + routeTableId, + destinationIpv6CidrBlock, + routeItemId, + publishedToVbc, + createdTime, + } +} + + +export default ({ + service, + region, +}: { + service: RawTencentRouteTable + region: string +}): TencentRouteTable=> { + const { + id, + RouteTableId: routeTableId, + RouteTableName: routeTableName, + AssociationSet = [], + RouteSet = [], + Main: main, + CreatedTime: createdTime = '', + TagSet, + LocalCidrForCcn = [], + } = service + + return { + id, + region, + routeTableId, + routeTableName, + associationSet: AssociationSet.map(({SubnetId: subnetId, RouteTableId: associationRouteTableId}) => { + return { + id: cuid(), + subnetId, + routeTableId: associationRouteTableId, + } + }), + routeSet: RouteSet.map(formatRouteTableRoute), + main, + createdTime, + tags: formatTagSet(TagSet), + localCidrForCcn: LocalCidrForCcn.map(({Cidr: cidr, PublishedToVbc: publishedToVbc}) => { + return { + id: cuid(), + cidr, + publishedToVbc, + } + }) + } +} diff --git a/src/services/routeTable/index.ts b/src/services/routeTable/index.ts new file mode 100644 index 0000000..1258dba --- /dev/null +++ b/src/services/routeTable/index.ts @@ -0,0 +1,13 @@ +import { Service } from '@cloudgraph/sdk' +import BaseService from '../base' +import format from './format' +import getData, { serviceName } from './data' +import { getMutation } from '../../utils' + +export default class TencentRouteTable extends BaseService implements Service { + format = format.bind(this) + + getData = getData.bind(this) + + mutation = getMutation(serviceName) +} diff --git a/src/services/routeTable/schema.graphql b/src/services/routeTable/schema.graphql new file mode 100644 index 0000000..684a0fc --- /dev/null +++ b/src/services/routeTable/schema.graphql @@ -0,0 +1,57 @@ +type tencentRouteTableAssociation + @generate( + query: { get: false, query: true, aggregate: false } + mutation: { add: false, delete: false } + subscription: false + ) + @key(fields: "id") { + id: String! @id + subnetId: String @search(by: [hash, regexp]) + routeTableId: String @search(by: [hash, regexp]) +} + +type tencentRouteTableRoute + @generate( + query: { get: false, query: true, aggregate: false } + mutation: { add: false, delete: false } + subscription: false + ) + @key(fields: "id") { + id: String! @id + destinationCidrBlock: String @search(by: [hash, regexp]) + gatewayType: String @search(by: [hash, regexp]) + gatewayId: String @search(by: [hash, regexp]) + routeId: Int @search + routeDescription: String @search(by: [hash, regexp]) + enabled: Boolean @search + routeType: String @search(by: [hash, regexp]) + routeTableId: String @search(by: [hash, regexp]) + destinationIpv6CidrBlock: String @search(by: [hash, regexp]) + routeItemId: String @search(by: [hash, regexp]) + publishedToVbc: Boolean @search + createdTime: String @search(by: [hash, regexp]) +} + +type tencentRouteTableLocalCidrForCcnn + @generate( + query: { get: false, query: true, aggregate: false } + mutation: { add: false, delete: false } + subscription: false + ) + @key(fields: "id") { + id: String! @id + cidr: String @search(by: [hash, regexp]) + publishedToVbc: Boolean @search +} + +type tencentRouteTable implements tencentBaseService @key(fields: "id") { + routeTableId: String @search(by: [hash, regexp]) + routeTableName: String @search(by: [hash, regexp]) + associationSet: [tencentRouteTableAssociation] + routeSet: [tencentRouteTableRoute] + main: Boolean @search + createdTime: String @search(by: [hash, regexp]) + tags: [tencentRawTag] + localCidrForCcn: [tencentRouteTableLocalCidrForCcnn] + vpcInstances: [tencentVpc] @hasInverse(field: routeTables) +} diff --git a/src/services/vpc/schema.graphql b/src/services/vpc/schema.graphql index 89dd2d0..7b270b5 100644 --- a/src/services/vpc/schema.graphql +++ b/src/services/vpc/schema.graphql @@ -12,6 +12,7 @@ type tencentVpc implements tencentBaseService @key(fields: "id") { tags: [tencentRawTag] assistantCidrSet: [tencentVpcAssistantCidr] subnets: [tencentSubnet] @hasInverse(field: vpcInstances) + routeTables: [tencentRouteTable] @hasInverse(field: vpcInstances) } type tencentVpcAssistantCidr diff --git a/src/types/generated.ts b/src/types/generated.ts index 32d9546..0248b85 100644 --- a/src/types/generated.ts +++ b/src/types/generated.ts @@ -29,6 +29,46 @@ export type TencentRawTag = { value?: Maybe; }; +export type TencentRouteTable = TencentBaseService & { + associationSet?: Maybe>>; + createdTime?: Maybe; + localCidrForCcn?: Maybe>>; + main?: Maybe; + routeSet?: Maybe>>; + routeTableId?: Maybe; + routeTableName?: Maybe; + tags?: Maybe>>; + vpcInstances?: Maybe>>; +}; + +export type TencentRouteTableAssociation = { + id: Scalars['String']; + routeTableId?: Maybe; + subnetId?: Maybe; +}; + +export type TencentRouteTableLocalCidrForCcnn = { + cidr?: Maybe; + id: Scalars['String']; + publishedToVbc?: Maybe; +}; + +export type TencentRouteTableRoute = { + createdTime?: Maybe; + destinationCidrBlock?: Maybe; + destinationIpv6CidrBlock?: Maybe; + enabled?: Maybe; + gatewayId?: Maybe; + gatewayType?: Maybe; + id: Scalars['String']; + publishedToVbc?: Maybe; + routeDescription?: Maybe; + routeId?: Maybe; + routeItemId?: Maybe; + routeTableId?: Maybe; + routeType?: Maybe; +}; + export type TencentSubnet = TencentBaseService & { availableIpAddressCount?: Maybe; cdcId?: Maybe; @@ -67,6 +107,7 @@ export type TencentVpc = TencentBaseService & { ipv6CidrBlock?: Maybe; isDefault?: Maybe; name?: Maybe; + routeTables?: Maybe>>; subnets?: Maybe>>; tags?: Maybe>>; }; diff --git a/src/utils/format.ts b/src/utils/format.ts index ca9eda9..1810dbb 100644 --- a/src/utils/format.ts +++ b/src/utils/format.ts @@ -2,6 +2,14 @@ import cuid from 'cuid' import { TencentKeyValue, TencentRawTag } from '../types/generated' import { TagMap, KeyValueMapMap } from '../types' +export const formatTagSet = (tagSet): Array => { + return tagSet?.map(tag => ({ + id: cuid(), + key: tag.Key, + value: tag.Value, + })) +} + export const formatKeyValueMap = (keyValueMap: KeyValueMapMap): TencentKeyValue[] => { return Object.keys(keyValueMap || {}).map(key => ({ id: cuid(),