Skip to content

Commit 50f9a77

Browse files
committed
refactor changes
1 parent 3d5e718 commit 50f9a77

File tree

8 files changed

+57
-48
lines changed

8 files changed

+57
-48
lines changed

packages/core/src/awsService/ec2/activation.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@
55
import { ExtContext } from '../../shared/extensions'
66
import { Commands } from '../../shared/vscode/commands2'
77
import { telemetry } from '../../shared/telemetry/telemetry'
8-
import { Ec2InstanceNode, refreshExplorerNode } from './explorer/ec2InstanceNode'
8+
import { Ec2InstanceNode, tryRefreshNode } from './explorer/ec2InstanceNode'
99
import { copyTextCommand } from '../../awsexplorer/commands/copyText'
1010
import { Ec2Node } from './explorer/ec2ParentNode'
11-
import { Ec2ConnectionManager } from './model'
1211

13-
export type Ec2ConnectionManagerMap = Map<string, Ec2ConnectionManager>
14-
15-
const connectionManagers = new Map<string, Ec2ConnectionManager>()
12+
const connectionManagers = new Ec2ConnectionManagerMap()
1613
import {
1714
openRemoteConnection,
1815
openTerminal,
@@ -21,6 +18,7 @@ import {
2118
stopInstance,
2219
linkToLaunchInstance,
2320
} from './commands'
21+
import { Ec2ConnectionManagerMap } from './connectionManagerMap'
2422

2523
export async function activate(ctx: ExtContext): Promise<void> {
2624
ctx.extensionContext.subscriptions.push(
@@ -43,23 +41,23 @@ export async function activate(ctx: ExtContext): Promise<void> {
4341
await telemetry.ec2_changeState.run(async (span) => {
4442
span.record({ ec2InstanceState: 'start' })
4543
await startInstance(node)
46-
await refreshExplorerNode(node)
44+
await tryRefreshNode(node)
4745
})
4846
}),
4947

5048
Commands.register('aws.ec2.stopInstance', async (node?: Ec2Node) => {
5149
await telemetry.ec2_changeState.run(async (span) => {
5250
span.record({ ec2InstanceState: 'stop' })
5351
await stopInstance(node)
54-
await refreshExplorerNode(node)
52+
await tryRefreshNode(node)
5553
})
5654
}),
5755

5856
Commands.register('aws.ec2.rebootInstance', async (node?: Ec2Node) => {
5957
await telemetry.ec2_changeState.run(async (span) => {
6058
span.record({ ec2InstanceState: 'reboot' })
6159
await rebootInstance(node)
62-
await refreshExplorerNode(node)
60+
await tryRefreshNode(node)
6361
})
6462
}),
6563

@@ -72,5 +70,5 @@ export async function activate(ctx: ExtContext): Promise<void> {
7270
}
7371

7472
export async function deactivate(): Promise<void> {
75-
connectionManagers.forEach(async (manager) => await manager.closeConnections())
73+
connectionManagers.forEach(async (manager) => await manager.dispose())
7674
}

packages/core/src/awsService/ec2/commands.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,23 @@
55

66
import { Ec2Node } from './explorer/ec2ParentNode'
77
import { SafeEc2Instance, Ec2Client } from '../../shared/clients/ec2Client'
8-
import { Ec2ConnectionManagerMap } from './activation'
98
import { copyToClipboard } from '../../shared/utilities/messages'
109
import { getAwsConsoleUrl } from '../../shared/awsConsole'
1110
import { showRegionPrompter } from '../../auth/utils'
1211
import { openUrl } from '../../shared/utilities/vsCodeUtils'
1312
import { Ec2Prompter, Ec2Selection, instanceFilter } from './prompter'
1413
import { Ec2InstanceNode } from './explorer/ec2InstanceNode'
15-
import { Ec2ConnectionManager } from './model'
14+
import { Ec2ConnectionManagerMap } from './connectionManagerMap'
1615

1716
export async function openTerminal(connectionManagers: Ec2ConnectionManagerMap, node?: Ec2Node) {
1817
const selection = await getSelection(node)
19-
const connectionManager = await getConnectionManager(connectionManagers, selection)
18+
const connectionManager = connectionManagers.getOrInit(selection.region)
2019
await connectionManager.attemptToOpenEc2Terminal(selection)
2120
}
2221

2322
export async function openRemoteConnection(connectionManagers: Ec2ConnectionManagerMap, node?: Ec2Node) {
2423
const selection = await getSelection(node)
25-
const connectionManager = await getConnectionManager(connectionManagers, selection)
24+
const connectionManager = connectionManagers.getOrInit(selection.region)
2625
await connectionManager.tryOpenRemoteConnection(selection)
2726
}
2827

@@ -61,16 +60,3 @@ async function getSelection(node?: Ec2Node, filter?: instanceFilter): Promise<Ec
6160
export async function copyInstanceId(instanceId: string): Promise<void> {
6261
await copyToClipboard(instanceId, 'Id')
6362
}
64-
65-
export async function getConnectionManager(
66-
connectionManagers: Ec2ConnectionManagerMap,
67-
selection: Ec2Selection
68-
): Promise<Ec2ConnectionManager> {
69-
if (connectionManagers.has(selection.region)) {
70-
return connectionManagers.get(selection.region)!
71-
} else {
72-
const newConnectionManager = new Ec2ConnectionManager(selection.region)
73-
connectionManagers.set(selection.region, newConnectionManager)
74-
return newConnectionManager
75-
}
76-
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import { getLogger } from '../../shared'
7+
import { Ec2ConnectionManager } from './model'
8+
9+
export class Ec2ConnectionManagerMap extends Map<string, Ec2ConnectionManager> {
10+
private static warnSize: number = 25
11+
12+
public getOrInit(regionCode: string) {
13+
return this.has(regionCode) ? this.get(regionCode)! : this.initiateManager(regionCode)
14+
}
15+
16+
private initiateManager(regionCode: string): Ec2ConnectionManager {
17+
if (this.size >= Ec2ConnectionManagerMap.warnSize) {
18+
getLogger().warn(
19+
`Connection manager exceeded threshold of ${Ec2ConnectionManagerMap.warnSize} with ${this.size} active connections`
20+
)
21+
}
22+
const newConnectionManager = new Ec2ConnectionManager(regionCode)
23+
this.set(regionCode, newConnectionManager)
24+
return newConnectionManager
25+
}
26+
}

packages/core/src/awsService/ec2/explorer/ec2InstanceNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export class Ec2InstanceNode extends AWSTreeNodeBase implements AWSResourceNode
103103
}
104104
}
105105

106-
export async function refreshExplorerNode(node?: Ec2Node) {
106+
export async function tryRefreshNode(node?: Ec2Node) {
107107
if (node) {
108108
const n = node instanceof Ec2InstanceNode ? node.parent : node
109109
try {

packages/core/src/awsService/ec2/model.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export interface Ec2RemoteEnv extends VscodeRemoteConnection {
4040
ssmSession: SSM.StartSessionResponse
4141
}
4242

43-
export class Ec2ConnectionManager {
43+
export class Ec2ConnectionManager implements vscode.Disposable {
4444
protected ssmClient: SsmClient
4545
protected ec2Client: Ec2Client
4646
protected iamClient: DefaultIamClient
@@ -77,8 +77,8 @@ export class Ec2ConnectionManager {
7777
await this.sessionManager.addSession(instanceId, sessionId)
7878
}
7979

80-
public async closeConnections(): Promise<void> {
81-
await this.sessionManager.closeConnections()
80+
public async dispose(): Promise<void> {
81+
await this.sessionManager.dispose()
8282
}
8383

8484
public isConnectedTo(instanceId: string): boolean {

packages/core/src/awsService/ec2/remoteSessionManager.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,38 @@
55

66
import { EC2, SSM } from 'aws-sdk'
77
import { SsmClient } from '../../shared/clients/ssmClient'
8+
import { Disposable } from 'vscode'
89

9-
export class Ec2RemoteSessionManager {
10-
private activeSessions: Map<EC2.InstanceId, SSM.SessionId>
10+
export class Ec2RemoteSessionManager extends Map<EC2.InstanceId, SSM.SessionId> implements Disposable {
11+
//private activeSessions: Map<EC2.InstanceId, SSM.SessionId>
1112

1213
public constructor(
1314
readonly regionCode: string,
1415
protected ssmClient: SsmClient
1516
) {
16-
this.activeSessions = new Map<EC2.InstanceId, SSM.SessionId>()
17+
super()
1718
}
1819

1920
public async addSession(instanceId: EC2.InstanceId, sessionId: SSM.SessionId): Promise<void> {
2021
if (this.isConnectedTo(instanceId)) {
21-
const existingSessionId = this.activeSessions.get(instanceId)!
22+
const existingSessionId = this.get(instanceId)!
2223
await this.ssmClient.terminateSessionFromId(existingSessionId)
23-
this.activeSessions.set(instanceId, sessionId)
24+
this.set(instanceId, sessionId)
2425
} else {
25-
this.activeSessions.set(instanceId, sessionId)
26+
this.set(instanceId, sessionId)
2627
}
2728
}
2829

2930
private async disconnectEnv(instanceId: EC2.InstanceId): Promise<void> {
30-
await this.ssmClient.terminateSessionFromId(this.activeSessions.get(instanceId)!)
31-
this.activeSessions.delete(instanceId)
31+
await this.ssmClient.terminateSessionFromId(this.get(instanceId)!)
32+
this.delete(instanceId)
3233
}
3334

34-
public async closeConnections(): Promise<void> {
35-
this.activeSessions.forEach(async (_sessionId, instanceId) => await this.disconnectEnv(instanceId))
35+
public async dispose(): Promise<void> {
36+
this.forEach(async (_sessionId, instanceId) => await this.disconnectEnv(instanceId))
3637
}
3738

3839
public isConnectedTo(instanceId: EC2.InstanceId): boolean {
39-
return this.activeSessions.has(instanceId)
40+
return this.has(instanceId)
4041
}
4142
}

packages/core/src/test/awsService/ec2/commands.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
*/
55

66
import assert from 'assert'
7-
import { Ec2ConnectionManagerMap } from '../../../awsService/ec2/activation'
8-
import { getConnectionManager } from '../../../awsService/ec2/commands'
9-
import { Ec2ConnectionManager } from '../../../awsService/ec2/model'
107
import { Ec2Selection } from '../../../awsService/ec2/prompter'
8+
import { Ec2ConnectionManagerMap } from '../../../awsService/ec2/connectionManagerMap'
119

1210
describe('getConnectionManager', async function () {
1311
let connectionManagers: Ec2ConnectionManagerMap
1412

1513
beforeEach(function () {
16-
connectionManagers = new Map<string, Ec2ConnectionManager>()
14+
connectionManagers = new Ec2ConnectionManagerMap()
1715
})
1816

1917
it('only creates new connection managers once for each region ', async function () {
@@ -22,12 +20,12 @@ describe('getConnectionManager', async function () {
2220
instanceId: 'fake-id',
2321
}
2422

25-
const cm = await getConnectionManager(connectionManagers, fakeSelection)
23+
const cm = connectionManagers.getOrInit(fakeSelection.region)
2624
assert.strictEqual(connectionManagers.size, 1)
2725

2826
await cm.addActiveSession('sessionId', 'instanceId')
2927

30-
const cm2 = await getConnectionManager(connectionManagers, fakeSelection)
28+
const cm2 = connectionManagers.getOrInit(fakeSelection.region)
3129

3230
assert.strictEqual(cm2.isConnectedTo('instanceId'), true)
3331
})

packages/core/src/test/awsService/ec2/remoteSessionManager.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe('Ec2RemoteSessionManager', async function () {
4444
await envManager.addSession('test-instance2', 'test-env2')
4545
await envManager.addSession('test-instance3', 'test-env3')
4646

47-
await envManager.closeConnections()
47+
await envManager.dispose()
4848

4949
sinon.assert.calledThrice(terminateStub)
5050
assert(!envManager.isConnectedTo('test-instance'))

0 commit comments

Comments
 (0)