@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.
- package/dist/package.json +24 -14
- package/dist/src/commands/deploy.js +2 -1
- package/dist/src/commands/destroy.js +10 -0
- package/dist/src/commands/index.js +28 -13
- package/dist/src/commands/template.js +26 -0
- package/dist/src/commands/validate.js +4 -5
- package/dist/src/common/actionContext.js +13 -7
- package/dist/src/common/base64.js +5 -0
- package/dist/src/common/constants.js +4 -0
- package/dist/src/common/iacHelper.js +48 -12
- package/dist/src/common/imsClient.js +52 -0
- package/dist/src/common/index.d.ts +4 -1
- package/dist/src/common/index.js +4 -1
- package/dist/src/common/providerEnum.js +11 -0
- package/dist/src/common/rosClient.js +92 -9
- package/dist/src/parser/databaseParser.js +33 -0
- package/dist/src/parser/eventParser.js +15 -0
- package/dist/src/parser/functionParser.js +20 -0
- package/dist/src/parser/index.d.ts +2 -0
- package/dist/src/parser/index.js +36 -0
- package/dist/src/parser/tagParser.js +10 -0
- package/dist/src/stack/deploy.js +57 -13
- package/dist/src/stack/index.d.ts +0 -2
- package/dist/src/stack/index.js +0 -16
- package/dist/src/stack/rfsStack/function.js +32 -0
- package/dist/src/stack/rfsStack/index.d.ts +9 -0
- package/dist/src/stack/rfsStack/index.js +39 -0
- package/dist/src/stack/rosStack/bootstrap.js +40 -0
- package/dist/src/stack/rosStack/database.js +314 -0
- package/dist/src/stack/rosStack/event.js +136 -0
- package/dist/src/stack/rosStack/function.js +108 -0
- package/dist/src/stack/rosStack/index.d.ts +7 -0
- package/dist/src/stack/rosStack/index.js +69 -0
- package/dist/src/stack/rosStack/stage.js +46 -0
- package/dist/src/stack/rosStack/tag.js +11 -0
- package/dist/src/stack/rosStack/vars.js +49 -0
- package/dist/src/types/assets.js +2 -0
- package/dist/src/types/domains/context.js +8 -0
- package/dist/src/types/domains/database.js +2 -0
- package/dist/src/types/domains/function.js +2 -0
- package/dist/src/types/domains/provider.js +2 -0
- package/dist/src/types/domains/tag.js +2 -0
- package/dist/src/types/domains/vars.js +2 -0
- package/dist/src/types/index.d.ts +44 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/validator/databaseSchema.js +83 -0
- package/dist/src/validator/eventSchema.js +41 -0
- package/dist/src/validator/functionSchema.js +45 -0
- package/dist/src/validator/iacSchema.js +42 -0
- package/dist/src/validator/index.d.ts +1 -0
- package/dist/src/validator/index.js +5 -0
- package/dist/src/validator/rootSchema.js +52 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -14
- package/samples/aliyun-poc-es.yml +30 -0
- package/samples/aliyun-poc-fc.yml +60 -0
- package/samples/aliyun-poc-rds.yml +24 -0
- package/samples/huawei-poc-fc.yml +60 -0
- package/dist/src/common/provider.js +0 -11
- package/dist/src/stack/iacSchema.js +0 -145
- package/dist/src/stack/iacStack.js +0 -146
- package/dist/src/stack/parse.js +0 -46
- /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;
|
package/dist/src/stack/deploy.js
CHANGED
|
@@ -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 (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
30
|
-
const
|
|
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
|
|
48
|
+
new rosStack_1.RosStack(app, iac, context);
|
|
33
49
|
const assembly = app.synth();
|
|
34
|
-
const
|
|
35
|
-
|
|
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 } =
|
|
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;
|
package/dist/src/stack/index.js
CHANGED
|
@@ -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;
|