@geek-fun/serverlessinsight 0.0.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/package.json +24 -14
  2. package/dist/src/commands/deploy.js +2 -1
  3. package/dist/src/commands/destroy.js +10 -0
  4. package/dist/src/commands/index.js +28 -13
  5. package/dist/src/commands/template.js +26 -0
  6. package/dist/src/commands/validate.js +4 -5
  7. package/dist/src/common/actionContext.js +13 -7
  8. package/dist/src/common/base64.js +5 -0
  9. package/dist/src/common/constants.js +4 -0
  10. package/dist/src/common/iacHelper.js +48 -12
  11. package/dist/src/common/imsClient.js +52 -0
  12. package/dist/src/common/index.d.ts +4 -1
  13. package/dist/src/common/index.js +4 -1
  14. package/dist/src/common/providerEnum.js +11 -0
  15. package/dist/src/common/rosClient.js +92 -9
  16. package/dist/src/parser/databaseParser.js +33 -0
  17. package/dist/src/parser/eventParser.js +15 -0
  18. package/dist/src/parser/functionParser.js +20 -0
  19. package/dist/src/parser/index.d.ts +2 -0
  20. package/dist/src/parser/index.js +36 -0
  21. package/dist/src/parser/tagParser.js +10 -0
  22. package/dist/src/stack/deploy.js +57 -13
  23. package/dist/src/stack/index.d.ts +0 -2
  24. package/dist/src/stack/index.js +0 -16
  25. package/dist/src/stack/rfsStack/function.js +32 -0
  26. package/dist/src/stack/rfsStack/index.d.ts +9 -0
  27. package/dist/src/stack/rfsStack/index.js +39 -0
  28. package/dist/src/stack/rosStack/bootstrap.js +40 -0
  29. package/dist/src/stack/rosStack/database.js +314 -0
  30. package/dist/src/stack/rosStack/event.js +136 -0
  31. package/dist/src/stack/rosStack/function.js +108 -0
  32. package/dist/src/stack/rosStack/index.d.ts +7 -0
  33. package/dist/src/stack/rosStack/index.js +69 -0
  34. package/dist/src/stack/rosStack/stage.js +46 -0
  35. package/dist/src/stack/rosStack/tag.js +11 -0
  36. package/dist/src/stack/rosStack/vars.js +49 -0
  37. package/dist/src/types/assets.js +2 -0
  38. package/dist/src/types/domains/context.js +8 -0
  39. package/dist/src/types/domains/database.js +2 -0
  40. package/dist/src/types/domains/function.js +2 -0
  41. package/dist/src/types/domains/provider.js +2 -0
  42. package/dist/src/types/domains/tag.js +2 -0
  43. package/dist/src/types/domains/vars.js +2 -0
  44. package/dist/src/types/index.d.ts +44 -0
  45. package/dist/src/types/index.js +23 -0
  46. package/dist/src/validator/databaseSchema.js +83 -0
  47. package/dist/src/validator/eventSchema.js +41 -0
  48. package/dist/src/validator/functionSchema.js +45 -0
  49. package/dist/src/validator/iacSchema.js +42 -0
  50. package/dist/src/validator/index.d.ts +1 -0
  51. package/dist/src/validator/index.js +5 -0
  52. package/dist/src/validator/rootSchema.js +52 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +24 -14
  55. package/samples/aliyun-poc-es.yml +30 -0
  56. package/samples/aliyun-poc-fc.yml +60 -0
  57. package/samples/aliyun-poc-rds.yml +24 -0
  58. package/samples/huawei-poc-fc.yml +60 -0
  59. package/dist/src/common/provider.js +0 -11
  60. package/dist/src/stack/iacSchema.js +0 -145
  61. package/dist/src/stack/iacStack.js +0 -146
  62. package/dist/src/stack/parse.js +0 -46
  63. /package/dist/src/{types.js → types/domains/event.js} +0 -0
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseYaml = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const functionParser_1 = require("./functionParser");
6
+ const eventParser_1 = require("./eventParser");
7
+ const databaseParser_1 = require("./databaseParser");
8
+ const tagParser_1 = require("./tagParser");
9
+ const yaml_1 = require("yaml");
10
+ const validator_1 = require("../validator");
11
+ const validateExistence = (path) => {
12
+ if (!(0, node_fs_1.existsSync)(path)) {
13
+ throw new Error(`File does not exist at path: ${path}`);
14
+ }
15
+ };
16
+ const transformYaml = (iacJson) => {
17
+ return {
18
+ service: iacJson.service,
19
+ version: iacJson.version,
20
+ provider: iacJson.provider,
21
+ vars: iacJson.vars,
22
+ stages: iacJson.stages,
23
+ functions: (0, functionParser_1.parseFunction)(iacJson.functions),
24
+ events: (0, eventParser_1.parseEvent)(iacJson.events),
25
+ databases: (0, databaseParser_1.parseDatabase)(iacJson.databases),
26
+ tags: (0, tagParser_1.parseTag)(iacJson.tags),
27
+ };
28
+ };
29
+ const parseYaml = (iacLocation) => {
30
+ validateExistence(iacLocation);
31
+ const yamlContent = (0, node_fs_1.readFileSync)(iacLocation, 'utf8');
32
+ const iacJson = (0, yaml_1.parse)(yamlContent);
33
+ (0, validator_1.validateYaml)(iacJson);
34
+ return transformYaml(iacJson);
35
+ };
36
+ exports.parseYaml = parseYaml;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTag = void 0;
4
+ const parseTag = (tags) => {
5
+ return [
6
+ { key: 'iac-provider', value: 'ServerlessInsight' },
7
+ ...Object.entries(tags ?? {}).map(([key, value]) => ({ key, value })),
8
+ ];
9
+ };
10
+ exports.parseTag = parseTag;
@@ -15,28 +15,72 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
37
  };
