Skip to content

Commit 62cc3b6

Browse files
committed
refactoring code complete
1 parent 0ee3a02 commit 62cc3b6

31 files changed

+1556
-970
lines changed

electron/app/js/appUpdater.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const i18n = require('./i18next.config');
1111
const { getLogger } = require('./wktLogging');
1212
const errorUtils = require('./errorUtils');
1313
const { sendToWindow } = require('./windowUtils');
14-
const osUtils = require('./osUtils');
1514

1615
let _isDevMode;
1716
let _downloadWindow;
@@ -35,22 +34,8 @@ function registerAutoUpdateListeners() {
3534
autoUpdater.logger.info('Download complete, install type: ' + _installType);
3635
// quit and install in this handler so MacOS updater can process the event first
3736
if(_installType === 'now') {
38-
// Working around https://github.com/electron-userland/electron-builder/issues/6418.
39-
//
40-
// This issue is fixed in [email protected] but that version suffers from
41-
// https://github.com/electron-userland/electron-builder/issues/6425, which causes
42-
// a Windows installer regression.
43-
//
44-
if (osUtils.isMac()) {
45-
autoUpdater.autoInstallOnAppQuit = false;
46-
}
4737
autoUpdater.quitAndInstall();
4838
}
49-
// On Windows, when _installType = 'onExit' and the app is installed for all users, [email protected]
50-
// doesn't work. This is fixed in [email protected] but that version suffers from
51-
// https://github.com/electron-userland/electron-builder/issues/6425, which causes
52-
// a Windows installer regression.
53-
//
5439
});
5540
}
5641

