|
1 | 1 | import type { ClusterDescription20240805, FlexClusterDescription20241113 } from "./openapi.js";
|
2 | 2 | import type { ApiClient } from "./apiClient.js";
|
3 | 3 | import { LogId } from "../logger.js";
|
| 4 | +import { ConnectionString } from "mongodb-connection-string-url"; |
4 | 5 |
|
| 6 | +type AtlasProcessId = `${string}:${number}`; |
| 7 | + |
| 8 | +function extractProcessIds(connectionString: string): Array<AtlasProcessId> { |
| 9 | + if (!connectionString) { |
| 10 | + return []; |
| 11 | + } |
| 12 | + const connectionStringUrl = new ConnectionString(connectionString); |
| 13 | + return connectionStringUrl.hosts as Array<AtlasProcessId>; |
| 14 | +} |
5 | 15 | export interface Cluster {
|
6 | 16 | name?: string;
|
7 | 17 | instanceType: "FREE" | "DEDICATED" | "FLEX";
|
8 | 18 | instanceSize?: string;
|
9 | 19 | state?: "IDLE" | "CREATING" | "UPDATING" | "DELETING" | "REPAIRING";
|
10 | 20 | mongoDBVersion?: string;
|
11 | 21 | connectionString?: string;
|
| 22 | + processIds?: Array<string>; |
12 | 23 | }
|
13 | 24 |
|
14 | 25 | export function formatFlexCluster(cluster: FlexClusterDescription20241113): Cluster {
|
| 26 | + const connectionString = cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard; |
15 | 27 | return {
|
16 | 28 | name: cluster.name,
|
17 | 29 | instanceType: "FLEX",
|
18 | 30 | instanceSize: undefined,
|
19 | 31 | state: cluster.stateName,
|
20 | 32 | mongoDBVersion: cluster.mongoDBVersion,
|
21 |
| - connectionString: cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard, |
| 33 | + connectionString, |
| 34 | + processIds: extractProcessIds(cluster.connectionStrings?.standard ?? ""), |
22 | 35 | };
|
23 | 36 | }
|
24 | 37 |
|
@@ -52,14 +65,16 @@ export function formatCluster(cluster: ClusterDescription20240805): Cluster {
|
52 | 65 |
|
53 | 66 | const instanceSize = regionConfigs[0]?.instanceSize ?? "UNKNOWN";
|
54 | 67 | const clusterInstanceType = instanceSize === "M0" ? "FREE" : "DEDICATED";
|
| 68 | + const connectionString = cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard; |
55 | 69 |
|
56 | 70 | return {
|
57 | 71 | name: cluster.name,
|
58 | 72 | instanceType: clusterInstanceType,
|
59 | 73 | instanceSize: clusterInstanceType === "DEDICATED" ? instanceSize : undefined,
|
60 | 74 | state: cluster.stateName,
|
61 | 75 | mongoDBVersion: cluster.mongoDBVersion,
|
62 |
| - connectionString: cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard, |
| 76 | + connectionString, |
| 77 | + processIds: extractProcessIds(cluster.connectionStrings?.standard ?? ""), |
63 | 78 | };
|
64 | 79 | }
|
65 | 80 |
|
@@ -96,3 +111,18 @@ export async function inspectCluster(apiClient: ApiClient, projectId: string, cl
|
96 | 111 | }
|
97 | 112 | }
|
98 | 113 | }
|
| 114 | + |
| 115 | +export async function getProcessIdsFromCluster( |
| 116 | + apiClient: ApiClient, |
| 117 | + projectId: string, |
| 118 | + clusterName: string |
| 119 | +): Promise<Array<string>> { |
| 120 | + try { |
| 121 | + const cluster = await inspectCluster(apiClient, projectId, clusterName); |
| 122 | + return cluster.processIds || []; |
| 123 | + } catch (error) { |
| 124 | + throw new Error( |
| 125 | + `Failed to get processIds from cluster: ${error instanceof Error ? error.message : String(error)}` |
| 126 | + ); |
| 127 | + } |
| 128 | +} |
0 commit comments