Skip to content

Commit

Permalink
fix: extract parameter normalization logic to utility (#1066)
Browse files Browse the repository at this point in the history
  • Loading branch information
minghay authored Jun 14, 2024
1 parent 3771d3d commit 89fd1e9
Show file tree
Hide file tree
Showing 3 changed files with 311 additions and 141 deletions.
143 changes: 2 additions & 141 deletions app/components/pipeline-parameterized-build/component.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { set } from '@ember/object';
import Component from '@ember/component';
import { getNormalizedParameterGroups } from 'screwdriver-ui/utils/pipeline/parameters';

/**
* @typedef {Object} ParameterOption Parameter name and value(s) (optional: description) pairs in Yaml
Expand Down Expand Up @@ -69,7 +70,7 @@ export default Component.extend({
init() {
this._super(...arguments);

const normalizedParameters = this.getNormalizedParameterGroups(
const normalizedParameters = getNormalizedParameterGroups(
this.buildPipelineParameters,
this.getDefaultPipelineParameters(),
this.buildJobParameters,
Expand Down Expand Up @@ -121,146 +122,6 @@ export default Component.extend({
: this.get('pipeline.jobParameters');
},

/**
* normalizeParameters transform given parameters from object into array of objects
* this method also backfills with default properties
* @param {Record<string, ParameterValue>} [parameters] Parameter name and value pairs
* @param {Record<string, ParameterValue>} [defaultParameters] Default parameter name and value pairs
* @return {Array<Record<string, Parameter>>} Parameter information array
* @example
* [{
* 0: {
* name: 'image',
* value: 'alpine',
* defaultValues: 'alpine',
* description: ''
* },
* 1: {
* name: 'tag',
* value: '1.0',
* defaultValues: ['1.0', '2.0', 'latest'],
* description: 'image version'
* },
* ...,
* }]
*/
normalizeParameters(parameters = {}, defaultParameters = {}) {
/** @type {Array<Record<string, Parameter>>} */
const normalizedParameters = [];

Object.entries(parameters).forEach(([propertyName, propertyVal]) => {
const value = propertyVal.value || propertyVal || '';
const description = propertyVal.description || '';
// If no default value is found, fill with build parameter value
const defaultPropertyVal = defaultParameters[propertyName]
? defaultParameters[propertyName]
: value;
const defaultValue =
defaultPropertyVal.value || defaultPropertyVal || value;

normalizedParameters.push({
name: propertyName,
value,
defaultValues: defaultValue,
description
});
});

return normalizedParameters;
},

/**
* Get normalized parameter groups
* @param {Record<string, ParameterValue>} pipelineParameters Pipeline parameters
* @param {Record<string, ParameterValue>} defaultPipelineParameters Default pipeline parameters
* @param {Record<string, JobParameterValue>} jobParameters Job parameters
* @param {Record<string, JobParameterValue>} defaultJobParameters Default job parameters
* @param {string|null} startFrom Starting job name (null when from the Start button)
* @return {Array<Record<string, ParameterGroup>>} Job or Shared name and parameter information pairs
* @example
* [
* {
* 0: {
* isOpen: true,
* jobName: null,
* paramGroupTitle: 'Shared',
* parameters: {
* 0: {
* name: 'namespace',
* value: 'sandbox',
* defaultValues: '',
* description: ''
* },
* 1: {...},
* }
* }
* },
* {
* 1: {
* isOpen: false,
* jobName: build,
* paramGroupTitle: 'Job: build',
* parameters: {...}
* }
* },
* {
* 2: {...}
* }
* ]
*/
getNormalizedParameterGroups(
pipelineParameters = {},
defaultPipelineParameters = {},
jobParameters = {},
defaultJobParameters = {},
startFrom
) {
/** @type {Array<Record<string, ParameterGroup>>} */
let normalizedParameterGroups = [];
/** @type {Array<Record<string, ParameterGroup>>} */
const normalizedJobParameterGroups = [];

Object.entries(jobParameters).forEach(([jobName, parameters]) => {
const paramGroup = {
jobName,
parameters: this.normalizeParameters(
parameters,
defaultJobParameters[jobName]
),
isOpen: false,
paramGroupTitle: `Job: ${jobName}`
};

if (startFrom === jobName) {
normalizedParameterGroups.push(paramGroup);
} else {
normalizedJobParameterGroups.push(paramGroup);
}
});

if (Object.keys(pipelineParameters).length > 0) {
normalizedParameterGroups.push({
jobName: null,
parameters: this.normalizeParameters(
pipelineParameters,
defaultPipelineParameters
),
isOpen: false,
paramGroupTitle: 'Shared'
});
}

if (normalizedParameterGroups.length > 0) {
normalizedParameterGroups[0].isOpen = true;
}

normalizedParameterGroups = normalizedParameterGroups.concat(
normalizedJobParameterGroups
);

return normalizedParameterGroups;
},

/**
* Get pairs of parameter name and value
* @param {Array<Parameter>} normalizedParameters
Expand Down
138 changes: 138 additions & 0 deletions app/utils/pipeline/parameters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/**
* normalizeParameters transform given parameters from object into array of objects
* this method also backfills with default properties
* @param {Record<string, ParameterValue>} [parameters] Parameter name and value pairs
* @param {Record<string, ParameterValue>} [defaultParameters] Default parameter name and value pairs
* @return {Array<Record<string, Parameter>>} Parameter information array
* @example
* [{
* 0: {
* name: 'image',
* value: 'alpine',
* defaultValues: 'alpine',
* description: ''
* },
* 1: {
* name: 'tag',
* value: '1.0',
* defaultValues: ['1.0', '2.0', 'latest'],
* description: 'image version'
* },
* ...,
* }]
*/
export function normalizeParameters(parameters = {}, defaultParameters = {}) {
/** @type {Array<Record<string, Parameter>>} */
const normalizedParameters = [];

Object.entries(parameters).forEach(([propertyName, propertyVal]) => {
const value = propertyVal.value || propertyVal;
const description = propertyVal.description || '';
// If no default value is found, fill with build parameter value
const defaultPropertyVal = Object.hasOwn(defaultParameters, propertyName)
? defaultParameters[propertyName]
: value;
const defaultPropertyDescription = Object.hasOwn(
defaultParameters,
propertyName
)
? defaultParameters[propertyName].description || description
: description;
const defaultValue = defaultPropertyVal.value || defaultPropertyVal;

normalizedParameters.push({
name: propertyName,
value,
defaultValues: defaultValue,
description: defaultPropertyDescription
});
});

return normalizedParameters;
}

/**
* Get normalized parameter groups
* @param {Record<string, ParameterValue>} pipelineParameters Pipeline parameters
* @param {Record<string, ParameterValue>} defaultPipelineParameters Default pipeline parameters
* @param {Record<string, JobParameterValue>} jobParameters Job parameters
* @param {Record<string, JobParameterValue>} defaultJobParameters Default job parameters
* @param {string|null} startFrom Starting job name (null when from the Start button)
* @return {Array<Record<string, ParameterGroup>>} Job or Shared name and parameter information pairs
* @example
* [
* {
* 0: {
* isOpen: true,
* jobName: null,
* paramGroupTitle: 'Shared',
* parameters: {
* 0: {
* name: 'namespace',
* value: 'sandbox',
* defaultValues: '',
* description: ''
* },
* 1: {...},
* }
* }
* },
* {
* 1: {
* isOpen: false,
* jobName: build,
* paramGroupTitle: 'Job: build',
* parameters: {...}
* }
* },
* {
* 2: {...}
* }
* ]
*/
export function getNormalizedParameterGroups(
pipelineParameters = {},
defaultPipelineParameters = {},
jobParameters = {},
defaultJobParameters = {},
startFrom
) {
/** @type {Array<Record<string, ParameterGroup>>} */
const normalizedParameterGroups = [];
/** @type {Array<Record<string, ParameterGroup>>} */
const normalizedJobParameterGroups = [];

Object.entries(jobParameters).forEach(([jobName, parameters]) => {
const paramGroup = {
jobName,
parameters: normalizeParameters(
parameters,
defaultJobParameters[jobName]
),
isOpen: false,
paramGroupTitle: `Job: ${jobName}`
};

if (startFrom === jobName) {
normalizedParameterGroups.push(paramGroup);
} else {
normalizedJobParameterGroups.push(paramGroup);
}
});

if (Object.keys(pipelineParameters).length > 0) {
normalizedParameterGroups.push({
jobName: null,
parameters: normalizeParameters(
pipelineParameters,
defaultPipelineParameters
),
isOpen: false,
paramGroupTitle: 'Shared'
});
}

normalizedParameterGroups[0].isOpen = true;

return normalizedParameterGroups.concat(normalizedJobParameterGroups);
}
Loading

0 comments on commit 89fd1e9

Please sign in to comment.