Skip to content

Commit 260e0d9

Browse files
committed
fixup! feat(generate): generate terraform imports
1 parent b023176 commit 260e0d9

File tree

2 files changed

+77
-54
lines changed

2 files changed

+77
-54
lines changed

bin/clever.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ import * as version from '../src/commands/version.js';
6565
import * as webhooks from '../src/commands/webhooks.js';
6666
import * as database from '../src/commands/database.js';
6767
import { curl } from '../src/commands/curl.js';
68-
import { generateTerraform } from '../src/commands/generate-terraform.js';
68+
import { terraformGenerate } from '../src/commands/generate-terraform.js';
6969

7070
// Exit cleanly if the program we pipe to exits abruptly
7171
process.stdout.on('error', (error) => {
@@ -543,6 +543,12 @@ async function run () {
543543
description: 'List of tags, separated by a comma',
544544
parser: Parsers.tags,
545545
}),
546+
optTag: cliparse.option('tag', {
547+
aliases: ['t'],
548+
metavar: 'tags',
549+
description: 'List of tags, separated by a comma',
550+
parser: Parsers.tag,
551+
}),
546552
optTags: cliparse.option('tags', {
547553
metavar: 'tags',
548554
description: 'List of tags, separated by a comma',
@@ -1126,13 +1132,13 @@ async function run () {
11261132
console.info('clever database backups download');
11271133
});
11281134

1129-
const generateCommand = cliparse.command('generate', {
1130-
description: 'Generate things',
1135+
const terraformCommand = cliparse.command('terraform', {
1136+
description: 'Terraform commands',
11311137
commands: [
1132-
cliparse.command('terraform', {
1133-
description: 'Generate terraform ',
1134-
options: [opts.orgaIdOrName, opts.appIdOrName],
1135-
}, generateTerraform),
1138+
cliparse.command('generate', {
1139+
description: 'Generate terraform import file',
1140+
options: [opts.orgaIdOrName, opts.appIdOrName, opts.optTag],
1141+
}, terraformGenerate),
11361142
],
11371143
}, () => Promise.resolve());
11381144

@@ -1179,7 +1185,7 @@ async function run () {
11791185
tcpRedirsCommands,
11801186
versionCommand,
11811187
webhooksCommand,
1182-
generateCommand,
1188+
terraformCommand,
11831189
];
11841190

11851191
// Add experimental features only if they are enabled through the configuration file

src/commands/generate-terraform.js

Lines changed: 63 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
import { getOrgaIdOrUserId } from '../models/notification.js';
22
import { getSummary } from '@clevercloud/client/esm/api/v2/user.js';
3-
import * as Application from '../models/application.js';
43
import { sendToApi } from '../models/send-to-api.js';
5-
import dedent from 'dedent';
64
import { Logger } from '../logger.js';
5+
import * as Application from '../models/application.js';
6+
import dedent from 'dedent';
77
import slugify from 'slugify';
88

99
// TODO: get supported addons/app from some Hashicorp registry api
1010
const SUPPORTED_ADDONS = ['addon', 'cellar', 'keycloak', 'materia_kv', 'metabase', 'mongodb', 'postgresql', 'redis'];
1111
const SUPPORTED_APPS = ['docker', 'go', 'java_war', 'nodejs', 'php', 'python', 'scala', 'static'];
1212

13-
export async function generateTerraform (params) {
14-
const { org, app } = params.options;
13+
export async function terraformGenerate (params) {
14+
const { org, app, tag } = params.options;
1515
const ownerId = await getOrgaIdOrUserId(org);
1616
const summary = await getSummary({ id: ownerId }).then(sendToApi);
1717
const orga = summary.organisations.find((orga) => orga.id === ownerId);
1818
if (!orga) {
1919
throw new Error(`Could not find organisation with ID: ${ownerId}`);
2020
}
21-
//console.log(JSON.stringify(orga.applications, null, 2)); process.exit(0);
2221

2322
let applications = orga.applications;
2423
let addons = orga.addons;
@@ -29,7 +28,37 @@ export async function generateTerraform (params) {
2928
addons = [];
3029
}
3130

32-
const appToImport = applications
31+
const appToImport = prepareApps(applications, tag);
32+
const addonToImport = prepareAddons(addons, tag);
33+
const out = appToImport
34+
.concat(addonToImport)
35+
.map((app) => {
36+
return {
37+
...app,
38+
name: slugify(app.name, { lower: true, strict: true, trim: true }),
39+
};
40+
})
41+
.filter(({ name }) => {
42+
if (name.match(/^\d.*/)) {
43+
Logger.printErrorLine(`Skipping ${name}: name cannot starts with number`);
44+
return false;
45+
}
46+
return true;
47+
})
48+
.map(({ name, resourceKind, id }) => {
49+
return dedent`# ${name}
50+
import {
51+
to = clevercloud_${resourceKind}.${name}
52+
id = "${id}"
53+
}`;
54+
})
55+
.join('\n\n');
56+
57+
console.log(out);
58+
}
59+
60+
function prepareApps(applications, tag = null) {
61+
return applications
3362
.map((app) => {
3463
let instanceType = app.instanceType;
3564
if (instanceType === 'node') {
@@ -39,28 +68,47 @@ export async function generateTerraform (params) {
3968
instanceType = 'scala';
4069
}
4170

42-
return { resourceKind: instanceType, id: app.id, name: app.name || app.id };
71+
return {
72+
resourceKind: instanceType,
73+
id: app.id,
74+
name: app.name || app.id,
75+
tags: app.systemTags.concat(app.customerTags)
76+
};
4377
})
4478
.filter((app) => {
4579
const supported = SUPPORTED_APPS.includes(app.resourceKind);
4680
if (!supported) {
4781
Logger.printErrorLine(`Skipping unsupported app: ${app.resourceKind}/${app.name}`);
82+
return false;
4883
}
49-
return supported;
84+
85+
if (tag && !app.tags.includes(tag)) {
86+
return false;
87+
}
88+
89+
return true;
5090
});
91+
}
5192

52-
const addonToImport = addons
93+
function prepareAddons(addons, tag = null) {
94+
return addons
5395
.map((addon) => {
5496

5597
let providerId = addon.providerId;
5698
if (providerId === 'kv') {
5799
providerId = 'materia_kv';
58100
}
59101

102+
let id = addon.realId;
103+
if (addon.resourceKind === 'mongodb') {
104+
id = addon.id;
105+
}
106+
60107
return {
61108
resourceKind: providerId.replaceAll('-addon', '').replaceAll('addon-', ''),
62-
id: addon.realId,
109+
id,
63110
name: addon.name || addon.realId,
111+
tags: addon.systemTags.concat(addon.customerTags)
64112
};
65113
})
66114
.filter((addon) => {
@@ -71,44 +119,13 @@ export async function generateTerraform (params) {
71119
const supported = SUPPORTED_ADDONS.includes(addon.resourceKind);
72120
if (!supported) {
73121
Logger.printErrorLine(`Skipping unsupported addon: ${addon.resourceKind}/${addon.name}`);
122+
return false;
74123
}
75-
return supported;
76-
});
77124

78-
// console.log(appToImport);
79-
// console.log(addonToImport);
80-
81-
const out = appToImport
82-
.concat(addonToImport).map((app) => {
83-
return {
84-
...app,
85-
name : slugify(app.name, { lower: true, strict: true, trim: true }),
86-
/*name: app.name
87-
.replaceAll('.', '_')
88-
.replaceAll(' ', '_')
89-
.replaceAll('(', '')
90-
.replaceAll(')', '')
91-
.replaceAll('[', '')
92-
.replaceAll(']', '')
93-
.replaceAll('/', '_')
94-
.replaceAll(';', ''),
95-
};
96-
})
97-
.filter(({ name }) => {
98-
if (name.match(/^\d.*/)) {
99-
Logger.printErrorLine(`Skipping ${name}: name cannot starts with number`);
125+
if (tag && !addon.tags.includes(tag)) {
100126
return false;
101127
}
102-
return true;
103-
})
104-
.map(({ name, resourceKind, id }) => {
105-
return dedent`# ${name}
106-
import {
107-
to = clevercloud_${resourceKind}.${name}
108-
id = "${id}"
109-
}`;
110-
})
111-
.join('\n\n');
112128

113-
console.log(out);
114-
}
129+
return true;
130+
});
131+
}

0 commit comments

Comments
 (0)