From ac9a2dcf6808fd32ce520f691a2e66c7bc52b6b1 Mon Sep 17 00:00:00 2001
From: nasc17 <69922333+nasc17@users.noreply.github.com>
Date: Fri, 26 Feb 2021 13:33:40 -0800
Subject: [PATCH] Nasc/per role parameters (#14425)
* Creating separate pages for worker and coordinator parameters
* Added new gear, hid coordinator server parameters page
* Commented out azdataApi
* Added white gear, created abstract class for server parameters page
* Chaged gear name, condensed base class more, changed file name
* Added colored gears for parameter pages
* Edited to describe configuring both coordinator and worker
---
extensions/arc/images/gear-colored-blue.svg | 17 ++++
extensions/arc/images/gear-colored-gray.svg | 16 ++++
extensions/arc/images/gear-monoline-black.svg | 3 +
extensions/arc/images/gear-monoline-blue.svg | 3 +
extensions/arc/images/gear-monoline-white.svg | 3 +
extensions/arc/images/gear.svg | 10 --
extensions/arc/src/constants.ts | 13 ++-
extensions/arc/src/localizedConstants.ts | 4 +
extensions/arc/src/models/postgresModel.ts | 10 +-
.../postgresCoordinatorNodeParametersPage.ts | 71 ++++++++++++++
.../dashboards/postgres/postgresDashboard.ts | 8 +-
...arametersPage.ts => postgresParameters.ts} | 96 +++++++------------
.../postgresWorkerNodeParametersPage.ts | 72 ++++++++++++++
13 files changed, 245 insertions(+), 81 deletions(-)
create mode 100644 extensions/arc/images/gear-colored-blue.svg
create mode 100644 extensions/arc/images/gear-colored-gray.svg
create mode 100644 extensions/arc/images/gear-monoline-black.svg
create mode 100644 extensions/arc/images/gear-monoline-blue.svg
create mode 100644 extensions/arc/images/gear-monoline-white.svg
delete mode 100644 extensions/arc/images/gear.svg
create mode 100644 extensions/arc/src/ui/dashboards/postgres/postgresCoordinatorNodeParametersPage.ts
rename extensions/arc/src/ui/dashboards/postgres/{postgresParametersPage.ts => postgresParameters.ts} (85%)
create mode 100644 extensions/arc/src/ui/dashboards/postgres/postgresWorkerNodeParametersPage.ts
diff --git a/extensions/arc/images/gear-colored-blue.svg b/extensions/arc/images/gear-colored-blue.svg
new file mode 100644
index 0000000000..3c5255d722
--- /dev/null
+++ b/extensions/arc/images/gear-colored-blue.svg
@@ -0,0 +1,17 @@
+
+
+
diff --git a/extensions/arc/images/gear-colored-gray.svg b/extensions/arc/images/gear-colored-gray.svg
new file mode 100644
index 0000000000..5b32917121
--- /dev/null
+++ b/extensions/arc/images/gear-colored-gray.svg
@@ -0,0 +1,16 @@
+
+
+
diff --git a/extensions/arc/images/gear-monoline-black.svg b/extensions/arc/images/gear-monoline-black.svg
new file mode 100644
index 0000000000..84f336b300
--- /dev/null
+++ b/extensions/arc/images/gear-monoline-black.svg
@@ -0,0 +1,3 @@
+
diff --git a/extensions/arc/images/gear-monoline-blue.svg b/extensions/arc/images/gear-monoline-blue.svg
new file mode 100644
index 0000000000..6aa9b8da8e
--- /dev/null
+++ b/extensions/arc/images/gear-monoline-blue.svg
@@ -0,0 +1,3 @@
+
diff --git a/extensions/arc/images/gear-monoline-white.svg b/extensions/arc/images/gear-monoline-white.svg
new file mode 100644
index 0000000000..df88fb1517
--- /dev/null
+++ b/extensions/arc/images/gear-monoline-white.svg
@@ -0,0 +1,3 @@
+
diff --git a/extensions/arc/images/gear.svg b/extensions/arc/images/gear.svg
deleted file mode 100644
index 34cae96d48..0000000000
--- a/extensions/arc/images/gear.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/extensions/arc/src/constants.ts b/extensions/arc/src/constants.ts
index e03893b249..516ceab943 100644
--- a/extensions/arc/src/constants.ts
+++ b/extensions/arc/src/constants.ts
@@ -45,7 +45,8 @@ export class IconPathHelper {
public static discard: IconPath;
public static fail: IconPath;
public static information: IconPath;
- public static gear: IconPath;
+ public static gearBlue: IconPath;
+ public static gearGray: IconPath;
public static setExtensionContext(context: vscode.ExtensionContext) {
IconPathHelper.context = context;
@@ -141,9 +142,13 @@ export class IconPathHelper {
light: context.asAbsolutePath('images/information.svg'),
dark: context.asAbsolutePath('images/information.svg'),
};
- IconPathHelper.gear = {
- light: context.asAbsolutePath('images/gear.svg'),
- dark: context.asAbsolutePath('images/gear.svg'),
+ IconPathHelper.gearBlue = {
+ light: context.asAbsolutePath('images/gear-colored-blue.svg'),
+ dark: context.asAbsolutePath('images/gear-colored-blue.svg'),
+ };
+ IconPathHelper.gearGray = {
+ light: context.asAbsolutePath('images/gear-colored-gray.svg'),
+ dark: context.asAbsolutePath('images/gear-colored-gray.svg'),
};
}
}
diff --git a/extensions/arc/src/localizedConstants.ts b/extensions/arc/src/localizedConstants.ts
index c19c283963..d856b9d10e 100644
--- a/extensions/arc/src/localizedConstants.ts
+++ b/extensions/arc/src/localizedConstants.ts
@@ -24,6 +24,8 @@ export const settings = localize('arc.settings', "Settings");
export const security = localize('arc.security', "Security");
export const computeAndStorage = localize('arc.computeAndStorage', "Compute + Storage");
export const nodeParameters = localize('arc.nodeParameters', "Node Parameters");
+export const coordinatorNodeParameters = localize('arc.coordinatorNodeParameters', "Coordinator Node Parameters");
+export const workerNodeParameters = localize('arc.workerNodeParameters', "Worker Node Parameters");
export const compute = localize('arc.compute', "Compute");
export const backup = localize('arc.backup', "Backup");
export const newSupportRequest = localize('arc.newSupportRequest', "New support request");
@@ -138,6 +140,8 @@ export const enterNewPassword = localize('arc.enterNewPassword', "Enter a new pa
export const confirmNewPassword = localize('arc.confirmNewPassword', "Confirm the new password");
export const learnAboutPostgresClients = localize('arc.learnAboutPostgresClients', "Learn more about Azure PostgreSQL Hyperscale client interfaces");
export const nodeParametersDescription = localize('arc.nodeParametersDescription', " These server parameters of the Coordinator node and the Worker nodes can be set to custom (non-default) values. Search to find parameters.");
+export const coordinatorNodeParametersDescription = localize('arc.coordinatorNodeParametersDescription', " These server parameters of the Coordinator node can be set to custom (non-default) values. Search to find parameters.");
+export const workerNodesParametersDescription = localize('arc.workerNodesParametersDescription', " These server parameters of the Worker nodes can be set to custom (non-default) values. Search to find parameters.");
export const learnAboutNodeParameters = localize('arc.learnAboutNodeParameters', "Learn more about database engine settings for Azure Arc enabled PostgreSQL Hyperscale");
export const noNodeParametersFound = localize('arc.noNodeParametersFound', "No worker server parameters found...");
export const searchToFilter = localize('arc.searchToFilter', "Search to filter items...");
diff --git a/extensions/arc/src/models/postgresModel.ts b/extensions/arc/src/models/postgresModel.ts
index cb8d61906d..e79e4a9ea7 100644
--- a/extensions/arc/src/models/postgresModel.ts
+++ b/extensions/arc/src/models/postgresModel.ts
@@ -28,7 +28,8 @@ export type EngineSettingsModel = {
export class PostgresModel extends ResourceModel {
private _config?: azdataExt.PostgresServerShowResult;
- public _engineSettings: EngineSettingsModel[] = [];
+ public workerNodesEngineSettings: EngineSettingsModel[] = [];
+ public coordinatorNodeEngineSettings: EngineSettingsModel[] = [];
private readonly _azdataApi: azdataExt.IExtension;
private readonly _onConfigUpdated = new vscode.EventEmitter();
@@ -137,6 +138,7 @@ export class PostgresModel extends ResourceModel {
this._activeConnectionId = result.connectionId;
}
+ // TODO Need to make separate calls for worker nodes and coordinator node
const provider = azdata.dataprotocol.getProvider(this._connectionProfile!.providerName, azdata.DataProviderType.QueryProvider);
const ownerUri = await azdata.connection.getUriForConnection(this._activeConnectionId);
@@ -150,7 +152,7 @@ export class PostgresModel extends ResourceModel {
'shared_preload_libraries', 'synchronous_commit', 'ssl', 'unix_socket_permissions', 'wal_level'
];
- this._engineSettings = [];
+ this.workerNodesEngineSettings = [];
engineSettings.rows.forEach(row => {
let rowValues = row.map(c => c.displayValue);
@@ -166,12 +168,12 @@ export class PostgresModel extends ResourceModel {
type: rowValues.shift()
};
- this._engineSettings.push(result);
+ this.workerNodesEngineSettings.push(result);
}
});
this.engineSettingsLastUpdated = new Date();
- this._onEngineSettingsUpdated.fire(this._engineSettings);
+ this._onEngineSettingsUpdated.fire(this.workerNodesEngineSettings);
}
protected createConnectionProfile(): azdata.IConnectionProfile {
diff --git a/extensions/arc/src/ui/dashboards/postgres/postgresCoordinatorNodeParametersPage.ts b/extensions/arc/src/ui/dashboards/postgres/postgresCoordinatorNodeParametersPage.ts
new file mode 100644
index 0000000000..5332f2cba6
--- /dev/null
+++ b/extensions/arc/src/ui/dashboards/postgres/postgresCoordinatorNodeParametersPage.ts
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as azdata from 'azdata';
+import * as loc from '../../../localizedConstants';
+import { IconPathHelper } from '../../../constants';
+import { PostgresParametersPage } from './postgresParameters';
+import { PostgresModel } from '../../../models/postgresModel';
+
+export class PostgresCoordinatorNodeParametersPage extends PostgresParametersPage {
+
+ constructor(protected modelView: azdata.ModelView, _postgresModel: PostgresModel) {
+ super(modelView, _postgresModel);
+ }
+
+ protected get title(): string {
+ return loc.coordinatorNodeParameters;
+ }
+
+ protected get id(): string {
+ return 'postgres-coordinator-node-parameters';
+ }
+
+ protected get icon(): { dark: string; light: string; } {
+ return IconPathHelper.gearGray;
+ }
+
+ protected get description(): string {
+ return loc.coordinatorNodeParametersDescription;
+ }
+
+ protected async saveParameterEdits(): Promise {
+ /* TODO add correct azdata call for editing coordinator parameters
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: engineSettings.toString() },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+ */
+ }
+
+ protected async resetAllParameters(): Promise {
+ /* TODO add correct azdata call for editing coordinator parameters
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: `''`, replaceEngineSettings: true },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+ */
+ }
+
+ protected async resetParameter(): Promise {
+ /* TODO add correct azdata call for editing coordinator parameters
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: parameterName + '=' },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+ */
+ }
+
+ protected refreshParametersTable(): void {
+ this._parameters = this._postgresModel.coordinatorNodeEngineSettings.map(engineSetting => this.createParameterComponents(engineSetting));
+ this._parametersTable.data = this._parameters.map(p => [p.parameterName, p.valueContainer, p.description, p.resetButton]);
+ }
+}
diff --git a/extensions/arc/src/ui/dashboards/postgres/postgresDashboard.ts b/extensions/arc/src/ui/dashboards/postgres/postgresDashboard.ts
index 16be7f8d23..ab3ebe9d9c 100644
--- a/extensions/arc/src/ui/dashboards/postgres/postgresDashboard.ts
+++ b/extensions/arc/src/ui/dashboards/postgres/postgresDashboard.ts
@@ -14,7 +14,7 @@ import { Dashboard } from '../../components/dashboard';
import { PostgresDiagnoseAndSolveProblemsPage } from './postgresDiagnoseAndSolveProblemsPage';
import { PostgresSupportRequestPage } from './postgresSupportRequestPage';
import { PostgresComputeAndStoragePage } from './postgresComputeAndStoragePage';
-import { PostgresParametersPage } from './postgresParametersPage';
+import { PostgresWorkerNodeParametersPage } from './postgresWorkerNodeParametersPage';
import { PostgresPropertiesPage } from './postgresPropertiesPage';
export class PostgresDashboard extends Dashboard {
@@ -35,7 +35,9 @@ export class PostgresDashboard extends Dashboard {
const connectionStringsPage = new PostgresConnectionStringsPage(modelView, this._postgresModel);
const computeAndStoragePage = new PostgresComputeAndStoragePage(modelView, this._postgresModel);
const propertiesPage = new PostgresPropertiesPage(modelView, this._controllerModel, this._postgresModel);
- const parametersPage = new PostgresParametersPage(modelView, this._postgresModel);
+ // TODO Add dashboard once backend is able to be connected for per role server parameter edits.
+ // const coordinatorNodeParametersPage = new PostgresCoordinatorNodeParametersPage(modelView, this._postgresModel);
+ const workerNodeParametersPage = new PostgresWorkerNodeParametersPage(modelView, this._postgresModel);
const diagnoseAndSolveProblemsPage = new PostgresDiagnoseAndSolveProblemsPage(modelView, this._context, this._postgresModel);
const supportRequestPage = new PostgresSupportRequestPage(modelView, this._controllerModel, this._postgresModel);
@@ -47,7 +49,7 @@ export class PostgresDashboard extends Dashboard {
propertiesPage.tab,
connectionStringsPage.tab,
computeAndStoragePage.tab,
- parametersPage.tab
+ workerNodeParametersPage.tab
]
},
{
diff --git a/extensions/arc/src/ui/dashboards/postgres/postgresParametersPage.ts b/extensions/arc/src/ui/dashboards/postgres/postgresParameters.ts
similarity index 85%
rename from extensions/arc/src/ui/dashboards/postgres/postgresParametersPage.ts
rename to extensions/arc/src/ui/dashboards/postgres/postgresParameters.ts
index 038e1ad4dc..765ae4a5fa 100644
--- a/extensions/arc/src/ui/dashboards/postgres/postgresParametersPage.ts
+++ b/extensions/arc/src/ui/dashboards/postgres/postgresParameters.ts
@@ -20,24 +20,25 @@ export type ParametersModel = {
resetButton: azdata.ButtonComponent
};
-export class PostgresParametersPage extends DashboardPage {
+export abstract class PostgresParametersPage extends DashboardPage {
private searchBox!: azdata.InputBoxComponent;
- private parametersTable!: azdata.DeclarativeTableComponent;
+ protected _parametersTable!: azdata.DeclarativeTableComponent;
private parameterContainer?: azdata.DivContainer;
- private _parametersTableLoading!: azdata.LoadingComponent;
+ private parametersTableLoading!: azdata.LoadingComponent;
private discardButton!: azdata.ButtonComponent;
private saveButton!: azdata.ButtonComponent;
private resetAllButton!: azdata.ButtonComponent;
private connectToServerButton?: azdata.ButtonComponent;
- private _parameters: ParametersModel[] = [];
+ protected _parameters: ParametersModel[] = [];
private parameterUpdates: Map = new Map();
- private readonly _azdataApi: azdataExt.IExtension;
+ protected readonly _azdataApi: azdataExt.IExtension;
- constructor(protected modelView: azdata.ModelView, private _postgresModel: PostgresModel) {
+ constructor(protected modelView: azdata.ModelView, protected _postgresModel: PostgresModel) {
super(modelView);
+
this._azdataApi = vscode.extensions.getExtension(azdataExt.extension.name)?.exports;
this.initializeConnectButton();
@@ -49,17 +50,7 @@ export class PostgresParametersPage extends DashboardPage {
);
}
- protected get title(): string {
- return loc.nodeParameters;
- }
-
- protected get id(): string {
- return 'postgres-node-parameters';
- }
-
- protected get icon(): { dark: string; light: string; } {
- return IconPathHelper.gear;
- }
+ protected abstract get description(): string;
protected get container(): azdata.Component {
const root = this.modelView.modelBuilder.divContainer().component();
@@ -67,12 +58,12 @@ export class PostgresParametersPage extends DashboardPage {
root.addItem(content, { CSSStyles: { 'margin': '20px' } });
content.addItem(this.modelView.modelBuilder.text().withProps({
- value: loc.nodeParameters,
+ value: this.title,
CSSStyles: { ...cssStyles.title }
}).component());
content.addItem(this.modelView.modelBuilder.text().withProps({
- value: loc.nodeParametersDescription,
+ value: this.description,
CSSStyles: { ...cssStyles.text, 'margin-block-start': '0px', 'margin-block-end': '0px' }
}).component());
@@ -83,7 +74,7 @@ export class PostgresParametersPage extends DashboardPage {
content.addItem(this.searchBox!, { CSSStyles: { ...cssStyles.text, 'margin-block-start': '0px', 'margin-block-end': '0px', 'margin-bottom': '20px' } });
- this.parametersTable = this.modelView.modelBuilder.declarativeTable().withProps({
+ this._parametersTable = this.modelView.modelBuilder.declarativeTable().withProps({
width: '100%',
columns: [
{
@@ -124,7 +115,7 @@ export class PostgresParametersPage extends DashboardPage {
data: []
}).component();
- this._parametersTableLoading = this.modelView.modelBuilder.loadingComponent().component();
+ this.parametersTableLoading = this.modelView.modelBuilder.loadingComponent().component();
this.parameterContainer = this.modelView.modelBuilder.divContainer().component();
this.selectComponent();
@@ -162,12 +153,7 @@ export class PostgresParametersPage extends DashboardPage {
});
const session = await this._postgresModel.controllerModel.acquireAzdataSession();
try {
- await this._azdataApi.azdata.arc.postgres.server.edit(
- this._postgresModel.info.name,
- { engineSettings: engineSettings.toString() },
- this._postgresModel.engineVersion,
- this._postgresModel.controllerModel.azdataAdditionalEnvVars,
- session);
+ this.saveParameterEdits(engineSettings.toString(), session);
} finally {
session.dispose();
}
@@ -234,17 +220,9 @@ export class PostgresParametersPage extends DashboardPage {
cancellable: false
},
async (_progress, _token): Promise => {
- //all
- // azdata arc postgres server edit -n -e '' -re
- let session: azdataExt.AzdataSession | undefined = undefined;
+ const session = await this._postgresModel.controllerModel.acquireAzdataSession();
try {
- session = await this._postgresModel.controllerModel.acquireAzdataSession();
- await this._azdataApi.azdata.arc.postgres.server.edit(
- this._postgresModel.info.name,
- { engineSettings: `''`, replaceEngineSettings: true },
- this._postgresModel.engineVersion,
- this._postgresModel.controllerModel.azdataAdditionalEnvVars,
- session);
+ this.resetAllParameters(session);
} catch (err) {
// If an error occurs while resetting the instance then re-enable the reset button since
// the edit wasn't successfully applied
@@ -278,7 +256,7 @@ export class PostgresParametersPage extends DashboardPage {
]).component();
}
- private initializeConnectButton(): void {
+ protected initializeConnectButton(): void {
this.connectToServerButton = this.modelView.modelBuilder.button().withProps({
label: loc.connectToServer,
enabled: false,
@@ -314,12 +292,12 @@ export class PostgresParametersPage extends DashboardPage {
vscode.window.showInformationMessage(loc.extensionInstalled(loc.postgresExtension));
}
- this._parametersTableLoading!.loading = true;
- await this.callGetEngineSettings().finally(() => this._parametersTableLoading!.loading = false);
+ this.parametersTableLoading!.loading = true;
+ await this.callGetEngineSettings().finally(() => this.parametersTableLoading!.loading = false);
this.searchBox!.enabled = true;
this.resetAllButton!.enabled = true;
this.parameterContainer!.clearItems();
- this.parameterContainer!.addItem(this.parametersTable);
+ this.parameterContainer!.addItem(this._parametersTable);
})
);
}
@@ -331,11 +309,11 @@ export class PostgresParametersPage extends DashboardPage {
CSSStyles: { ...cssStyles.text, 'margin-block-start': '0px', 'margin-block-end': '0px' }
}).component());
this.parameterContainer!.addItem(this.connectToServerButton!, { CSSStyles: { 'max-width': '125px' } });
- this.parameterContainer!.addItem(this._parametersTableLoading!);
+ this.parameterContainer!.addItem(this.parametersTableLoading!);
} else {
this.searchBox!.enabled = true;
this.resetAllButton!.enabled = true;
- this.parameterContainer!.addItem(this.parametersTable!);
+ this.parameterContainer!.addItem(this._parametersTable!);
this.refreshParametersTable();
}
}
@@ -354,7 +332,7 @@ export class PostgresParametersPage extends DashboardPage {
}
}
- private initializeSearchBox(): void {
+ protected initializeSearchBox(): void {
this.searchBox = this.modelView.modelBuilder.inputBox().withProps({
readOnly: false,
enabled: false,
@@ -371,7 +349,7 @@ export class PostgresParametersPage extends DashboardPage {
@debounce(500)
private onSearchFilter(): void {
if (!this.searchBox!.value) {
- this.parametersTable.setFilter(undefined);
+ this._parametersTable.setFilter(undefined);
} else {
this.filterParameters(this.searchBox!.value);
}
@@ -379,12 +357,12 @@ export class PostgresParametersPage extends DashboardPage {
private filterParameters(search: string): void {
const filteredRowIndexes: number[] = [];
- this.parametersTable.data?.forEach((row, index) => {
+ this._parametersTable.data?.forEach((row, index) => {
if (row[0].toUpperCase()?.search(search.toUpperCase()) !== -1 || row[2].toUpperCase()?.search(search.toUpperCase()) !== -1) {
filteredRowIndexes.push(index);
}
});
- this.parametersTable.setFilter(filteredRowIndexes);
+ this._parametersTable.setFilter(filteredRowIndexes);
}
private handleOnTextChanged(component: azdata.InputBoxComponent, currentValue: string | undefined): boolean {
@@ -404,7 +382,7 @@ export class PostgresParametersPage extends DashboardPage {
}
}
- private createParameterComponents(engineSetting: EngineSettingsModel): ParametersModel {
+ protected createParameterComponents(engineSetting: EngineSettingsModel): ParametersModel {
// Container to hold input component and information bubble
const valueContainer = this.modelView.modelBuilder.flexContainer().withLayout({ alignItems: 'center' }).component();
@@ -540,12 +518,7 @@ export class PostgresParametersPage extends DashboardPage {
async (_progress, _token): Promise => {
const session = await this._postgresModel.controllerModel.acquireAzdataSession();
try {
- await this._azdataApi.azdata.arc.postgres.server.edit(
- this._postgresModel.info.name,
- { engineSettings: engineSetting.parameterName + '=' },
- this._postgresModel.engineVersion,
- this._postgresModel.controllerModel.azdataAdditionalEnvVars,
- session);
+ this.resetParameter(engineSetting.parameterName!, session);
} finally {
session.dispose();
}
@@ -570,15 +543,18 @@ export class PostgresParametersPage extends DashboardPage {
return parameter;
}
- private refreshParametersTable(): void {
- this._parameters = this._postgresModel._engineSettings.map(engineSetting => this.createParameterComponents(engineSetting));
- this.parametersTable.data = this._parameters.map(p => [p.parameterName, p.valueContainer, p.description, p.resetButton]);
- }
+ protected abstract saveParameterEdits(engineSettings: string, session: azdataExt.AzdataSession): void;
- private async handleServiceUpdated(): Promise {
+ protected abstract resetAllParameters(session: azdataExt.AzdataSession): void;
+
+ protected abstract resetParameter(parameterName: string, session: azdataExt.AzdataSession): void;
+
+ protected abstract refreshParametersTable(): void;
+
+ protected async handleServiceUpdated(): Promise {
if (this._postgresModel.configLastUpdated && !this._postgresModel.engineSettingsLastUpdated) {
this.connectToServerButton!.enabled = true;
- this._parametersTableLoading!.loading = false;
+ this.parametersTableLoading!.loading = false;
} else if (this._postgresModel.engineSettingsLastUpdated) {
await this.callGetEngineSettings();
this.discardButton!.enabled = false;
diff --git a/extensions/arc/src/ui/dashboards/postgres/postgresWorkerNodeParametersPage.ts b/extensions/arc/src/ui/dashboards/postgres/postgresWorkerNodeParametersPage.ts
new file mode 100644
index 0000000000..47d333cb5c
--- /dev/null
+++ b/extensions/arc/src/ui/dashboards/postgres/postgresWorkerNodeParametersPage.ts
@@ -0,0 +1,72 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as azdata from 'azdata';
+import * as azdataExt from 'azdata-ext';
+import * as loc from '../../../localizedConstants';
+import { IconPathHelper } from '../../../constants';
+import { PostgresParametersPage } from './postgresParameters';
+import { PostgresModel } from '../../../models/postgresModel';
+
+export class PostgresWorkerNodeParametersPage extends PostgresParametersPage {
+
+ constructor(protected modelView: azdata.ModelView, _postgresModel: PostgresModel) {
+ super(modelView, _postgresModel);
+ }
+
+ protected get title(): string {
+ // TODO update to loc.workerNodeParameters
+ return loc.nodeParameters;
+ }
+
+ protected get id(): string {
+ // TODO update to 'postgres-worker-node-parameters'
+ return 'postgres-nodes-parameters';
+ }
+
+ protected get icon(): { dark: string; light: string; } {
+ return IconPathHelper.gearBlue;
+ }
+
+ protected get description(): string {
+ // TODO update to loc.workerNodesParametersDescription
+ return loc.nodeParametersDescription;
+ }
+
+ protected async saveParameterEdits(engineSettings: string, session: azdataExt.AzdataSession): Promise {
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: engineSettings },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+
+ }
+
+ protected async resetAllParameters(session: azdataExt.AzdataSession): Promise {
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: `''`, replaceEngineSettings: true },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+
+ }
+
+ protected async resetParameter(parameterName: string, session: azdataExt.AzdataSession): Promise {
+ await this._azdataApi.azdata.arc.postgres.server.edit(
+ this._postgresModel.info.name,
+ { engineSettings: parameterName + '=' },
+ this._postgresModel.engineVersion,
+ this._postgresModel.controllerModel.azdataAdditionalEnvVars,
+ session);
+
+ }
+
+ protected refreshParametersTable(): void {
+ this._parameters = this._postgresModel.workerNodesEngineSettings.map(engineSetting => this.createParameterComponents(engineSetting));
+ this._parametersTable.data = this._parameters.map(p => [p.parameterName, p.valueContainer, p.description, p.resetButton]);
+ }
+}