a628e2969a
* variables.new initialized * Hacky but savey * Variable wildcard route and multiple creatable at a time * multiple KVs per variable * PR Prep cleanup and lintfix * Delog * Data mocking in mirage for variables * Linting fixes * Re-implement absent params * Adapter and model tests * Moves the path-as-id logic to a serializer instead of adapter * Classic to serializer and lint cleanup * Pluralized save button (#13140) * Autofocus modifier and better Add More button UX (#13145) * Secure Variables: show/hide functionality when adding new values (#13137) * Flight Icons added and show hide functionality * PR cleanup * Linting cleanup * Position of icon moved to the right of input * PR feedback addressed * Delete button and stylistic changes to show hide * Hmm, eslint doesnt like jsdoc-usage as only reason for import * More closely match the button styles and delete test * Simplified new.js model * Secure Variables: /variables/*path/edit route and functionality (#13170) * Variable edit page init * Significant change to where we house model methods * Lintfix * Edit a variable tests * Remove redundant tests * Asserts expected * Mirage factory updated to reflect model state
256 lines
6.9 KiB
JavaScript
256 lines
6.9 KiB
JavaScript
import config from 'nomad-ui/config/environment';
|
|
import * as topoScenarios from './topo';
|
|
import * as sysbatchScenarios from './sysbatch';
|
|
import { pickOne } from '../utils';
|
|
|
|
const withNamespaces = getConfigValue('mirageWithNamespaces', false);
|
|
const withTokens = getConfigValue('mirageWithTokens', true);
|
|
const withRegions = getConfigValue('mirageWithRegions', false);
|
|
|
|
const allScenarios = {
|
|
smallCluster,
|
|
mediumCluster,
|
|
largeCluster,
|
|
massiveCluster,
|
|
allJobTypes,
|
|
allNodeTypes,
|
|
everyFeature,
|
|
emptyCluster,
|
|
...topoScenarios,
|
|
...sysbatchScenarios,
|
|
};
|
|
|
|
const scenario =
|
|
getScenarioQueryParameter() ||
|
|
getConfigValue('mirageScenario', 'emptyCluster');
|
|
|
|
export default function (server) {
|
|
const activeScenario = allScenarios[scenario];
|
|
if (!activeScenario) {
|
|
throw new Error(
|
|
`Selected Mirage scenario does not exist.\n\n${scenario} not in list: \n\n\t${Object.keys(
|
|
allScenarios
|
|
).join('\n\t')}`
|
|
);
|
|
}
|
|
|
|
if (withNamespaces) createNamespaces(server);
|
|
if (withTokens) createTokens(server);
|
|
if (withRegions) createRegions(server);
|
|
activeScenario(server);
|
|
}
|
|
|
|
// Scenarios
|
|
|
|
function smallCluster(server) {
|
|
server.create('feature', { name: 'Dynamic Application Sizing' });
|
|
server.createList('agent', 3, 'withConsulLink', 'withVaultLink');
|
|
server.createList('node', 5);
|
|
server.createList('job', 1, { createRecommendations: true });
|
|
server.createList('allocFile', 5);
|
|
server.create('allocFile', 'dir', { depth: 2 });
|
|
server.createList('csi-plugin', 2);
|
|
server.createList('variable', 3);
|
|
|
|
// #region evaluations
|
|
|
|
// Branching: a single eval that relates to N-1 mutually-unrelated evals
|
|
const NUM_BRANCHING_EVALUATIONS = 3;
|
|
Array(NUM_BRANCHING_EVALUATIONS)
|
|
.fill()
|
|
.map((_, i) => {
|
|
return {
|
|
evaluation: server.create('evaluation', {
|
|
id: `branching_${i}`,
|
|
previousEval: i > 0 ? `branching_0` : '',
|
|
jobID: pickOne(server.db.jobs).id,
|
|
}),
|
|
|
|
evaluationStub: server.create('evaluation-stub', {
|
|
id: `branching_${i}`,
|
|
previousEval: i > 0 ? `branching_0` : '',
|
|
status: 'failed',
|
|
}),
|
|
};
|
|
})
|
|
.map((x, i, all) => {
|
|
x.evaluation.update({
|
|
relatedEvals:
|
|
i === 0
|
|
? all.filter((_, j) => j !== 0).map((e) => e.evaluation)
|
|
: all.filter((_, j) => j !== i).map((e) => e.evaluation),
|
|
});
|
|
return x;
|
|
});
|
|
|
|
// Linear: a long line of N related evaluations
|
|
const NUM_LINEAR_EVALUATIONS = 20;
|
|
Array(NUM_LINEAR_EVALUATIONS)
|
|
.fill()
|
|
.map((_, i) => {
|
|
return {
|
|
evaluation: server.create('evaluation', {
|
|
id: `linear_${i}`,
|
|
previousEval: i > 0 ? `linear_${i - 1}` : '',
|
|
jobID: pickOne(server.db.jobs).id,
|
|
}),
|
|
|
|
evaluationStub: server.create('evaluation-stub', {
|
|
id: `linear_${i}`,
|
|
previousEval: i > 0 ? `linear_${i - 1}` : '',
|
|
nextEval: `linear_${i + 1}`,
|
|
status: 'failed',
|
|
}),
|
|
};
|
|
})
|
|
.map((x, i, all) => {
|
|
x.evaluation.update({
|
|
relatedEvals: all.filter((_, j) => i !== j).map((e) => e.evaluation),
|
|
});
|
|
return x;
|
|
});
|
|
|
|
// #endregion evaluations
|
|
|
|
const csiAllocations = server.createList('allocation', 5);
|
|
const volumes = server.schema.csiVolumes.all().models;
|
|
csiAllocations.forEach((alloc) => {
|
|
const volume = pickOne(volumes);
|
|
volume.writeAllocs.add(alloc);
|
|
volume.readAllocs.add(alloc);
|
|
volume.save();
|
|
});
|
|
}
|
|
|
|
function mediumCluster(server) {
|
|
server.createList('agent', 3, 'withConsulLink', 'withVaultLink');
|
|
server.createList('node', 50);
|
|
server.createList('job', 25);
|
|
}
|
|
|
|
// Due to Mirage performance, large cluster scenarios will be slow
|
|
function largeCluster(server) {
|
|
server.createList('agent', 5);
|
|
server.createList('node', 1000);
|
|
server.createList('job', 100);
|
|
}
|
|
|
|
function massiveCluster(server) {
|
|
server.createList('agent', 7);
|
|
server.createList('node', 5000);
|
|
server.createList('job', 2000);
|
|
}
|
|
|
|
function allJobTypes(server) {
|
|
server.createList('agent', 3, 'withConsulLink', 'withVaultLink');
|
|
server.createList('node', 5);
|
|
|
|
server.create('job', { type: 'service' });
|
|
server.create('job', { type: 'batch' });
|
|
server.create('job', { type: 'system' });
|
|
server.create('job', 'periodic');
|
|
server.create('job', 'parameterized');
|
|
server.create('job', 'periodicSysbatch');
|
|
server.create('job', 'parameterizedSysbatch');
|
|
server.create('job', { failedPlacements: true });
|
|
}
|
|
|
|
function allNodeTypes(server) {
|
|
server.createList('agent', 3, 'withConsulLink', 'withVaultLink');
|
|
|
|
server.create('node');
|
|
server.create('node', 'forceIPv4');
|
|
server.create('node', 'draining');
|
|
server.create('node', 'forcedDraining');
|
|
server.create('node', 'noDeadlineDraining');
|
|
server.create('node', 'withMeta');
|
|
|
|
server.createList('job', 3);
|
|
}
|
|
|
|
function everyFeature(server) {
|
|
server.createList('agent', 3, 'withConsulLink', 'withVaultLink');
|
|
|
|
server.create('node', 'forceIPv4');
|
|
server.create('node', 'draining');
|
|
server.create('node', 'forcedDraining');
|
|
server.create('node', 'noDeadlineDraining');
|
|
server.create('node', 'withMeta');
|
|
|
|
const job1 = server.create('job', {
|
|
type: 'service',
|
|
activeDeployment: true,
|
|
namespaceId: 'default',
|
|
createAllocations: false,
|
|
});
|
|
server.create('job', {
|
|
type: 'batch',
|
|
failedPlacements: true,
|
|
namespaceId: 'default',
|
|
});
|
|
server.create('job', { type: 'system', namespaceId: 'default' });
|
|
server.create('job', 'periodic', { namespaceId: 'default' });
|
|
server.create('job', 'parameterized', { namespaceId: 'default' });
|
|
|
|
server.create('allocation', 'rescheduled', { jobId: job1.id });
|
|
server.create('allocation', 'preempter', { jobId: job1.id });
|
|
server.create('allocation', 'preempted', { jobId: job1.id });
|
|
}
|
|
|
|
function emptyCluster(server) {
|
|
server.create('agent');
|
|
server.create('node');
|
|
}
|
|
|
|
// Behaviors
|
|
|
|
function createTokens(server) {
|
|
server.createList('token', 3);
|
|
server.create('token', {
|
|
name: 'Secure McVariables',
|
|
id: '53cur3-v4r14bl35',
|
|
});
|
|
logTokens(server);
|
|
}
|
|
|
|
function createNamespaces(server) {
|
|
server.createList('namespace', 3);
|
|
}
|
|
|
|
function createRegions(server) {
|
|
['americas', 'europe', 'asia', 'some-long-name-just-to-test'].forEach(
|
|
(id) => {
|
|
server.create('region', { id });
|
|
}
|
|
);
|
|
}
|
|
|
|
/* eslint-disable */
|
|
function logTokens(server) {
|
|
console.log('TOKENS:');
|
|
server.db.tokens.forEach((token) => {
|
|
console.log(`
|
|
Name: ${token.name}
|
|
Secret: ${token.secretId}
|
|
Accessor: ${token.accessorId}
|
|
|
|
`);
|
|
});
|
|
}
|
|
|
|
function getConfigValue(variableName, defaultValue) {
|
|
const value = config.APP[variableName];
|
|
if (value !== undefined) return value;
|
|
|
|
console.warn(
|
|
`No ENV.APP value set for "${variableName}". Defaulting to "${defaultValue}". To set a custom value, modify config/environment.js`
|
|
);
|
|
return defaultValue;
|
|
}
|
|
|
|
function getScenarioQueryParameter() {
|
|
const params = new URLSearchParams(window.location.search);
|
|
return params.get('mirage-scenario');
|
|
}
|
|
/* eslint-enable */
|