11import { getOrgaIdOrUserId } from '../models/notification.js' ;
22import { getSummary } from '@clevercloud/client/esm/api/v2/user.js' ;
3- import * as Application from '../models/application.js' ;
43import { sendToApi } from '../models/send-to-api.js' ;
5- import dedent from 'dedent' ;
64import { Logger } from '../logger.js' ;
5+ import * as Application from '../models/application.js' ;
6+ import dedent from 'dedent' ;
77import slugify from 'slugify' ;
88
99// TODO: get supported addons/app from some Hashicorp registry api
1010const SUPPORTED_ADDONS = [ 'addon' , 'cellar' , 'keycloak' , 'materia_kv' , 'metabase' , 'mongodb' , 'postgresql' , 'redis' ] ;
1111const 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