joyent-portal/packages/instance-steps/src/footer/cli-details.js

132 lines
2.9 KiB
JavaScript

const ForceArray = require('force-array');
export const generateTerraform = data => {
const {
name,
package: pkg,
image,
affinity,
metadata: _metadata,
tags: _tags,
firewall_enabled,
networks
} = formatData(data);
const cns = ForceArray(
(_tags.filter(({ name }) => name === 'triton.cns.services').pop() || {})
.value
);
const userScript = (
_metadata.filter(({ name }) => name === 'user-script').pop() || {}
).value;
const tags = _tags.filter(({ name }) => !/^triton./.test(name));
const metadata = _metadata.filter(({ name }) => name !== 'user-script');
return (
`resource "triton_machine" ${name} {
name = "${name}"
package = "${pkg}"
image = "${image}"
networks = ["${networks.join('","')}"]
firewall_enabled = ${Boolean(firewall_enabled)}` +
`${
affinity
? `
affinity = ["${affinity}"]`
: ''
}` +
`${
userScript && userScript.length
? `\n
user_script = "${userScript}"`
: ''
}` +
`${
cns.length
? `\n
cns {
services = ["${cns.join('", "')}"]
}`
: ''
}` +
`${
tags.length
? `\n
tags {
${tags.map(e => `${e.name} = "${e.value}"`).join('\n ')}
}`
: ''
}` +
`${
metadata.length
? `\n
metadata {
${metadata.map(e => `${e.name} = "${e.value}"`).join('\n ')}
}`
: ''
}` +
`\n}`
);
};
export const generateCLI = data => {
const {
metadata,
tags,
firewall_enabled,
networks,
name,
package: pkg,
image
} = data;
const { affinity } = formatData(data);
const _networks = `--network="${networks.join('","')}"`;
const _affinity = affinity ? `--affinity="${affinity}"` : '';
const _tags = tags.length
? `--tag=${JSON.stringify(
tags.reduce((acc, t) => Object.assign(acc, { [t.name]: t.value }))
)}`
: '';
const _metadata = metadata.length
? `--metadata=${JSON.stringify(
metadata.reduce(
(acc, m) => Object.assign(acc, { [m.name]: m.value }),
{}
)
)}`
: '';
const _firewall = firewall_enabled ? `--firewall` : '';
return `triton instance create -w --name=${name} ${_networks} ${_affinity} ${_tags} ${_metadata} ${_firewall} ${image} ${pkg}`;
};
const formatData = ({ affinity, metadata = [], tags = [], ...rest }) => ({
affinity:
affinity &&
affinity.length &&
`${affinity[0].key}${getAffinityOp(affinity[0].type)}${affinity[0].value}`,
tags: tags.filter(
e => e.name !== 'triton.cns.services' || e.name !== 'triton.cns.disable'
),
metadata: metadata.filter(e => e.name !== 'user-script'),
...rest
});
const getAffinityOp = type => {
switch (type.toUpperCase()) {
case 'MUST_EQUAL':
return '==';
case 'MUST_NOT_EQUAL':
return '!=';
case 'SHOULD_EQUAL':
return '==~';
case 'SHOULD_NOT_EQUAL':
return '!=~';
}
};