132 lines
2.9 KiB
JavaScript
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 '!=~';
|
|
}
|
|
};
|