Skip to content

Commit 7830dbd

Browse files
committed
Merge branch 'wko-version-fix' into 'main'
fixing code that gets operator version from logs to parse the streamed logs See merge request weblogic-cloud/weblogic-toolkit-ui!262
2 parents ace2eb8 + 483e569 commit 7830dbd

File tree

5 files changed

+35
-94
lines changed

5 files changed

+35
-94
lines changed

electron/app/js/ipcRendererPreload.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ contextBridge.exposeInMainWorld(
201201
'k8s-get-k8s-cluster-info',
202202
'k8s-get-wko-domain-status',
203203
'k8s-get-operator-status',
204-
'k8s-get-operator-log',
205204
'helm-add-wko-chart',
206205
'helm-install-wko',
207206
'helm-uninstall-wko',

electron/app/js/kubectlUtils.js

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
'use strict';
77

88
const path = require('path');
9+
const readline = require('readline');
910

1011
const i18n = require('./i18next.config');
1112
const fsUtils = require('./fsUtils');
12-
const { executeFileCommand } = require('./childProcessExecutor');
13+
const { executeFileCommand, spawnDaemonChildProcess } = require('./childProcessExecutor');
1314
const { getLogger } = require('./wktLogging');
1415
const { getHttpsProxyUrl, getBypassProxyHosts } = require('./userSettings');
1516
const { getErrorMessage } = require('./errorUtils');
@@ -210,7 +211,7 @@ async function getOperatorStatus(kubectlExe, operatorNamespace, options) {
210211
});
211212
}
212213

