forked from microsoft/vscode-cosmosdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AzureDBExperiences.ts
118 lines (98 loc) · 5.67 KB
/
AzureDBExperiences.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* ------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { DatabaseAccountGetResults } from '@azure/arm-cosmosdb/src/models';
import { IAzureQuickPickItem } from '@microsoft/vscode-azext-utils';
import { nonNullProp } from './utils/nonNull';
export enum API {
MongoDB = 'MongoDB',
Graph = 'Graph',
Table = 'Table',
Core = 'Core',
PostgresSingle = 'PostgresSingle',
PostgresFlexible = 'PostgresFlexible'
}
export enum DBAccountKind {
MongoDB = 'MongoDB',
GlobalDocumentDB = 'GlobalDocumentDB'
}
export type CapabilityName = 'EnableGremlin' | 'EnableTable';
export function getExperienceFromApi(api: API): Experience {
let info = experiencesMap.get(api);
if (!info) {
info = { api: api, shortName: api, longName: api, kind: DBAccountKind.GlobalDocumentDB, tag: api };
}
return info;
}
export function getExperienceLabel(databaseAccount: DatabaseAccountGetResults): string {
const experience: Experience | undefined = tryGetExperience(databaseAccount);
if (experience) {
return experience.shortName;
}
// Must be some new kind of resource that we aren't aware of. Try to get a decent label
const defaultExperience: string = <API>(databaseAccount && databaseAccount.tags && databaseAccount.tags.defaultExperience);
const firstCapability = databaseAccount.capabilities && databaseAccount.capabilities[0];
const firstCapabilityName = firstCapability?.name?.replace(/^Enable/, '');
return defaultExperience || firstCapabilityName || nonNullProp(databaseAccount, 'kind');
}
export function tryGetExperience(resource: DatabaseAccountGetResults): Experience | undefined {
// defaultExperience in the resource doesn't really mean anything, we can't depend on its value for determining resource type
if (resource.kind === DBAccountKind.MongoDB) {
return MongoExperience;
} else if (resource.capabilities?.find(cap => cap.name === 'EnableGremlin')) {
return GremlinExperience;
} else if (resource.capabilities?.find(cap => cap.name === 'EnableTable')) {
return TableExperience;
} else if (resource.capabilities?.length === 0) {
return CoreExperience;
}
return undefined;
}
export interface Experience {
/**
* Programmatic name used internally by us for historical reasons. Doesn't actually affect anything in Azure (maybe UI?)
*/
api: API;
longName: string;
shortName: string;
description?: string;
// These properties are what the portal actually looks at to determine the difference between APIs
kind?: DBAccountKind;
capability?: CapabilityName;
// The defaultExperience tag to place into the resource (has no actual effect in Azure, just imitating the portal)
tag?: string;
}
export function getExperienceQuickPicks(attached?: boolean): IAzureQuickPickItem<Experience>[] {
if (attached) {
return experiencesArray.map(exp => getExperienceQuickPickForAttached(exp.api));
} else {
return experiencesArray.map(exp => getExperienceQuickPick(exp.api));
}
}
export function getCosmosExperienceQuickPicks(attached?: boolean): IAzureQuickPickItem<Experience>[] {
if (attached) {
return cosmosExperiencesArray.map(exp => getExperienceQuickPickForAttached(exp.api));
} else {
return cosmosExperiencesArray.map(exp => getExperienceQuickPick(exp.api));
}
}
export function getExperienceQuickPick(api: API): IAzureQuickPickItem<Experience> {
const exp = getExperienceFromApi(api);
return { label: exp.longName, description: exp.description, data: exp };
}
export function getExperienceQuickPickForAttached(api: API): IAzureQuickPickItem<Experience> {
const exp = getExperienceFromApi(api);
return { label: exp.shortName, description: exp.description, data: exp };
}
// Mongo is distinguished by having kind="MongoDB". All others have kind="GlobalDocumentDB"
// Table and Gremlin are distinguished from SQL by their capabilities
export const CoreExperience: Experience = { api: API.Core, longName: "Core", description: "(SQL)", shortName: "SQL", kind: DBAccountKind.GlobalDocumentDB, tag: 'Core (SQL)' } as const;
export const MongoExperience: Experience = { api: API.MongoDB, longName: "Azure Cosmos DB for MongoDB API", shortName: "MongoDB", kind: DBAccountKind.MongoDB, tag: "Azure Cosmos DB for MongoDB API" } as const;
export const TableExperience: Experience = { api: API.Table, longName: "Azure Table", shortName: "Table", kind: DBAccountKind.GlobalDocumentDB, capability: 'EnableTable', tag: 'Azure Table' } as const;
export const GremlinExperience: Experience = { api: API.Graph, longName: "Gremlin", description: "(graph)", shortName: "Gremlin", kind: DBAccountKind.GlobalDocumentDB, capability: 'EnableGremlin', tag: 'Gremlin (graph)' } as const;
const PostgresSingleExperience: Experience = { api: API.PostgresSingle, longName: "PostgreSQL Single Server", shortName: "PostgreSQLSingle" };
const PostgresFlexibleExperience: Experience = { api: API.PostgresFlexible, longName: "PostgreSQL Flexible Server (Preview)", shortName: "PostgreSQLFlexible" };
const cosmosExperiencesArray: Experience[] = [CoreExperience, MongoExperience, TableExperience, GremlinExperience];
const experiencesArray: Experience[] = [...cosmosExperiencesArray, PostgresSingleExperience, PostgresFlexibleExperience];
const experiencesMap = new Map<API, Experience>(experiencesArray.map((info: Experience): [API, Experience] => [info.api, info]));