From 455722c31638a74e104cf6b1ec455d3ca0458d3d Mon Sep 17 00:00:00 2001 From: victor-meng <56978073+victor-meng@users.noreply.github.com> Date: Tue, 11 Aug 2020 18:36:42 -0700 Subject: [PATCH] Fix deleteDatabase and deleteCollection with ARM (#143) --- .../dataAccess/deleteCollection.test.ts | 4 ++- src/Common/dataAccess/deleteCollection.ts | 35 +++++++++++++++---- src/Common/dataAccess/deleteDatabase.test.ts | 4 ++- src/Common/dataAccess/deleteDatabase.ts | 31 ++++++++++++---- src/DefaultAccountExperienceType.ts | 8 +++++ src/Explorer/Explorer.ts | 8 ++++- src/Shared/DefaultExperienceUtility.ts | 20 +++++++++++ src/UserContext.ts | 2 ++ 8 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 src/DefaultAccountExperienceType.ts diff --git a/src/Common/dataAccess/deleteCollection.test.ts b/src/Common/dataAccess/deleteCollection.test.ts index ad24e2920..265a1f299 100644 --- a/src/Common/dataAccess/deleteCollection.test.ts +++ b/src/Common/dataAccess/deleteCollection.test.ts @@ -6,6 +6,7 @@ import { AuthType } from "../../AuthType"; import { updateUserContext } from "../../UserContext"; import { DatabaseAccount } from "../../Contracts/DataModels"; import { sendCachedDataMessage } from "../MessageHandler"; +import { DefaultAccountExperienceType } from "../../DefaultAccountExperienceType"; describe("deleteCollection", () => { it("should call ARM if logged in with AAD", async () => { @@ -13,7 +14,8 @@ describe("deleteCollection", () => { updateUserContext({ databaseAccount: { name: "test" - } as DatabaseAccount + } as DatabaseAccount, + defaultExperience: DefaultAccountExperienceType.DocumentDB }); (sendCachedDataMessage as jest.Mock).mockResolvedValue(undefined); await deleteCollection("database", "collection"); diff --git a/src/Common/dataAccess/deleteCollection.ts b/src/Common/dataAccess/deleteCollection.ts index 79362527a..c8975d767 100644 --- a/src/Common/dataAccess/deleteCollection.ts +++ b/src/Common/dataAccess/deleteCollection.ts @@ -1,5 +1,10 @@ import { AuthType } from "../../AuthType"; +import { DefaultAccountExperienceType } from "../../DefaultAccountExperienceType"; import { deleteSqlContainer } from "../../Utils/arm/generatedClients/2020-04-01/sqlResources"; +import { deleteCassandraTable } from "../../Utils/arm/generatedClients/2020-04-01/cassandraResources"; +import { deleteMongoDBCollection } from "../../Utils/arm/generatedClients/2020-04-01/mongoDBResources"; +import { deleteGremlinGraph } from "../../Utils/arm/generatedClients/2020-04-01/gremlinResources"; +import { deleteTable } from "../../Utils/arm/generatedClients/2020-04-01/tableResources"; import { logConsoleError, logConsoleInfo, logConsoleProgress } from "../../Utils/NotificationConsoleUtils"; import { userContext } from "../../UserContext"; import { client } from "../CosmosClient"; @@ -9,13 +14,7 @@ export async function deleteCollection(databaseId: string, collectionId: string) const clearMessage = logConsoleProgress(`Deleting container ${collectionId}`); try { if (window.authType === AuthType.AAD) { - await deleteSqlContainer( - userContext.subscriptionId, - userContext.resourceGroup, - userContext.databaseAccount.name, - databaseId, - collectionId - ); + await deleteCollectionWithARM(databaseId, collectionId); } else { await client() .database(databaseId) @@ -30,3 +29,25 @@ export async function deleteCollection(databaseId: string, collectionId: string) clearMessage(); await refreshCachedResources(); } + +function deleteCollectionWithARM(databaseId: string, collectionId: string): Promise { + const subscriptionId = userContext.subscriptionId; + const resourceGroup = userContext.resourceGroup; + const accountName = userContext.databaseAccount.name; + const defaultExperience = userContext.defaultExperience; + + switch (defaultExperience) { + case DefaultAccountExperienceType.DocumentDB: + return deleteSqlContainer(subscriptionId, resourceGroup, accountName, databaseId, collectionId); + case DefaultAccountExperienceType.MongoDB: + return deleteMongoDBCollection(subscriptionId, resourceGroup, accountName, databaseId, collectionId); + case DefaultAccountExperienceType.Cassandra: + return deleteCassandraTable(subscriptionId, resourceGroup, accountName, databaseId, collectionId); + case DefaultAccountExperienceType.Graph: + return deleteGremlinGraph(subscriptionId, resourceGroup, accountName, databaseId, collectionId); + case DefaultAccountExperienceType.Table: + return deleteTable(subscriptionId, resourceGroup, accountName, collectionId); + default: + throw new Error(`Unsupported default experience type: ${defaultExperience}`); + } +} diff --git a/src/Common/dataAccess/deleteDatabase.test.ts b/src/Common/dataAccess/deleteDatabase.test.ts index f3a7146a7..2cd898ba6 100644 --- a/src/Common/dataAccess/deleteDatabase.test.ts +++ b/src/Common/dataAccess/deleteDatabase.test.ts @@ -6,6 +6,7 @@ import { AuthType } from "../../AuthType"; import { updateUserContext } from "../../UserContext"; import { DatabaseAccount } from "../../Contracts/DataModels"; import { sendCachedDataMessage } from "../MessageHandler"; +import { DefaultAccountExperienceType } from "../../DefaultAccountExperienceType"; describe("deleteDatabase", () => { it("should call ARM if logged in with AAD", async () => { @@ -13,7 +14,8 @@ describe("deleteDatabase", () => { updateUserContext({ databaseAccount: { name: "test" - } as DatabaseAccount + } as DatabaseAccount, + defaultExperience: DefaultAccountExperienceType.DocumentDB }); (sendCachedDataMessage as jest.Mock).mockResolvedValue(undefined); await deleteDatabase("database"); diff --git a/src/Common/dataAccess/deleteDatabase.ts b/src/Common/dataAccess/deleteDatabase.ts index 12733bf53..a44a2d5bb 100644 --- a/src/Common/dataAccess/deleteDatabase.ts +++ b/src/Common/dataAccess/deleteDatabase.ts @@ -1,5 +1,9 @@ import { AuthType } from "../../AuthType"; +import { DefaultAccountExperienceType } from "../../DefaultAccountExperienceType"; import { deleteSqlDatabase } from "../../Utils/arm/generatedClients/2020-04-01/sqlResources"; +import { deleteCassandraKeyspace } from "../../Utils/arm/generatedClients/2020-04-01/cassandraResources"; +import { deleteMongoDBDatabase } from "../../Utils/arm/generatedClients/2020-04-01/mongoDBResources"; +import { deleteGremlinDatabase } from "../../Utils/arm/generatedClients/2020-04-01/gremlinResources"; import { logConsoleError, logConsoleInfo, logConsoleProgress } from "../../Utils/NotificationConsoleUtils"; import { userContext } from "../../UserContext"; import { client } from "../CosmosClient"; @@ -12,12 +16,7 @@ export async function deleteDatabase(databaseId: string): Promise { try { if (window.authType === AuthType.AAD) { - await deleteSqlDatabase( - userContext.subscriptionId, - userContext.resourceGroup, - userContext.databaseAccount.name, - databaseId - ); + await deleteDatabaseWithARM(databaseId); } else { await client() .database(databaseId) @@ -33,3 +32,23 @@ export async function deleteDatabase(databaseId: string): Promise { clearMessage(); await refreshCachedResources(); } + +function deleteDatabaseWithARM(databaseId: string): Promise { + const subscriptionId = userContext.subscriptionId; + const resourceGroup = userContext.resourceGroup; + const accountName = userContext.databaseAccount.name; + const defaultExperience = userContext.defaultExperience; + + switch (defaultExperience) { + case DefaultAccountExperienceType.DocumentDB: + return deleteSqlDatabase(subscriptionId, resourceGroup, accountName, databaseId); + case DefaultAccountExperienceType.MongoDB: + return deleteMongoDBDatabase(subscriptionId, resourceGroup, accountName, databaseId); + case DefaultAccountExperienceType.Cassandra: + return deleteCassandraKeyspace(subscriptionId, resourceGroup, accountName, databaseId); + case DefaultAccountExperienceType.Graph: + return deleteGremlinDatabase(subscriptionId, resourceGroup, accountName, databaseId); + default: + throw new Error(`Unsupported default experience type: ${defaultExperience}`); + } +} diff --git a/src/DefaultAccountExperienceType.ts b/src/DefaultAccountExperienceType.ts new file mode 100644 index 000000000..a7cd708aa --- /dev/null +++ b/src/DefaultAccountExperienceType.ts @@ -0,0 +1,8 @@ +export enum DefaultAccountExperienceType { + DocumentDB = "DocumentDB", + Graph = "Graph", + MongoDB = "MongoDB", + Table = "Table", + Cassandra = "Cassandra", + ApiForMongoDB = "Azure Cosmos DB for MongoDB API" +} diff --git a/src/Explorer/Explorer.ts b/src/Explorer/Explorer.ts index 15be7c0c9..81a5d365c 100644 --- a/src/Explorer/Explorer.ts +++ b/src/Explorer/Explorer.ts @@ -482,7 +482,13 @@ export default class Explorer { this.notificationConsoleData = ko.observableArray([]); this.defaultExperience = ko.observable(); this.databaseAccount.subscribe(databaseAccount => { - this.defaultExperience(DefaultExperienceUtility.getDefaultExperienceFromDatabaseAccount(databaseAccount)); + const defaultExperience: string = DefaultExperienceUtility.getDefaultExperienceFromDatabaseAccount( + databaseAccount + ); + this.defaultExperience(defaultExperience); + updateUserContext({ + defaultExperience: DefaultExperienceUtility.mapDefaultExperienceStringToEnum(defaultExperience) + }); }); this.isPreferredApiDocumentDB = ko.computed(() => { diff --git a/src/Shared/DefaultExperienceUtility.ts b/src/Shared/DefaultExperienceUtility.ts index f3837a7d8..81550466e 100644 --- a/src/Shared/DefaultExperienceUtility.ts +++ b/src/Shared/DefaultExperienceUtility.ts @@ -1,6 +1,7 @@ import * as _ from "underscore"; import * as Constants from "../Common/Constants"; import * as DataModels from "../Contracts/DataModels"; +import { DefaultAccountExperienceType } from "../DefaultAccountExperienceType"; export class DefaultExperienceUtility { public static getDefaultExperienceFromDatabaseAccount(databaseAccount: DataModels.DatabaseAccount): string { @@ -59,6 +60,25 @@ export class DefaultExperienceUtility { } } + public static mapDefaultExperienceStringToEnum(defaultExperience: string): DefaultAccountExperienceType { + switch (defaultExperience) { + case Constants.DefaultAccountExperience.DocumentDB: + return DefaultAccountExperienceType.DocumentDB; + case Constants.DefaultAccountExperience.Graph: + return DefaultAccountExperienceType.Graph; + case Constants.DefaultAccountExperience.MongoDB: + return DefaultAccountExperienceType.MongoDB; + case Constants.DefaultAccountExperience.Table: + return DefaultAccountExperienceType.Table; + case Constants.DefaultAccountExperience.Cassandra: + return DefaultAccountExperienceType.Cassandra; + case Constants.DefaultAccountExperience.ApiForMongoDB: + return DefaultAccountExperienceType.ApiForMongoDB; + default: + throw new Error(`Unsupported default experience type: ${defaultExperience}`); + } + } + private static _getDefaultExperience(kind: string, capabilities: DataModels.Capability[]): string { const defaultDefaultExperience: string = Constants.DefaultAccountExperience.DocumentDB; const defaultExperienceFromKind: string = DefaultExperienceUtility._getDefaultExperienceFromAccountKind(kind); diff --git a/src/UserContext.ts b/src/UserContext.ts index dd4a851b4..e9b4f6e62 100644 --- a/src/UserContext.ts +++ b/src/UserContext.ts @@ -1,4 +1,5 @@ import { DatabaseAccount } from "./Contracts/DataModels"; +import { DefaultAccountExperienceType } from "./DefaultAccountExperienceType"; interface UserContext { masterKey?: string; @@ -9,6 +10,7 @@ interface UserContext { accessToken?: string; authorizationToken?: string; resourceToken?: string; + defaultExperience?: DefaultAccountExperienceType; } const userContext: Readonly = {} as const;