25
38
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.deployStack = void 0;
39
+ exports.generateStackTemplate = exports.deployStack = exports.generateRfsStackTemplate = exports.generateRosStackTemplate = void 0;
27
40
  const ros = __importStar(require("@alicloud/ros-cdk-core"));
41
+ const node_fs_1 = __importDefault(require("node:fs"));
28
42
  const common_1 = require("../common");
29
- const iacStack_1 = require("./iacStack");
30
- const generateStackTemplate = (stackName, iac, context) => {
43
+ const rosStack_1 = require("./rosStack");
44
+ const rfsStack_1 = require("./rfsStack");
45
+ const lodash_1 = require("lodash");
46
+ const generateRosStackTemplate = (stackName, iac, context) => {
31
47
  const app = new ros.App();
32
- new iacStack_1.IacStack(app, iac, context);
48
+ new rosStack_1.RosStack(app, iac, context);
33
49
  const assembly = app.synth();
34
- const stackArtifact = assembly.getStackByName(stackName);
35
- return { template: stackArtifact.template };
50
+ const { template } = assembly.getStackByName(stackName);
51
+ const assetFolderPath = (0, lodash_1.get)(assembly.tryGetArtifact(`${stackName}.assets`), 'file', '');
52
+ const assetsFileBody = node_fs_1.default.readFileSync(assetFolderPath);
53
+ const assets = {
54
+ rootPath: assembly.directory,
55
+ ...JSON.parse(assetsFileBody.toString('utf-8').trim()),
56
+ };
57
+ return { template, assets };
58
+ };
59
+ exports.generateRosStackTemplate = generateRosStackTemplate;
60
+ const generateRfsStackTemplate = (stackName, iac, context) => {
61
+ const stack = new rfsStack_1.RfsStack(iac, context);
62
+ const hcl = stack.toHclTerraform();
63
+ console.log('HCL:', hcl);
64
+ return { template: hcl };
36
65
  };
66
+ exports.generateRfsStackTemplate = generateRfsStackTemplate;
37
67
  const deployStack = async (stackName, iac, context) => {
38
- const { template } = generateStackTemplate(stackName, iac, context);
68
+ const { template, assets } = (0, exports.generateRosStackTemplate)(stackName, iac, context);
69
+ await (0, rosStack_1.prepareBootstrapStack)(context);
70
+ common_1.logger.info(`Deploying stack, publishing assets...`);
71
+ await (0, common_1.publishAssets)(assets, context);
72
+ common_1.logger.info(`Assets published! 🎉`);
39
73
  await (0, common_1.rosStackDeploy)(stackName, template, context);
40
74
  common_1.logger.info(`Stack deployed! 🎉`);
41
75
  };
42
76
  exports.deployStack = deployStack;
77
+ const generateStackTemplate = (stackName, iac, context) => {
78
+ if (iac.provider.name === common_1.ProviderEnum.ALIYUN) {
79
+ return (0, exports.generateRosStackTemplate)(stackName, iac, context);
80
+ }
81
+ else if (iac.provider.name === common_1.ProviderEnum.HUAWEI) {
82
+ return (0, exports.generateRfsStackTemplate)(stackName, iac, context);
83
+ }
84
+ return { template: '' };
85
+ };
86
+ exports.generateStackTemplate = generateStackTemplate;
@@ -1,3 +1 @@
1
1
  export { deployStack } from './deploy';
2
- export * from './parse';
3
- export * from './iacSchema';
@@ -1,21 +1,5 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
3
  exports.deployStack = void 0;
18
4
  var deploy_1 = require("./deploy");
19
5
  Object.defineProperty(exports, "deployStack", { enumerable: true, get: function () { return deploy_1.deployStack; } });
20
- __exportStar(require("./parse"), exports);
21
- __exportStar(require("./iacSchema"), exports);
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveFunction = void 0;
4
+ const common_1 = require("../../common");
5
+ const fgsApplication = (context, service) => `
6
+ resource "huaweicloud_fgs_application" "${service}_app" {
7
+ name = "${service}-app"
8
+ description = "${service} application"
9
+ package_type = "event"
10
+ }
11
+ `;
12
+ const fgsFunction = (fn, context, service) => `
13
+ resource "huaweicloud_fgs_function" "${fn.key}" {
14
+ name = "${fn.name}"
15
+ handler = "${fn.handler}"
16
+ runtime = "${fn.runtime}"
17
+ memory_size = ${fn.memory}
18
+ timeout = ${fn.timeout}
19
+ environment = ${JSON.stringify(fn.environment)}
20
+ code_type = "inline"
21
+ func_code = "${(0, common_1.resolveCode)(fn.code)}"
22
+ app = "huaweicloud_fgs_application.${service}_app.id"
23
+ }
24
+ `;
25
+ const resolveFunction = (stack, functions, context, service) => {
26
+ if (!functions) {
27
+ return undefined;
28
+ }
29
+ const app = fgsApplication(context, service);
30
+ stack.appendHcl(app + '\n' + functions.map((fn) => fgsFunction(fn, context, service)).join('\n'));
31
+ };
32
+ exports.resolveFunction = resolveFunction;
@@ -0,0 +1,9 @@
1
+ import { ActionContext, ServerlessIac } from '../../types';
2
+ export declare class RfsStack {
3
+ private readonly iac;
4
+ private readonly context;
5
+ private hcl;
6
+ constructor(iac: ServerlessIac, context: ActionContext);
7
+ toHclTerraform(): string;
8
+ appendHcl(hcl: string): void;
9
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RfsStack = void 0;
4
+ const function_1 = require("./function");
5
+ const provider = (stack, context) => {
6
+ const hcl = `
7
+ terraform {
8
+ required_providers {
9
+ huaweicloud = {
10
+ source = "huaweicloud/huaweicloud"
11
+ version = ">= 1.67.1"
12
+ }
13
+ }
14
+ }
15
+
16
+ provider "huaweicloud" {
17
+ region = "${context.region}"
18
+ access_key = "${context.accessKeyId}"
19
+ secret_key = "${context.accessKeySecret}"
20
+ }
21
+ `;
22
+ stack.appendHcl(hcl);
23
+ };
24
+ class RfsStack {
25
+ constructor(iac, context) {
26
+ this.iac = iac;
27
+ this.context = context;
28
+ this.hcl = '';
29
+ provider(this, context);
30
+ (0, function_1.resolveFunction)(this, iac.functions, context, iac.service);
31
+ }
32
+ toHclTerraform() {
33
+ return this.hcl;
34
+ }
35
+ appendHcl(hcl) {
36
+ this.hcl += hcl;
37
+ }
38
+ }
39
+ exports.RfsStack = RfsStack;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareBootstrapStack = void 0;
4
+ const common_1 = require("../../common");
5
+ const getBootstrapTemplate = async (context) => {
6
+ const iamInfo = await (0, common_1.getIamInfo)(context);
7
+ const stackName = `serverlessInsight-bootstrap-${iamInfo?.accountId}-${context.region}`;
8
+ const template = {
9
+ Description: 'ServerlessInsight Bootstrap Stack',
10
+ Metadata: {
11
+ 'ALIYUN::ROS::Interface': {
12
+ TemplateTags: ['Bootstrap stack created by ServerlessInsight'],
13
+ },
14
+ },
15
+ ROSTemplateFormatVersion: '2015-09-01',
16
+ Resources: {
17
+ ServerlessInsight_artifacts_bucket: {
18
+ Type: 'ALIYUN::OSS::Bucket',
19
+ Properties: {
20
+ BucketName: {
21
+ 'Fn::Sub': 'si-bootstrap-artifacts-${ALIYUN::AccountId}-${ALIYUN::Region}',
22
+ },
23
+ AccessControl: 'private',
24
+ DeletionForce: false,
25
+ EnableOssHdfsService: false,
26
+ RedundancyType: 'LRS',
27
+ ServerSideEncryptionConfiguration: {
28
+ SSEAlgorithm: 'KMS',
29
+ },
30
+ },
31
+ },
32
+ },
33
+ };
34
+ return { stackName, template };
35
+ };
36
+ const prepareBootstrapStack = async (context) => {
37
+ const { stackName, template } = await getBootstrapTemplate(context);
38
+ await (0, common_1.rosStackDeploy)(stackName, template, context);
39
+ };
40
+ exports.prepareBootstrapStack = prepareBootstrapStack;
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolveDatabases = void 0;
37
+ const rds = __importStar(require("@alicloud/ros-cdk-rds"));
38
+ const common_1 = require("../../common");
39
+ const lodash_1 = require("lodash");
40
+ const esServerless = __importStar(require("@alicloud/ros-cdk-elasticsearchserverless"));
41
+ const rdsEngineMap = new Map([
42
+ [
43
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_5.7" /* DatabaseVersionEnum['MYSQL_5.7'] */}`,
44
+ {
45
+ engine: 'MySQL',
46
+ version: '5.7',
47
+ category: 'serverless_basic',
48
+ dbInstanceClass: 'mysql.n2.serverless.1c',
49
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
50
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: false },
51
+ },
52
+ ],
53
+ [
54
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_8.0" /* DatabaseVersionEnum['MYSQL_8.0'] */}`,
55
+ {
56
+ engine: 'MySQL',
57
+ version: '8.0',
58
+ category: 'serverless_basic',
59
+ dbInstanceClass: 'mysql.n2.serverless.1c',
60
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
61
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: false },
62
+ },
63
+ ],
64
+ [
65
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_5.7" /* DatabaseVersionEnum['MYSQL_HA_5.7'] */}`,
66
+ {
67
+ engine: 'MySQL',
68
+ version: '5.7',
69
+ category: 'serverless_standard',
70
+ dbInstanceClass: 'mysql.n2.serverless.2c',
71
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
72
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: true },
73
+ },
74
+ ],
75
+ [
76
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_8.0" /* DatabaseVersionEnum['MYSQL_HA_8.0'] */}`,
77
+ {
78
+ engine: 'MySQL',
79
+ version: '8.0',
80
+ category: 'serverless_standard',
81
+ dbInstanceClass: 'mysql.n2.serverless.2c',
82
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
83
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: true },
84
+ },
85
+ ],
86
+ [
87
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_14" /* DatabaseVersionEnum['PGSQL_14'] */}`,
88
+ {
89
+ engine: 'PostgreSQL',
90
+ version: '14.0',
91
+ category: 'serverless_basic',
92
+ dbInstanceClass: 'pg.n2.serverless.1c',
93
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
94
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
95
+ },
96
+ ],
97
+ [
98
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_15" /* DatabaseVersionEnum['PGSQL_15'] */}`,
99
+ {
100
+ engine: 'PostgreSQL',
101
+ version: '15.0',
102
+ category: 'serverless_basic',
103
+ dbInstanceClass: 'pg.n2.serverless.1c',
104
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
105
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
106
+ },
107
+ ],
108
+ [
109
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_16" /* DatabaseVersionEnum['PGSQL_16'] */}`,
110
+ {
111
+ engine: 'PostgreSQL',
112
+ version: '16.0',
113
+ category: 'serverless_basic',
114
+ dbInstanceClass: 'pg.n2.serverless.1c',
115
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
116
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
117
+ },
118
+ ],
119
+ [
120
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_14" /* DatabaseVersionEnum['PGSQL_HA_14'] */}`,
121
+ {
122
+ engine: 'PostgreSQL',
123
+ version: '14.0',
124
+ category: 'serverless_standard',
125
+ dbInstanceClass: 'pg.n2.serverless.2c',
126
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
127
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
128
+ },
129
+ ],
130
+ [
131
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_15" /* DatabaseVersionEnum['PGSQL_HA_15'] */}`,
132
+ {
133
+ engine: 'PostgreSQL',
134
+ version: '15.0',
135
+ category: 'serverless_standard',
136
+ dbInstanceClass: 'pg.n2.serverless.2c',
137
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
138
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
139
+ },
140
+ ],
141
+ [
142
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_16" /* DatabaseVersionEnum['PGSQL_HA_16'] */}`,
143
+ {
144
+ engine: 'PostgreSQL',
145
+ version: '16.0',
146
+ category: 'serverless_standard',
147
+ dbInstanceClass: 'pg.n2.serverless.2c',
148
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
149
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
150
+ },
151
+ ],
152
+ [
153
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2016" /* DatabaseVersionEnum['MSSQL_HA_2016'] */}`,
154
+ {
155
+ engine: 'SQLServer',
156
+ version: '2016_std_sl',
157
+ category: 'serverless_ha',
158
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
159
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
160
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
161
+ },
162
+ ],
163
+ [
164
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2017" /* DatabaseVersionEnum['MSSQL_HA_2017'] */}`,
165
+ {
166
+ engine: 'SQLServer',
167
+ version: '2017_std_sl',
168
+ category: 'serverless_ha',
169
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
170
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
171
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
172
+ },
173
+ ],
174
+ [
175
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2019" /* DatabaseVersionEnum['MSSQL_HA_2019'] */}`,
176
+ {
177
+ engine: 'SQLServer',
178
+ version: '2019_std_sl',
179
+ category: 'serverless_ha',
180
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
181
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
182
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
183
+ },
184
+ ],
185
+ [
186
+ `${"ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */}-${"ES_SEARCH_7.10" /* DatabaseVersionEnum['ES_SEARCH_7.10'] */}`,
187
+ {
188
+ engine: 'Elasticsearch',
189
+ version: '7.10',
190
+ category: 'STANDARD',
191
+ dbInstanceClass: '',
192
+ quota: { minCapacity: 2, maxCapacity: 8, ha: false },
193
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
194
+ },
195
+ ],
196
+ [
197
+ `${"ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */}-${"ES_TIME_SERIES_7.10" /* DatabaseVersionEnum['ES_TIME_SERIES_7.10'] */}`,
198
+ {
199
+ engine: 'Elasticsearch',
200
+ version: '7.10',
201
+ category: 'TRIAL',
202
+ dbInstanceClass: '',
203
+ quota: { minCapacity: 2, maxCapacity: 8, ha: false },
204
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
205
+ },
206
+ ],
207
+ ]);
208
+ const resolveDatabases = (scope, databases, context) => {
209
+ if ((0, lodash_1.isEmpty)(databases)) {
210
+ return undefined;
211
+ }
212
+ databases.forEach((db) => {
213
+ const { engine, version, category, dbInstanceClass, quota, storage } = rdsEngineMap.get(`${db.type}-${db.version}`) ?? {};
214
+ if (["ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */].includes(db.type)) {
215
+ new esServerless.App(scope, (0, common_1.replaceReference)(db.key, context), {
216
+ appName: (0, common_1.replaceReference)(db.name, context),
217
+ appVersion: version,
218
+ authentication: {
219
+ basicAuth: [
220
+ {
221
+ password: (0, common_1.replaceReference)(db.security.basicAuth.password, context),
222
+ },
223
+ ],
224
+ },
225
+ quotaInfo: {
226
+ cu: db.cu.min,
227
+ storage: db.storage.min,
228
+ appType: category,
229
+ },
230
+ // network: [
231
+ // {
232
+ // type: 'PUBLIC_KIBANA',
233
+ // enabled: true,
234
+ // whiteIpGroup: [{ groupName: 'default', ips: ['0.0.0.0/24'] }],
235
+ // },
236
+ // {
237
+ // type: 'PUBLIC_ES',
238
+ // enabled: true,
239
+ // whiteIpGroup: [{ groupName: 'default', ips: ['0.0.0.0/24'] }],
240
+ // },
241
+ // ],
242
+ }, true);
243
+ }
244
+ if ([
245
+ "RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */,
246
+ "RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */,
247
+ "RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */,
248
+ ].includes(db.type)) {
249
+ new rds.DBInstance(scope, (0, common_1.replaceReference)(db.key, context), {
250
+ engine: engine,
251
+ /**
252
+ * Serverless 实例
253
+ * MySQL:5.7、8.0 - MYSQL_HA_5.7, MYSQL_5.7, MYSQL_HA_8.0, MYSQL_8.0
254
+ * SQL Server:2016_std_sl、2017_std_sl、2019_std_sl - MSSQL_HA_2016, MSSQL_HA_2017, MSSQL_HA_2019
255
+ * PostgreSQL:14.0、15.0、16.0 - PGSQL_HA_14, PGSQL_14 PGSQL_HA_15, PGSQL_15, PGSQL_HA_16,PGSQL_16
256
+ */
257
+ engineVersion: version,
258
+ dbInstanceStorage: (0, common_1.replaceReference)(db.storage.min, context),
259
+ /** Serverless 实例
260
+ * serverless_basic:Serverless 基础系列。(仅适用 MySQL 和 PostgreSQL)
261
+ * serverless_standard:Serverless 高可用系列。(仅适用 MySQL 和 PostgreSQL)
262
+ * serverless_ha:SQL Server Serverless 高可用系列。
263
+ */
264
+ category,
265
+ /**
266
+ * MySQL:
267
+ * MySQL 基础系列:mysql.n2.serverless.1c
268
+ * MySQL 高可用系列:mysql.n2.serverless.2c
269
+ * SQL Server:
270
+ * mssql.mem2.serverless.s2
271
+ * PostgreSQL
272
+ * 基础系列:pg.n2.serverless.1c
273
+ * 高可用系列:pg.n2.serverless.2c
274
+ */
275
+ dbInstanceClass: dbInstanceClass,
276
+ /**
277
+ * 实例存储类型,取值:
278
+ * cloud_essd:ESSD PL1 云盘。
279
+ * general_essd:通用云盘(推荐)。
280
+ */
281
+ dbInstanceStorageType: storage.type,
282
+ burstingEnabled: storage.bursting,
283
+ payType: 'Serverless',
284
+ /**
285
+ * MaxCapacity:
286
+ * MySQL:1~32
287
+ * SQL Server:2~8
288
+ * PostgreSQL:1~14
289
+ * MinCapacity:
290
+ * MySQL:0.5~32
291
+ * SQL Server:2~8(仅支持整数)
292
+ * PostgreSQL:0.5~14
293
+ */
294
+ serverlessConfig: {
295
+ // @TODO db.cu.min should get parameter value when it refer to a parameter
296
+ minCapacity: (0, common_1.replaceReference)(db.cu.min === 0 ? quota.minCapacity : db.cu.min + quota.minCapacity, context),
297
+ maxCapacity: (0, common_1.replaceReference)(db.cu.max + quota.minCapacity <= quota.maxCapacity
298
+ ? db.cu.max + quota.minCapacity
299
+ : quota.maxCapacity, context),
300
+ autoPause: db.cu.min === 0,
301
+ switchForce: false,
302
+ },
303
+ masterUsername: (0, common_1.replaceReference)(db.security.basicAuth.username, context),
304
+ masterUserPassword: (0, common_1.replaceReference)(db.security.basicAuth.password, context),
305
+ masterUserType: 'Super',
306
+ multiAz: quota.ha,
307
+ securityIpList: (0, common_1.replaceReference)(db.network.ingressRules.join(','), context),
308
+ connectionStringType: db.network.type === 'PRIVATE' ? 'Inner' : 'Public',
309
+ dbInstanceNetType: db.network.type === 'PRIVATE' ? 'Intranet' : 'Internet',
310
+ }, true);
311
+ }
312
+ });
313
+ };
314
+ exports.resolveDatabases = resolveDatabases;