Skip to content

Commit f1e16bd

Browse files
authored
Read cluster and secrets from the WDT results JSON file (#178)
1 parent 5c39771 commit f1e16bd

File tree

8 files changed

+40
-200
lines changed

8 files changed

+40
-200
lines changed

electron/app/js/wdtPrepareModel.js

Lines changed: 31 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
const path = require('path');
99
const { readFile } = require('fs/promises');
10-
const jsYaml = require('js-yaml');
1110

1211
const i18n = require('./i18next.config');
1312
const childProcessExecutor = require('./childProcessExecutor');
@@ -19,15 +18,10 @@ const errorUtils = require('./errorUtils');
1918

2019
const MINIMUM_WDT_PREPARE_VERSION = '2.0.0';
2120

22-
const _secretsFileName = 'k8s_secrets.json';
23-
const _wkoDomainSpecFileName = 'wko-domain.yaml';
24-
const _vzApplicationSpecFileName = 'vz-application.yaml';
21+
const _resultsFileName = 'results.json';
2522

2623
const _deleteTempDirectory = true;
2724

28-
const _wkoTargetTypeName = i18n.t('prepare-model-wko-target-type-name');
29-
const _vzTargetTypeName = i18n.t('prepare-model-wko-target-type-name');
30-
3125
async function prepareModel(currentWindow, stdoutChannel, stderrChannel, prepareConfig) {
3226
const logger = getLogger();
3327
const { javaHome, oracleHome, projectDirectory, modelsSubdirectory, modelFiles,
@@ -119,7 +113,9 @@ async function prepareModel(currentWindow, stdoutChannel, stderrChannel, prepare
119113
}
120114

121115
try {
122-
results['secrets'] = await getJsonSecretsContent(outputDirectory);
116+
const jsonResults = await getJsonResultsContent(outputDirectory);
117+
results['secrets'] = jsonResults['secrets'];
118+
results['domain'] = jsonResults['domain'];
123119
} catch (err) {
124120
results.isSuccess = false;
125121
results.reason = errorUtils.getErrorMessage(err);
@@ -129,14 +125,6 @@ async function prepareModel(currentWindow, stdoutChannel, stderrChannel, prepare
129125
return Promise.resolve(results);
130126
}
131127

132-
try {
133-
results['domain'] = await getTargetSpecContent(wdtTargetType, outputDirectory);
134-
} catch (err) {
135-
results.isSuccess = false;
136-
results.reason = errorUtils.getErrorMessage(err);
137-
results.error = err;
138-
logger.error(results.reason);
139-
}
140128
removeTempDirectory(outputDirectory).then().catch();
141129
return Promise.resolve(results);
142130
}
@@ -228,49 +216,48 @@ function getUpdatedModelFileNames(updatedFileMap, files) {
228216
return updatedFiles;
229217
}
230218

231-
async function getJsonSecretsContent(outputDirectory) {
232-
const secretsFileName = path.join(outputDirectory, _secretsFileName);
219+
async function getJsonResultsContent(outputDirectory) {
220+
const resultsFileName = path.join(outputDirectory, _resultsFileName);
233221

234222
return new Promise((resolve, reject) => {
235-
fsUtils.exists(secretsFileName).then(doesExist => {
223+
fsUtils.exists(resultsFileName).then(doesExist => {
236224
if (!doesExist) {
237-
return reject(new Error(i18n.t('prepare-model-secrets-file-missing-error-message',
238-
{ fileName: secretsFileName })));
225+
return reject(new Error(i18n.t('prepare-model-results-file-missing-error-message',
226+
{ fileName: resultsFileName })));
239227
}
240228

241-
readFile(secretsFileName, { encoding: 'utf8' }).then(data => {
229+
readFile(resultsFileName, { encoding: 'utf8' }).then(data => {
242230
let jsonContent;
243231
try {
244232
jsonContent = JSON.parse(data);
245-
resolve(formatSecretsData(jsonContent));
233+
resolve(formatResultsData(jsonContent));
246234
} catch (err) {
247-
const error = new Error(i18n.t('prepare-model-secrets-file-parse-error-message',
248-
{ fileName: secretsFileName, error: errorUtils.getErrorMessage(err) }));
235+
const error = new Error(i18n.t('prepare-model-results-file-parse-error-message',
236+
{ fileName: resultsFileName, error: errorUtils.getErrorMessage(err) }));
249237
error.cause = err;
250238
reject(err);
251239
}
252240
}).catch(err => {
253-
const error = new Error(i18n.t('prepare-model-secrets-file-read-error-message',
254-
{ fileName: secretsFileName, error: errorUtils.getErrorMessage(err) }));
241+
const error = new Error(i18n.t('prepare-model-results-file-read-error-message',
242+
{ fileName: resultsFileName, error: errorUtils.getErrorMessage(err) }));
255243
error.cause = err;
256244
reject(err);
257245
});
258246
}).catch(err => reject(err));
259247
});
260248
}
261249

262-
function formatSecretsData(jsonContent) {
250+
function formatResultsData(jsonContent) {
263251
const results = { };
264252
if (!jsonContent) {
265253
return results;
266254
}
267255

268-
results['domainUID'] = jsonContent.domainUID;
269256
const secrets = jsonContent['secrets'] || [];
270257
results.secrets = [];
271-
for (const secret of secrets) {
258+
for (const [secretName, secret] of Object.entries(secrets)) {
272259
const secretResult = {
273-
name: secret['secretName']
260+
name: secretName
274261
};
275262
const secretKeys = secret['keys'];
276263
if (secretKeys) {
@@ -289,169 +276,30 @@ function formatSecretsData(jsonContent) {
289276
results.secrets.push(secretResult);
290277
}
291278
}
292-
return results;
293-
}
294-
295-
async function getTargetSpecContent(wdtTargetType, outputDirectory) {
296-
let result = { };
297-
switch (wdtTargetType) {
298-
case 'wko':
299-
result = await getWkoSpecContent(outputDirectory);
300-
break;
301-
302-
case 'vz':
303-
result = await getVzSpecContent(outputDirectory);
304-
break;
305-
306-
default:
307-
// k8s target produces no spec...
308-
break;
309-
}
310-
return Promise.resolve(result);
311-
}
312-
313-
async function getWkoSpecContent(outputDirectory) {
314-
const specFile = path.join(outputDirectory, _wkoDomainSpecFileName);
315-
316-
return new Promise((resolve, reject) => {
317-
fsUtils.exists(specFile).then(doesExist => {
318-
if (!doesExist) {
319-
const error = new Error(i18n.t('prepare-model-spec-file-missing-error-message',
320-
{ targetType: _wkoTargetTypeName, fileName: specFile }));
321-
reject(error);
322-
}
323279

324-
readFile(specFile, { encoding: 'utf8' }).then(data => {
325-
try {
326-
const yamlDoc = jsYaml.load(data, { filename: specFile, json: true });
327-
resolve(formatWkoDomainSpecData(yamlDoc));
328-
} catch (err) {
329-
const error = new Error(i18n.t('prepare-model-spec-file-parse-error-message',
330-
{ targetType: _wkoTargetTypeName, fileName: specFile, error: errorUtils.getErrorMessage(err) }));
331-
error.cause = err;
332-
reject(error);
333-
}
334-
}).catch(err => {
335-
const error = new Error(i18n.t('prepare-model-spec-file-read-error-message',
336-
{ targetType: _wkoTargetTypeName, fileName: specFile, error: errorUtils.getErrorMessage(err) }));
337-
error.cause = err;
338-
reject(error);
339-
});
340-
}).catch(err => reject(getFileExistsErrorMessage(_wkoTargetTypeName, specFile, err)));
341-
});
342-
}
280+
const domain = {};
281+
domain['domainUID'] = jsonContent.domainUID;
343282

344-
function formatWkoDomainSpecData(yamlDoc) {
345-
const result = { };
346-
if (yamlDoc) {
347-
if ('metadata' in yamlDoc && 'name' in yamlDoc['metadata']) {
348-
result['domainUID'] = yamlDoc['metadata']['name'];
349-
}
350-
if ('spec' in yamlDoc && 'clusters' in yamlDoc['spec']) {
351-
const clusters = yamlDoc['spec']['clusters'];
352-
const clustersResult = [];
353-
for (const cluster of clusters) {
354-
const clusterResult = {
355-
clusterName: cluster['clusterName'],
356-
replicas: cluster['replicas'] || 0
357-
};
358-
clustersResult.push(clusterResult);
359-
}
360-
result['clusters'] = clustersResult;
361-
}
283+
const clusters = jsonContent['clusters'] || [];
284+
const clustersResult = [];
285+
for (const [clusterName, cluster] of Object.entries(clusters)) {
286+
const clusterResult = {
287+
clusterName: clusterName,
288+
replicas: cluster['serverCount'] || 0
289+
};
290+
clustersResult.push(clusterResult);
362291
}
363-
return result;
364-
}
365-
366-
async function getVzSpecContent(outputDirectory) {
367-
const specFile = path.join(outputDirectory, _vzApplicationSpecFileName);
292+
domain['clusters'] = clustersResult;
368293

369-
return new Promise((resolve, reject) => {
370-
fsUtils.exists(specFile).then(doesExist => {
371-
if (!doesExist) {
372-
const error = new Error(i18n.t('prepare-model-spec-file-missing-error-message',
373-
{ targetType: _vzTargetTypeName, fileName: specFile }));
374-
reject(error);
375-
}
376-
377-
readFile(specFile, { encoding: 'utf8' }).then(data => {
378-
let yamlDocs;
379-
try {
380-
yamlDocs = jsYaml.loadAll(data, { filename: specFile, json: true });
381-
} catch (err) {
382-
const error = new Error(i18n.t('prepare-model-spec-file-parse-error-message',
383-
{ targetType: _vzTargetTypeName, fileName: specFile, error: errorUtils.getErrorMessage(err) }));
384-
error.cause = err;
385-
reject(error);
386-
}
387-
388-
try {
389-
resolve(formatVzApplicationSpecData(specFile, yamlDocs));
390-
} catch (err) {
391-
reject(err);
392-
}
393-
}).catch(err => {
394-
const error = new Error(i18n.t('prepare-model-spec-file-read-error-message',
395-
{ targetType: _vzTargetTypeName, fileName: specFile, error: errorUtils.getErrorMessage(err) }));
396-
error.cause = err;
397-
reject(error);
398-
});
399-
}).catch(err => reject(getFileExistsErrorMessage(_wkoTargetTypeName, specFile, err)));
400-
});
294+
results['domain'] = domain;
295+
return results;
401296
}
402297

403298
function getToolTargetType(wdtTargetType, targetDomainLocation) {
404299
const suffix = targetDomainLocation === 'mii' ? '' : `-${targetDomainLocation}`;
405300
return `${wdtTargetType}${suffix}`;
406301
}
407302

408-
function getFileExistsErrorMessage(targetType, fileName, err) {
409-
const error = new Error(i18n.t('prepare-model-spec-file-exists-error-message',
410-
{ targetType: targetType, fileName: fileName, error: errorUtils.getErrorMessage(err) }));
411-
error.cause = err;
412-
return error;
413-
}
414-
415-
function formatVzApplicationSpecData(specFile, yamlDocs) {
416-
const domainSpec = findVzDomainSpec(specFile, yamlDocs);
417-
const domainUID = domainSpec.domainUID;
418-
419-
const clustersResult = [];
420-
if (domainSpec.clusters) {
421-
for (const cluster of domainSpec.clusters) {
422-
clustersResult.push({ clusterName: cluster.clusterName, replicas: cluster.replicas });
423-
}
424-
}
425-
return {
426-
domainUID: domainUID,
427-
clusters: clustersResult
428-
};
429-
}
430-
431-
function findVzDomainSpec(specFile, yamlDocs) {
432-
let result;
433-
if (yamlDocs && yamlDocs.length > 0) {
434-
for (const yamlDoc of yamlDocs) {
435-
if (yamlDoc['kind'] !== 'Component') {
436-
continue;
437-
}
438-
if (yamlDoc.spec?.workload?.kind === 'VerrazzanoWebLogicWorkload') {
439-
result = yamlDoc;
440-
break;
441-
}
442-
}
443-
}
444-
445-
if (!result) {
446-
throw new Error(i18n.t('prepare-model-vz-spec-file-missing-domain-error-message', { fileName: specFile }));
447-
} else if (!result.spec?.workload?.spec?.template?.spec) {
448-
throw new Error(i18n.t('prepare-model-vz-spec-file-missing-spec-error-message', { fileName: specFile }));
449-
} else {
450-
result = result.spec.workload.spec.template.spec;
451-
}
452-
return result;
453-
}
454-
455303
module.exports = {
456304
prepareModel
457305
};

electron/app/locales/en/electron.json

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -250,17 +250,9 @@
250250
"prepare-model-model-file-not-exists-error-message": "Unable to prepare model with non-existent model file: {{modelFile}}.",
251251
"prepare-model-error-exit-code-error-message": "Prepare Model script exited with {{exitCode}}, which indicates an error.",
252252
"prepare-model-execution-failed-error-message": "Prepare Model script failed: {{error}}",
253-
"prepare-model-secrets-file-missing-error-message": "Prepare Model failed to generate the expected secrets file {{fileName}}",
254-
"prepare-model-secrets-file-read-error-message": "Prepare Model failed to read secrets file {{fileName}}: {{error}}",
255-
"prepare-model-secrets-file-parse-error-message": "Prepare Model failed to parse secrets file {{fileName}}: {{error}}",
256-
"prepare-model-spec-file-missing-error-message": "Prepare Model failed to generate the expected {{targetType}} specification file {{fileName}}",
257-
"prepare-model-spec-file-exists-error-message": "Prepare Model failed to determine whether the {{targetType}} specification file {{fileName}} exists: {{error}}",
258-
"prepare-model-spec-file-read-error-message": "Prepare Model failed to read the {{targetType}} specification file {{fileName}}: {{error}}",
259-
"prepare-model-spec-file-parse-error-message": "Prepare Model failed to parse the {{targetType}} specification file {{fileName}}: {{error}}",
260-
"prepare-model-vz-spec-file-missing-domain-error-message": "Prepare model failed to find the Verrazzano component that defined the WebLogic Kubernetes Operator domain in {{fileName}}",
261-
"prepare-model-vz-spec-file-missing-spec-error-message": "Prepare model failed to find the WebLogic Kubernetes Operator domain's spec field in the Verrazzano component defined in {{fileName}}",
262-
"prepare-model-wko-target-type-name": "WebLogic Kubernetes Operator domain",
263-
"prepare-model-vz-target-type-name": "Verrazzano application",
253+
"prepare-model-results-file-missing-error-message": "Prepare Model failed to generate the expected results file {{fileName}}",
254+
"prepare-model-results-file-read-error-message": "Prepare Model failed to read results file {{fileName}}: {{error}}",
255+
"prepare-model-results-file-parse-error-message": "Prepare Model failed to parse results file {{fileName}}: {{error}}",
264256

265257
"wit-inspect-inspect-error-message": "Inspecting image {{imageTag}} failed: {{error}}.",
266258
"wit-inspect-inspect-parse-error-message": "Inspecting image {{imageTag}} failed due to a JSON parse error parsing the response: {{error}}.",

tools/wdt-config/targets/vz-dii/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "lax",
9-
"credentials_output_method" : "script",
9+
"results_output_method" : "json",
1010
"exclude_domain_bin_contents": true,
1111
"wls_credentials_name" : "__weblogic-credentials__",
1212
"additional_output" : "vz-application.yaml",

tools/wdt-config/targets/vz-pv/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "lax",
9-
"credentials_output_method" : "script",
9+
"results_output_method" : "json",
1010
"exclude_domain_bin_contents": true,
1111
"wls_credentials_name" : "__weblogic-credentials__",
1212
"additional_output" : "vz-application.yaml",

tools/wdt-config/targets/vz/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "wktui",
99
"credentials_method" : "secrets",
10-
"credentials_output_method" : "json",
10+
"results_output_method" : "json",
1111
"exclude_domain_bin_contents": true,
1212
"wls_credentials_name" : "__weblogic-credentials__",
1313
"additional_secrets": "runtime-encryption-secret",

tools/wdt-config/targets/wko-dii/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "wktui",
9-
"credentials_output_method" : "json",
9+
"results_output_method" : "json",
1010
"exclude_domain_bin_contents": true,
1111
"wls_credentials_name" : "__weblogic-credentials__",
1212
"additional_output" : "wko-domain.yaml",

tools/wdt-config/targets/wko-pv/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "wktui",
9-
"credentials_output_method" : "json",
9+
"results_output_method" : "json",
1010
"exclude_domain_bin_contents": true,
1111
"wls_credentials_name" : "__weblogic-credentials__",
1212
"additional_output" : "wko-domain.yaml",

tools/wdt-config/targets/wko/target.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"variable_injectors" : {"PORT": {},"HOST": {},"URL": {}},
88
"validation_method" : "wktui",
99
"credentials_method" : "secrets",
10-
"credentials_output_method" : "json",
10+
"results_output_method" : "json",
1111
"exclude_domain_bin_contents": true,
1212
"wls_credentials_name" : "__weblogic-credentials__",
1313
"additional_secrets": "runtime-encryption-secret",

0 commit comments

Comments
 (0)