Skip to content

Commit 4090630

Browse files
committed
feat: Add transit gateway routes
1 parent 0b4f774 commit 4090630

5 files changed

Lines changed: 99 additions & 3 deletions

File tree

src/services/routeTable/schema.graphql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ type awsRouteTable implements awsBaseService @key(fields: "arn") {
77
tags: [awsRawTag]
88
subnet: [awsSubnet] @hasInverse(field: routeTable) #change to plural
99
vpc: [awsVpc] @hasInverse(field: routeTables)
10-
transitGateway: [awsTransitGateway] @hasInverse(field: routeTable)
11-
transitGatewayAttachment: [awsTransitGatewayAttachment] @hasInverse(field: routeTable)
1210
vpcEndpoints: [awsVpcEndpoint] @hasInverse(field: routeTables)
1311
}
1412

src/services/transitGatewayRouteTable/data.ts

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import isEmpty from 'lodash/isEmpty'
55
import EC2, {
66
DescribeTransitGatewayRouteTablesRequest,
77
DescribeTransitGatewayRouteTablesResult,
8+
SearchTransitGatewayRoutesRequest,
9+
SearchTransitGatewayRoutesResult,
10+
TransitGatewayRoute,
811
TransitGatewayRouteTable,
912
} from 'aws-sdk/clients/ec2'
1013

@@ -83,13 +86,51 @@ const listTransitGatewayRouteTablesData = async ({
8386
listTransitGatewayRouteTables()
8487
})
8588

89+
const searchTransitGatewayRoutes = async ({
90+
ec2,
91+
transitGatewayRouteTableId,
92+
}: {
93+
ec2: EC2
94+
transitGatewayRouteTableId: string
95+
}): Promise<TransitGatewayRoute[]> =>
96+
new Promise<TransitGatewayRoute[]>(resolve => {
97+
const args: SearchTransitGatewayRoutesRequest = {
98+
TransitGatewayRouteTableId: transitGatewayRouteTableId,
99+
Filters: [
100+
{
101+
Name: 'type',
102+
Values: ['propagated', 'static'],
103+
},
104+
],
105+
}
106+
ec2.searchTransitGatewayRoutes(
107+
args,
108+
(err: AWSError, data: SearchTransitGatewayRoutesResult) => {
109+
if (err) {
110+
errorLog.generateAwsErrorLog({
111+
functionName: 'ec2:searchTransitGatewayRoutes',
112+
err,
113+
})
114+
}
115+
116+
if (!isEmpty(data)) {
117+
const { Routes: routes = [] } = data
118+
resolve(routes)
119+
}
120+
121+
resolve([])
122+
}
123+
)
124+
})
125+
86126
/**
87127
* Transit Gateway Route Table
88128
*/
89129
export interface RawAwsTransitGatewayRouteTable
90130
extends Omit<TransitGatewayRouteTable, 'Tags'> {
91131
region: string
92132
Tags?: TagMap
133+
Routes?: TransitGatewayRoute[]
93134
}
94135

