Skip to content

Commit d058878

Browse files
Muzaffer Aydins7ab059789
authored andcommitted
fix(docdb): handle missing clusters gracefully in getStatus method
1 parent 5ad8299 commit d058878

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

packages/core/src/docdb/explorer/dbClusterNode.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,16 @@ export class DBClusterNode extends DBResourceNode {
143143
}
144144

145145
override async getStatus() {
146-
const [cluster] = await this.client.listClusters(this.arn)
147-
getLogger().info(`Get Status: status ${cluster?.Status} for cluster ${this.arn}`)
148-
this.cluster.Status = cluster?.Status
146+
const clusters = await this.client.listClusters(this.arn)
147+
const cluster = clusters[0]
148+
149+
if (!cluster) {
150+
getLogger().warn(`No cluster found for ARN: ${this.arn}`)
151+
return undefined
152+
}
153+
154+
getLogger().info(`Get Status: status ${cluster.Status} for cluster ${this.arn}`)
155+
this.cluster.Status = cluster.Status
149156
return cluster.Status
150157
}
151158

packages/core/src/docdb/explorer/dbGlobalClusterNode.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,17 @@ export class DBGlobalClusterNode extends DBResourceNode {
127127

128128
override async getStatus() {
129129
const client = DefaultDocumentDBClient.create(this.regionCode)
130-
const [cluster] = await client.listClusters(this.arn)
131-
return cluster?.Status
130+
const clusters = await client.listClusters(this.arn)
131+
const cluster = clusters[0]
132+
133+
if (!cluster) {
134+
getLogger().warn(`No cluster found for ARN: ${this.arn}`)
135+
return undefined
136+
}
137+
138+
getLogger().info(`Get Status: status ${cluster.Status} for cluster ${this.arn}`)
139+
this.cluster.Status = cluster.Status
140+
return cluster.Status
132141
}
133142

134143
override copyEndpoint(): Promise<void> {

packages/core/src/test/docdb/explorer/dbClusterNode.test.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import { DBInstance, DocumentDBClient } from '../../../shared/clients/docdbClien
1313

1414
describe('DBClusterNode', function () {
1515
let mockClient: DocumentDBClient
16+
1617
beforeEach(() => {
1718
mockClient = {
18-
listClusters: sinon.stub().resolves([]), // Mock implementation
19-
listInstances: sinon.stub().resolves([]), // Mock implementation
19+
listClusters: sinon.stub().resolves([{ DBClusterIdentifier: 'Cluster-1', Status: 'available' }]), // Mocked cluster
20+
listInstances: sinon.stub().resolves([]), // Mocked instances
2021
} as Partial<DocumentDBClient> as DocumentDBClient
2122

2223
DBClusterNode['globalPollingArns'].clear()
@@ -32,12 +33,12 @@ describe('DBClusterNode', function () {
3233
const instanceB: DBInstance = { DBInstanceIdentifier: 'Instance-B' }
3334

3435
function assertInstanceNode(node: AWSTreeNodeBase, expectedInstance: DBInstance): void {
35-
assert.ok(node instanceof DBInstanceNode, `Node ${node} should be a Instance Node`)
36+
assert.ok(node instanceof DBInstanceNode, `Node ${node} should be an Instance Node`)
3637
assert.deepStrictEqual((node as DBInstanceNode).instance, expectedInstance)
3738
}
3839

3940
it('gets children', async function () {
40-
;(mockClient.listInstances as sinon.SinonStub) = sinon.stub().resolves([instanceA, instanceB])
41+
;(mockClient.listInstances as sinon.SinonStub).resolves([instanceA, instanceB])
4142
const node = new DBClusterNode(parentNode, cluster, mockClient)
4243
const [firstInstanceNode, secondInstanceNode, ...otherNodes] = await node.getChildren()
4344

@@ -48,7 +49,6 @@ describe('DBClusterNode', function () {
4849

4950
it('returns false for available status', function () {
5051
const clusterStatus = { ...cluster, Status: 'available' }
51-
5252
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
5353
const requiresPolling = node.isStatusRequiringPolling()
5454

@@ -57,7 +57,6 @@ describe('DBClusterNode', function () {
5757

5858
it('returns true for creating status', function () {
5959
const clusterStatus = { ...cluster, Status: 'creating' }
60-
6160
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
6261
const requiresPolling = node.isStatusRequiringPolling()
6362

@@ -66,7 +65,6 @@ describe('DBClusterNode', function () {
6665

6766
it('starts tracking changes when status requires polling', function () {
6867
const clusterStatus = { ...cluster, Status: 'creating' }
69-
7068
const trackChangesSpy = sinon.spy(DBClusterNode.prototype, 'trackChanges')
7169
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
7270
const requiresPolling = node.isStatusRequiringPolling()
@@ -80,7 +78,6 @@ describe('DBClusterNode', function () {
8078

8179
it('does not start tracking changes when status does not require polling', function () {
8280
const clusterStatus = { ...cluster, Status: 'available' }
83-
8481
const trackChangesSpy = sinon.spy(DBClusterNode.prototype, 'trackChanges')
8582
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
8683
const requiresPolling = node.isStatusRequiringPolling()
@@ -92,9 +89,8 @@ describe('DBClusterNode', function () {
9289
trackChangesSpy.restore()
9390
})
9491

95-
it('does not polling when status is available', function () {
92+
it('does not poll when status is available', function () {
9693
const clusterStatus = { ...cluster, Status: 'available' }
97-
9894
const trackChangesSpy = sinon.spy(DBClusterNode.prototype, 'trackChanges')
9995
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
10096
const requiresPolling = node.isStatusRequiringPolling()
@@ -107,12 +103,20 @@ describe('DBClusterNode', function () {
107103
})
108104

109105
it('has isPolling set to false and getStatus returns available when status is available', async function () {
110-
const clusterStatus = { ...cluster, Status: 'available' }
111-
mockClient.listClusters = sinon.stub().resolves([clusterStatus])
106+
const clusterStatus = { DBClusterIdentifier: 'Cluster-1', Status: 'available' }
107+
;(mockClient.listClusters as sinon.SinonStub).resolves([clusterStatus])
112108

113109
const node = new DBClusterNode(parentNode, clusterStatus, mockClient)
114110

115111
assert.strictEqual(node.isPolling, false, 'Node should not be in polling state')
116112
assert.strictEqual(node.status, 'available', 'getStatus should return available for the node')
117113
})
114+
115+
it('handles missing clusters gracefully in getStatus', async function () {
116+
;(mockClient.listClusters as sinon.SinonStub).resolves([])
117+
const node = new DBClusterNode(parentNode, cluster, mockClient)
118+
119+
const status = await node.getStatus()
120+
assert.strictEqual(status, undefined, 'getStatus should return undefined when no cluster is found')
121+
})
118122
})

0 commit comments

Comments
 (0)