213-
async function getOperatorLogs(kubectlExe, operatorNamespace, options) {
214+
async function getOperatorVersion(kubectlExe, operatorNamespace, options) {
214215
const args = [ 'logs', '-n', operatorNamespace, '-c', 'weblogic-operator', 'deployments/weblogic-operator'];
215216
const httpsProxyUrl = getHttpsProxyUrl();
216217
const bypassProxyHosts = getBypassProxyHosts();
@@ -219,38 +220,42 @@ async function getOperatorLogs(kubectlExe, operatorNamespace, options) {
219220
isSuccess: true
220221
};
221222

222-
return new Promise(resolve => {
223-
executeFileCommand(kubectlExe, args, env).then(operatorLogs => {
224-
const logs = operatorLogs.split('\n');
225-
results['operatorLogs'] = logs;
226-
resolve(results);
227-
}).catch(err => {
223+
return new Promise((resolve) => {
224+
const _kubectlChildProcess = spawnDaemonChildProcess(kubectlExe, args, env);
225+
_kubectlChildProcess.on('error', (err) => {
228226
results.isSuccess = false;
229-
results.reason =
230-
i18n.t('kubectl-get-operator-logs-error-message', { error: getErrorMessage(err) });
227+
results.reason = i18n.t('kubectl-get-operator-version-error-message', { error: getErrorMessage(err) });
231228
resolve(results);
232229
});
233-
});
234-
}
235-
236-
async function getOperatorVersion(kubectlExe, operatorNamespace, options) {
237-
const results = {
238-
isSuccess: true
239-
};
230+
_kubectlChildProcess.on('exit', (code) => {
231+
getLogger().debug('kubectl command to get the operator version from the pod log exited with code %s', code);
232+
results.isSuccess = false;
233+
results.reason = i18n.t('kubectl-get-operator-version-no-version-message', { code });
234+
});
240235

241-
return new Promise(resolve => {
242-
getOperatorLogs(kubectlExe, operatorNamespace, options).then(logResult => {
243-
if (logResult.isSuccess === false) {
244-
results.isSuccess = false;
245-
results.reason = i18n.t('kubectl-get-operator-version-error-message', {error: logResult.reason});
246-
return resolve(results);
236+
const stdoutLines = readline.createInterface({ input: _kubectlChildProcess.stdout });
237+
const stderrLines = readline.createInterface({ input: _kubectlChildProcess.stderr });
238+
239+
let foundVersion = false;
240+
const versionRegex = /^Oracle WebLogic Kubernetes Operator, version:\s*(\d+\.\d+\.\d+).*$/;
241+
stdoutLines.on('line', (line) => {
242+
if (!foundVersion) {
243+
const parseEntry = _parseLogEntryAsJson(line);
244+
if (typeof parseEntry !== 'undefined') {
245+
const message = parseEntry.message || '';
246+
const matcher = message.match(versionRegex);
247+
248+
if (Array.isArray(matcher) && matcher.length > 1) {
249+
foundVersion = true;
250+
results.version = matcher[1];
251+
getLogger().debug('Found installed operator version %s', results.version);
252+
resolve(results);
253+
}
254+
}
247255
}
248-
_getOperatorVersionFromLogs(logResult.operatorLogs, results);
249-
resolve(results);
250-
}).catch(err => {
251-
results.isSuccess = false;
252-
results.reason = i18n.t('kubectl-get-operator-version-error-message', {error: getErrorMessage(err)});
253-
resolve(results);
256+
});
257+
stderrLines.on('line', (line) => {
258+
getLogger().debug('kubectl logs for operator pod stderr: %s', line.trim());
254259
});
255260
});
256261
}
@@ -1139,32 +1144,6 @@ function isNotFoundError(err) {
11391144
return /\(NotFound\)/.test(errString);
11401145
}
11411146

1142-
function _getOperatorVersionFromLogs(operatorLogs, results) {
1143-
const versionRegex = /^Oracle WebLogic Kubernetes Operator, version:\s*(\d+\.\d+\.\d+).*$/;
1144-
if (Array.isArray(operatorLogs) && operatorLogs.length > 0) {
1145-
for (const logEntry of operatorLogs) {
1146-
const parsedEntry = _parseLogEntryAsJson(logEntry);
1147-
if (typeof parsedEntry === 'undefined') {
1148-
continue;
1149-
}
1150-
1151-
const message = parsedEntry.message || '';
1152-
const match = message.match(versionRegex);
1153-
if (Array.isArray(match) && match.length > 1) {
1154-
results.isSuccess = true;
1155-
results.version = match[1];
1156-
getLogger().debug('Found installed operator version %s', results.version);
1157-
return;
1158-
}
1159-
}
1160-
results.isSuccess = false;
1161-
results.reason = i18n.t('kubectl-get-operator-version-not-found-error-message');
1162-
} else {
1163-
results.isSuccess = false;
1164-
results.reason = i18n.t('kubectl-get-operator-version-logs-empty-error-message');
1165-
}
1166-
}
1167-
11681147
function _parseLogEntryAsJson(logEntry) {
11691148
let result;
11701149

@@ -1199,12 +1178,10 @@ module.exports = {
11991178
getK8sConfigView,
12001179
getK8sClusterInfo,
12011180
getVerrazzanoApplicationHostnames,
1202-
getVerrazzanoIngressExternalAddress,
12031181
getWkoDomainStatus,
12041182
getApplicationStatus,
12051183
getOperatorStatus,
12061184
getOperatorVersionFromDomainConfigMap,
1207-
getOperatorLogs,
12081185
getVerrazzanoInstallationObject,
12091186
getKubernetesObjectsByNamespace,
12101187
getKubernetesObjectsFromAllNamespaces,

electron/app/locales/en/electron.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@
330330
"kubectl-get-operator-status-error-message": "Unable to get wko operator status: {{error}}",
331331
"kubectl-get-operator-logs-error-message": "Unable to get WebLogic Kubernetes Operator logs: {{error}}",
332332
"kubectl-get-operator-version-error-message": "Unable to determine the WebLogic Kubernetes Operator version: {{error}}",
333+
"kubectl-get-operator-version-no-version-message": "Unable to determine the WebLogic Kubernetes Operator version because kubectl log exited with code {{code}} before finding the version",
333334
"kubectl-get-operator-version-logs-empty-error-message": "Unable to determine the WebLogic Kubernetes Operator version because the operator log was empty",
334335
"kubectl-get-operator-version-from-cm-error-message": "Unable to get operator version: {{error}}",
335336
"kubectl-tlsfile-not-specified-error-message": "TLS file path was not provided",

electron/app/main.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -910,10 +910,6 @@ class Main {
910910
return kubectlUtils.getOperatorStatus(kubectlExe, operatorNamespace, options);
911911
});
912912

913-
ipcMain.handle('k8s-get-operator-log', async (event, kubectlExe, operatorNamespace, options) => {
914-
return kubectlUtils.getOperatorLogs(kubectlExe, operatorNamespace, options);
915-
});
916-
917913
ipcMain.handle('k8s-get-operator-version-from-domain-config-map', async (event, kubectlExe, domainNamespace, options) => {
918914
return kubectlUtils.getOperatorVersionFromDomainConfigMap(kubectlExe, domainNamespace, options);
919915
});

webui/src/js/views/add-to-archive-dialog.html

Lines changed: 0 additions & 32 deletions
This file was deleted.

0 commit comments

Comments
 (0)