95136
export default async ({
@@ -103,6 +144,7 @@ export default async ({
103144
}> =>
104145
new Promise(async resolve => {
105146
const transitGatewayRouteTableResult: RawAwsTransitGatewayRouteTable[] = []
147+
const routesPromises = []
106148

107149
const regionPromises = regions.split(',').map(region => {
108150
const ec2 = new EC2({ ...config, region, endpoint })
@@ -130,7 +172,30 @@ export default async ({
130172
})
131173

132174
await Promise.all(regionPromises)
133-
errorLog.reset()
134175

176+
transitGatewayRouteTableResult.map(
177+
(
178+
{ TransitGatewayRouteTableId: transitGatewayRouteTableId, region },
179+
idx
180+
) => {
181+
const ec2 = new EC2({ ...config, region, endpoint })
182+
const routePromise = new Promise<void>(async resolveRoute => {
183+
const routes: TransitGatewayRoute[] =
184+
await searchTransitGatewayRoutes({
185+
ec2,
186+
transitGatewayRouteTableId,
187+
})
188+
transitGatewayRouteTableResult[idx] = {
189+
...transitGatewayRouteTableResult[idx],
190+
Routes: routes || [],
191+
}
192+
resolveRoute()
193+
})
194+
routesPromises.push(routePromise)
195+
}
196+
)
197+
await Promise.all(routesPromises)
198+
199+
errorLog.reset()
135200
resolve(groupBy(transitGatewayRouteTableResult, 'region'))
136201
})

src/services/transitGatewayRouteTable/format.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import cuid from 'cuid'
12
import { formatTagsFromMap } from '../../utils/format'
23
import { RawAwsTransitGatewayRouteTable } from './data'
34
import { AwsTransitGatewayRouteTable } from '../../types/generated'
@@ -23,6 +24,7 @@ export default ({
2324
DefaultPropagationRouteTable: defaultPropagationRouteTable,
2425
CreationTime: creationTime,
2526
Tags: tags,
27+
Routes: routes = [],
2628
} = rawData
2729

2830
const transitGatewayRouteTable = {
@@ -35,6 +37,14 @@ export default ({
3537
defaultPropagationRouteTable,
3638
creationTime: creationTime?.toISOString(),
3739
tags: formatTagsFromMap(tags),
40+
routes:
41+
routes?.map(r => ({
42+
id: cuid(),
43+
destinationCidrBlock: r.DestinationCidrBlock,
44+
type: r.Type,
45+
state: r.State,
46+
prefixListId: r.PrefixListId,
47+
})) || [],
3848
}
3949

4050
return transitGatewayRouteTable

src/services/transitGatewayRouteTable/schema.graphql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
1+
type awsTransitGatewayRoute
2+
@generate(
3+
query: { get: false, query: true, aggregate: false }
4+
mutation: { add: false, delete: false }
5+
subscription: false
6+
) {
7+
id: String! @id
8+
destinationCidrBlock: String @search(by: [hash, regexp])
9+
type: String @search(by: [hash, regexp])
10+
state: String @search(by: [hash, regexp])
11+
prefixListId: String @search(by: [hash])
12+
}
13+
114
type awsTransitGatewayRouteTable implements awsBaseService @key(fields: "arn") {
215
state: String @search(by: [hash, regexp])
316
defaultAssociationRouteTable: Boolean @search
417
defaultPropagationRouteTable: Boolean @search
518
creationTime: DateTime @search(by: [day])
19+
routes: [awsTransitGatewayRoute]
620
tags: [awsRawTag]
721
transitGateway: [awsTransitGateway] @hasInverse(field: routeTables)
822
transitGatewayAttachment: [awsTransitGatewayAttachment] @hasInverse(field: routeTable)

src/types/generated.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4338,10 +4338,19 @@ export type AwsTransitGatewayAttachment = {
43384338
vpnConnection?: Maybe<Array<Maybe<AwsVpnConnection>>>;
43394339
};
43404340

4341+
export type AwsTransitGatewayRoute = {
4342+
destinationCidrBlock?: Maybe<Scalars['String']>;
4343+
id: Scalars['String'];
4344+
prefixListId?: Maybe<Scalars['String']>;
4345+
state?: Maybe<Scalars['String']>;
4346+
type?: Maybe<Scalars['String']>;
4347+
};
4348+
43414349
export type AwsTransitGatewayRouteTable = AwsBaseService & {
43424350
creationTime?: Maybe<Scalars['DateTime']>;
43434351
defaultAssociationRouteTable?: Maybe<Scalars['Boolean']>;
43444352
defaultPropagationRouteTable?: Maybe<Scalars['Boolean']>;
4353+
routes?: Maybe<Array<Maybe<AwsTransitGatewayRoute>>>;
43454354
state?: Maybe<Scalars['String']>;
43464355
tags?: Maybe<Array<Maybe<AwsRawTag>>>;
43474356
transitGateway?: Maybe<Array<Maybe<AwsTransitGateway>>>;

0 commit comments

Comments
 (0)