electron/app/js/fsUtils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ async function verifyFilesExist(baseDirectory, ...files) {
221221
const invalidFiles = [];
222222
for (const file of files) {
223223
let absolutePath = file;
224-
if (!path.isAbsolute(file)) {
224+
if (baseDirectory && !path.isAbsolute(file)) {
225225
absolutePath = path.join(baseDirectory, file);
226226
}
227227
const fileExists = await exists(absolutePath);

electron/app/js/helmUtils.js

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ async function addOrUpdateHelmChart(helmExe, repoName, repoUrl, helmOptions) {
7272
});
7373
}
7474

75-
async function installIngressController(helmExe, ingressControllerName, ingressChartName, ingressControllerNamespace, valuesData, helmChartValues, helmOptions) {
75+
async function installIngressController(helmExe, ingressControllerName, ingressChartName, ingressControllerNamespace,
76+
helmChartValues, helmOptions) {
77+
const args = [ 'install', ingressControllerName, ingressChartName, '--namespace', ingressControllerNamespace ];
78+
processHelmChartValues(args, helmChartValues);
79+
processHelmOptions(args, helmOptions);
80+
args.push('--wait');
7681

7782
const httpsProxyUrl = getHttpsProxyUrl();
7883
const bypassProxyHosts = getBypassProxyHosts();
@@ -81,28 +86,39 @@ async function installIngressController(helmExe, ingressControllerName, ingressC
8186
isSuccess: true
8287
};
8388
return new Promise(resolve => {
84-
fsUtils.writeTempFile(valuesData, { baseName: 'values', extension: '.yaml' }).then(fileName => {
85-
let args = [ 'install', ingressControllerName, ingressChartName, '--namespace', ingressControllerNamespace, '--values', fileName];
86-
processHelmChartValues(args, helmChartValues);
87-
processHelmOptions(args, helmOptions);
88-
executeFileCommand(helmExe, args, env).then(() => resolve(results)).catch(err => {
89-
results.isSuccess = false;
90-
results.reason = i18n.t('helm-install-ingress-controller-failed-error-message',
91-
{ namespace: ingressControllerNamespace, controllerName: ingressControllerName, error: getErrorMessage(err) });
92-
getLogger().error(results.reason);
93-
getLogger().error(err);
94-
resolve(results);
95-
});
96-
}).catch(err => {
89+
executeFileCommand(helmExe, args, env).then(() => resolve(results)).catch(err => {
9790
results.isSuccess = false;
98-
results.reason = i18n.t('helm-write-values-file-failed-error-message', { error: getErrorMessage(err) });
91+
results.reason = i18n.t('helm-install-ingress-controller-failed-error-message',
92+
{ namespace: ingressControllerNamespace, controllerName: ingressControllerName, error: getErrorMessage(err) });
9993
getLogger().error(results.reason);
10094
getLogger().error(err);
10195
resolve(results);
10296
});
103-
10497
});
98+
}
10599

100+
async function uninstallIngressController(helmExe, ingressName, ingressNamespace, helmOptions) {
101+
const args = [ 'uninstall', ingressName, '--namespace', ingressNamespace ];
102+
const httpsProxyUrl = getHttpsProxyUrl();
103+
const bypassProxyHosts = getBypassProxyHosts();
104+
const env = getHelmEnv(httpsProxyUrl, bypassProxyHosts, helmOptions);
105+
106+
processHelmOptions(args, helmOptions);
107+
const results = {
108+
isSuccess: true
109+
};
110+
111+
return new Promise(resolve => {
112+
executeFileCommand(helmExe, args, env).then(stdout => {
113+
getLogger().debug(stdout);
114+
resolve(results);
115+
}).catch(err => {
116+
results.isSuccess = false;
117+
results.reason = i18n.t('helm-uninstall-ingress-failed-error-message',
118+
{ controllerName: ingressName, namespace: ingressNamespace, error: getErrorMessage(err) });
119+
resolve(results);
120+
});
121+
});
106122
}
107123

108124
async function installWko(helmExe, name, namespace, helmChartValues, helmOptions) {
@@ -257,6 +273,7 @@ module.exports = {
257273
updateWko,
258274
helmListAllNamespaces,
259275
installIngressController,
276+
uninstallIngressController,
260277
addOrUpdateHelmChart,
261278
validateHelmExe
262279
};

electron/app/js/ipcRendererPreload.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ contextBridge.exposeInMainWorld(
7373
'start-wko-uninstall',
7474
'start-wko-update',
7575
'start-ingress-install',
76+
'start-ingress-uninstall',
7677
'add-ingress-routes',
7778
'app-download-progress',
7879
'start-k8s-domain-deploy',
80+
'start-k8s-domain-undeploy',
7981
'get-wko-domain-status',
8082
'start-app-quit',
8183
'start-window-close'
@@ -181,14 +183,16 @@ contextBridge.exposeInMainWorld(
181183
'helm-list-all-namespaces',
182184
'helm-add-update-repo',
183185
'helm-install-ingress-controller',
186+
'helm-uninstall-ingress-controller',
184187
'validate-openssl-exe',
185188
'k8s-create-tls-secret',
186189
'get-tls-keyfile',
187190
'get-tls-certfile',
188191
'k8s-delete-object',
189192
'openssl-generate-certs',
190193
'validate-k8s-namespaces-exist',
191-
'validate-wko-domain-exist'
194+
'validate-wko-domain-exist',
195+
'domain-undeploy-scope-prompt'
192196
];
193197
return new Promise((resolve, reject) => {
194198
if (validChannels.includes(channel)) {

electron/app/js/kubectlUtils.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ async function setCurrentContext(kubectlExe, context, options) {
8181
resolve(results);
8282
}).catch(err => {
8383
results.isSuccess = false;
84-
results.reason = i18n.t('kubectl-use-context-error-message',
85-
{ context: context, error: getErrorMessage(err) });
84+
results.reason = i18n.t('kubectl-use-context-error-message', { context: context, error: getErrorMessage(err) });
8685
resolve(results);
8786
});
8887
});
@@ -104,7 +103,7 @@ async function getK8sConfigView(kubectlExe, options) {
104103
}).catch(err => {
105104
results.isSuccess = false;
106105
results.reason =
107-
i18n.t('kubectl-config-view-error-message',{ error: getErrorMessage(err) });
106+
i18n.t('kubectl-config-view-error-message', { error: getErrorMessage(err) });
108107
resolve(results);
109108
});
110109
});
@@ -126,7 +125,7 @@ async function getK8sClusterInfo(kubectlExe, options) {
126125
}).catch(err => {
127126
results.isSuccess = false;
128127
results.reason =
129-
i18n.t('kubectl-config-view-error-message',{ error: getErrorMessage(err) });
128+
i18n.t('kubectl-cluster-info-error-message', { error: getErrorMessage(err) });
130129
resolve(results);
131130
});
132131
});
@@ -148,7 +147,7 @@ async function getWkoDomainStatus(kubectlExe, domainUID, domainNamespace, option
148147
}).catch(err => {
149148
results.isSuccess = false;
150149
results.reason =
151-
i18n.t('kubectl-get-wko-domain-status-error-message',{ error: getErrorMessage(err) });
150+
i18n.t('kubectl-get-wko-domain-status-error-message', { error: getErrorMessage(err) });
152151
resolve(results);
153152
});
154153
});
@@ -170,7 +169,7 @@ async function getOperatorStatus(kubectlExe, operatorNamespace, options) {
170169
}).catch(err => {
171170
results.isSuccess = false;
172171
results.reason =
173-
i18n.t('kubectl-get-operator-status-error-message',{ error: getErrorMessage(err) });
172+
i18n.t('kubectl-get-operator-status-error-message', { error: getErrorMessage(err) });
174173
resolve(results);
175174
});
176175
});
@@ -193,7 +192,7 @@ async function getOperatorLogs(kubectlExe, operatorNamespace, options) {
193192
}).catch(err => {
194193
results.isSuccess = false;
195194
results.reason =
196-
i18n.t('kubectl-get-operator-logs-error-message',{ error: getErrorMessage(err) });
195+
i18n.t('kubectl-get-operator-logs-error-message', { error: getErrorMessage(err) });
197196
resolve(results);
198197
});
199198
});
@@ -388,8 +387,16 @@ async function createNamespaceIfNotExists(kubectlExe, namespace, options) {
388387
}
389388

390389
async function deleteObjectIfExists(kubectlExe, namespace, object, kind, options) {
391-
const getArgs = [ 'get', '-n', namespace, kind, object, '--output=json' ];
392-
const deleteArgs = [ 'delete', kind, object, '-n', namespace ];
390+
let getArgs;
391+
let deleteArgs;
392+
if (kind === 'namespace') {
393+
getArgs = [ 'get', kind, object, '--output=json' ];
394+
deleteArgs = [ 'delete', kind, object ];
395+
} else {
396+
getArgs = [ 'get', '-n', namespace, kind, object, '--output=json' ];
397+
deleteArgs = [ 'delete', kind, object, '-n', namespace ];
398+
}
399+
393400
const httpsProxyUrl = getHttpsProxyUrl();
394401
const bypassProxyHosts = getBypassProxyHosts();
395402

electron/app/js/wktWindow.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,21 @@ class WktAppMenu {
387387
sendToWindow(focusedWindow, 'get-wko-domain-status');
388388
}
389389
},
390+
{
391+
id: 'undeployDomain',
392+
label: i18n.t('menu-go-undeploy-domain'),
393+
visible: this._isWkoTarget,
394+
enabled: !this._hasOpenDialog,
395+
click(item, focusedWindow) {
396+
if (!focusedWindow) {
397+
return dialog.showErrorBox(
398+
i18n.t('menu-go-undeploy-domain-error-title'),
399+
i18n.t('menu-go-undeploy-domain-error-message')
400+
);
401+
}
402+
sendToWindow(focusedWindow, 'start-k8s-domain-undeploy');
403+
}
404+
},
390405
{
391406
id: 'installIngress',
392407
label: i18n.t('menu-go-install-ingress'),
@@ -416,6 +431,21 @@ class WktAppMenu {
416431
}
417432
sendToWindow(focusedWindow,'add-ingress-routes');
418433
}
434+
},
435+
{
436+
id: 'uninstallIngress',
437+
label: i18n.t('menu-go-uninstall-ingress'),
438+
visible: this._isWkoTarget,
439+
enabled: !this._hasOpenDialog,
440+
click(item, focusedWindow) {
441+
if (!focusedWindow) {
442+
return dialog.showErrorBox(
443+
i18n.t('menu-go-uninstall-ingress-error-title'),
444+
i18n.t('menu-go-uninstall-ingress-error-message')
445+
);
446+
}
447+
sendToWindow(focusedWindow,'start-ingress-uninstall');
448+
}
419449
}
420450
]
421451
},
@@ -972,6 +1002,36 @@ async function promptUserForYesOrNoAnswer(targetWindow, title, message) {
9721002
});
9731003
}
9741004

1005+
async function promptUserForK8sDomainRemovalScope(targetWindow, title, question, details) {
1006+
return new Promise(resolve => {
1007+
dialog.showMessageBox(targetWindow, {
1008+
title: title,
1009+
message: question,
1010+
detail: details,
1011+
type: 'question',
1012+
buttons: [ i18n.t('button-cancel'), i18n.t('button-domain-only'), i18n.t('button-domain-namespace') ],
1013+
defaultId: 1,
1014+
cancelId: 0
1015+
}).then(dialogResponse => {
1016+
let response;
1017+
switch (dialogResponse.response) {
1018+
case 2:
1019+
response = 'namespace';
1020+
break;
1021+
1022+
case 1:
1023+
response = 'domain';
1024+
break;
1025+
1026+
case 0:
1027+
response = 'cancel';
1028+
break;
1029+
}
1030+
resolve(response);
1031+
});
1032+
});
1033+
}
1034+
9751035
async function promptUserForOkOrCancelAnswer(targetWindow, title, message) {
9761036
return new Promise(resolve => {
9771037
dialog.showMessageBox(targetWindow, {
@@ -1028,6 +1088,7 @@ module.exports = {
10281088
setHasOpenDialog,
10291089
setTargetType,
10301090
showErrorMessage,
1091+
promptUserForK8sDomainRemovalScope,
10311092
promptUserForOkOrCancelAnswer,
10321093
promptUserForYesOrNoAnswer
10331094
};

electron/app/locales/en/electron.json

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,18 @@
6060
"menu-go-domain-status": "Get WebLogic Domain Status",
6161
"menu-go-domain-status-error-title": "No Active Project Window",
6262
"menu-go-domain-status-error-message": "Cannot Get WebLogic domain status since there is no active window, and therefore no project with a WebLogic domain configuration to deploy.",
63+
"menu-go-undeploy-domain": "Undeploy WebLogic Domain from Kubernetes",
64+
"menu-go-undeploy-domain-error-title": "No Active Project Window",
65+
"menu-go-undeploy-domain-error-message": "Cannot undeploy WebLogic domain from Kubernetes since there is no active window, and therefore no project with a WebLogic domain configuration to deploy.",
6366
"menu-go-install-ingress": "Install Ingress Controller",
6467
"menu-go-install-ingress-error-title": "No Active Project Window",
6568
"menu-go-install-ingress-error-message": "Cannot install Ingress Controller since there is no active window, and therefore no ingress controller configuration to install.",
6669
"menu-go-add-routes-ingress": "Update Ingress Routes to Domain",
6770
"menu-go-add-routes-error-title": "No Active Project Window",
6871
"menu-go-add-routes-error-message": "Cannot Add/Update Ingress Routes since there is no active window, and therefore no ingress routes to add/update.",
72+
"menu-go-uninstall-ingress": "Uninstall Ingress Controller",
73+
"menu-go-uninstall-ingress-error-title": "No Active Project Window",
74+
"menu-go-uninstall-ingress-error-message": "Cannot uninstall Ingress Controller since there is no active window, and therefore no ingress controller configuration to uninstall.",
6975

7076
"menu-window": "Window",
7177
"menu-window-minimize": "Minimize",
@@ -181,6 +187,8 @@
181187
"button-useExistingLocation": "Use Existing Location",
182188
"button-update-now": "Update and Restart Now",
183189
"button-update-on-exit": "Update when Application Exits",
190+
"button-domain-only": "Remove Domain Only",
191+
"button-domain-namespace": "Remove Entire Namespace",
184192

185193
"tools-docker-hub": "Docker Hub",
186194

@@ -263,8 +271,9 @@
263271
"kubectl-label-ns-failed-error-message": "Unable to add label {{label}} to Kubernetes namespace {{namespace}} due to an error: {{error}}",
264272
"kubectl-delete-object-failed-error-message": "Failed to delete {{object}} in {{namespace}}, reason: {{error}}",
265273
"kubectl-get-service-details-error-message": "Unable to get service details in Kubernetes namespace {{namespace}}: {{error}}",
266-
"kubectl-config-view-error-message": "Unable to get k8s config view: {{error}}",
267-
"kubectl-get-wko-domain-status-error-message": "Unable to get k8s wko domain status: {{error}}",
274+
"kubectl-config-view-error-message": "Unable to get the Kubernetes config view: {{error}}",
275+
"kubectl-cluster-info-error-message": "Unable to get the Kubernetes cluster info: {{error}}",
276+
"kubectl-get-wko-domain-status-error-message": "Unable to get Kubernetes wko domain status: {{error}}",
268277
"kubectl-get-operator-status-error-message": "Unable to get wko operator status: {{error}}",
269278
"kubectl-get-operator-logs-error-message": "Unable to get wko operator logs: {{error}}",
270279
"kubectl-get-operator-version-from-cm-error-message": "Unable to get operator version: {{error}}",
@@ -276,13 +285,12 @@
276285
"helm-not-exists-error-message": "Helm executable {{filePath}} does not exist",
277286
"helm-exists-failed-error-message": "Unable to verify Helm executable {{filePath}} exists: {{error}}",
278287
"helm-repo-add-failed-error-message": "Unable to add Helm repo {{helmRepo}}: {{error}}",
279-
"helm-install-ingress-failed-error-message": "Unable to install Helm release {{name}} in Kubernetes namespace {{namespace}} using Helm chart {{helmChart}}: {{error}}",
280288
"helm-install-wko-failed-error-message": "Unable to install Helm release {{name}} in Kubernetes namespace {{namespace}} using Helm chart {{helmChart}}: {{error}}",
281289
"helm-uninstall-wko-failed-error-message": "Unable to uninstall Helm release {{name}} in Kubernetes namespace {{namespace}} using Helm chart {{helmChart}}: {{error}}",
282290
"helm-upgrade-wko-failed-error-message": "Unable to upgrade Helm release {{name}} in Kubernetes namespace {{namespace}} using Helm chart {{helmChart}}: {{error}}",
283291
"helm-list-failed-error-message": "Helm list --all-namespaces failed: {{error}}",
284-
"helm-write-values-file-failed-error-message": "Unable to run helm install due to an error writing the data to a temporary file: {{error}}",
285292
"helm-install-ingress-controller-failed-error-message": "Unable to install Ingress Controller {{controllerName}} in Kubernetes namespace {{namespace}}: {{error}}",
293+
"helm-uninstall-ingress-controller-failed-error-message": "Unable to uninstall Ingress Controller {{controllerName}} from Kubernetes namespace {{namespace}}: {{error}}",
286294

287295
"openssl-not-specified-error-message": "openssl executable path was not provided",
288296
"openssl-not-exists-error-message": "openssl executable {{filePath}} does not exist",

0 commit comments

Comments
 (0)