@uofx/cli 1.0.2 → 1.1.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/README.md +159 -3
- package/THIRD-PARTY-NOTICES.txt +84 -2
- package/dist/application/dtos/config/index.js +22 -0
- package/dist/application/dtos/config/request/index.js +19 -0
- package/dist/application/dtos/config/request/set-config.request.dto.js +3 -0
- package/dist/application/dtos/config/response/get-config.response.dto.js +8 -0
- package/dist/application/dtos/config/response/index.js +21 -0
- package/dist/application/dtos/dev/index.js +24 -0
- package/dist/application/dtos/dev/request/generate-component.request.dto.js +3 -0
- package/dist/application/dtos/dev/request/index.js +25 -0
- package/dist/application/dtos/dev/request/install-template.request.dto.js +3 -0
- package/dist/application/dtos/dev/request/new-project.request.dto.js +3 -0
- package/dist/application/dtos/dev/request/publish-plugin.request.dto.js +3 -0
- package/dist/application/dtos/dev/request/uninstall-template.request.dto.js +3 -0
- package/dist/application/dtos/dev/response/generate-component.response.dto.js +3 -0
- package/dist/application/dtos/dev/response/index.js +24 -0
- package/dist/application/dtos/dev/response/new-project.response.dto.js +3 -0
- package/dist/application/dtos/dev/response/publish-plugin.response.dto.js +3 -0
- package/dist/application/dtos/dev/response/template-info.response.dto.js +3 -0
- package/dist/application/dtos/env/index.js +24 -0
- package/dist/application/dtos/{request → env/request}/index.js +1 -3
- package/dist/application/dtos/env/request/list-running-instances.request.dto.js +3 -0
- package/dist/application/dtos/{response → env/response}/index.js +1 -1
- package/dist/application/dtos/env/response/list-running-instances.response.dto.js +3 -0
- package/dist/application/dtos/index.js +9 -2
- package/dist/application/dtos/logs/index.js +22 -0
- package/dist/application/dtos/logs/request/index.js +18 -0
- package/dist/application/dtos/logs/response/index.js +18 -0
- package/dist/application/index.js +1 -0
- package/dist/application/services/env/environment-validator.service.js +120 -0
- package/dist/application/services/env/index.js +11 -0
- package/dist/application/services/env/instance-cleanup.service.js +79 -0
- package/dist/application/services/index.js +21 -0
- package/dist/application/use-cases/config/get-all-config.use-case.js +54 -0
- package/dist/application/use-cases/config/get-config.use-case.js +7 -17
- package/dist/application/use-cases/config/index.js +23 -0
- package/dist/application/use-cases/config/set-config.use-case.js +49 -3
- package/dist/application/use-cases/dev/generate-component.use-case.js +138 -0
- package/dist/application/use-cases/dev/index.js +28 -0
- package/dist/application/use-cases/dev/install-template.use-case.js +60 -0
- package/dist/application/use-cases/dev/list-templates.use-case.js +45 -0
- package/dist/application/use-cases/dev/new-project.use-case.js +130 -0
- package/dist/application/use-cases/dev/publish-plugin.use-case.js +243 -0
- package/dist/application/use-cases/dev/uninstall-template.use-case.js +50 -0
- package/dist/application/use-cases/{instance → env}/delete-instance.use-case.js +2 -2
- package/dist/application/use-cases/{credentials → env}/get-credentials.use-case.js +1 -1
- package/dist/application/use-cases/{instance → env}/index.js +11 -0
- package/dist/application/use-cases/{instance → env}/install-instance.use-case.js +25 -136
- package/dist/application/use-cases/env/list-running-instances.use-case.js +47 -0
- package/dist/application/use-cases/{setup → env}/setup-environment.use-case.js +35 -4
- package/dist/application/use-cases/{instance → env}/start-instance.use-case.js +53 -41
- package/dist/application/use-cases/index.js +9 -6
- package/dist/application/use-cases/logs/index.js +21 -0
- package/dist/cli.js +175 -26
- package/dist/constants/defaults.js +8 -1
- package/dist/constants/oci-artifacts.js +4 -0
- package/dist/constants/paths.js +0 -4
- package/dist/constants/timeouts.js +5 -0
- package/dist/di/modules/application.module.js +13 -44
- package/dist/di/modules/config.module.js +19 -0
- package/dist/di/modules/dev.module.js +45 -0
- package/dist/di/modules/env.module.js +42 -0
- package/dist/di/modules/index.js +30 -0
- package/dist/di/modules/infrastructure.module.js +65 -82
- package/dist/di/modules/logs.module.js +15 -0
- package/dist/di/modules/presentation.module.js +18 -7
- package/dist/di/tokens.js +42 -30
- package/dist/domain/entities/credentials-resolver.entity.js +4 -1
- package/dist/domain/entities/credentials.entity.js +2 -5
- package/dist/domain/entities/delete-instance-validation.entity.js +4 -1
- package/dist/domain/entities/deployment-parameters.entity.js +11 -8
- package/dist/domain/entities/index.js +5 -1
- package/dist/domain/entities/instance-list-aggregator.entity.js +2 -2
- package/dist/domain/entities/instance-metadata.entity.js +2 -3
- package/dist/domain/entities/instance.entity.js +2 -1
- package/dist/domain/entities/log-filter.entity.js +6 -6
- package/dist/domain/entities/template-info.entity.js +63 -0
- package/dist/{infrastructure/utils/error-formatter.util.js → domain/errors/error-utils.js} +1 -1
- package/dist/domain/errors/index.js +19 -0
- package/dist/domain/index.js +6 -0
- package/dist/domain/interfaces/index.js +21 -0
- package/dist/domain/ports/dotnet-publisher.port.js +9 -0
- package/dist/{infrastructure/http/interfaces/http-client.interface.js → domain/ports/file-system.port.js} +1 -1
- package/dist/domain/ports/http-client.port.js +3 -0
- package/dist/domain/ports/index.js +10 -0
- package/dist/domain/ports/logger.port.js +3 -3
- package/dist/domain/ports/progress.port.js +10 -0
- package/dist/domain/ports/project-scaffolder.port.js +9 -0
- package/dist/domain/ports/schematics-runner.port.js +9 -0
- package/dist/domain/ports/template-manager.port.js +9 -0
- package/dist/domain/ports/wsl-setup.port.js +3 -0
- package/dist/domain/types/index.js +1 -0
- package/dist/domain/value-objects/acr-credentials.value-object.js +13 -1
- package/dist/domain/value-objects/chart-version.value-object.js +20 -3
- package/dist/domain/value-objects/config-log-level.value-object.js +2 -1
- package/dist/domain/value-objects/index.js +3 -1
- package/dist/domain/value-objects/instance-name.value-object.js +6 -3
- package/dist/domain/value-objects/jwt-key.value-object.js +27 -5
- package/dist/domain/value-objects/mssql-password.value-object.js +27 -5
- package/dist/domain/value-objects/output-path.value-object.js +85 -0
- package/dist/domain/value-objects/rsa-key-pair.value-object.js +29 -3
- package/dist/index.js +6 -1
- package/dist/infrastructure/config/{app-config.service.js → app-config.adapter.js} +29 -17
- package/dist/infrastructure/config/{config-validator.js → config-validator.util.js} +1 -1
- package/dist/infrastructure/config/index.js +14 -0
- package/dist/infrastructure/config/interfaces/index.js +3 -0
- package/dist/infrastructure/config/{crypto.service.js → services/crypto.service.js} +4 -1
- package/dist/infrastructure/config/services/index.js +9 -0
- package/dist/infrastructure/deployment/deployment.adapter.js +5 -5
- package/dist/infrastructure/deployment/index.js +9 -0
- package/dist/infrastructure/deployment/interfaces/index.js +3 -0
- package/dist/infrastructure/deployment/services/acr-credential-manager.service.js +18 -7
- package/dist/infrastructure/deployment/services/app-manager.service.js +3 -3
- package/dist/infrastructure/deployment/services/base-helm-deployment.service.js +13 -5
- package/dist/infrastructure/deployment/services/helm-registry.service.js +10 -3
- package/dist/infrastructure/deployment/services/index.js +35 -0
- package/dist/infrastructure/deployment/services/infra-manager.service.js +19 -15
- package/dist/infrastructure/deployment/services/k8s-job-runner.service.js +24 -6
- package/dist/infrastructure/deployment/services/mssql-database-init.service.js +75 -11
- package/dist/infrastructure/deployment/services/mssql-helm-deployment.service.js +17 -5
- package/dist/infrastructure/deployment/services/mssql-storage.service.js +5 -1
- package/dist/infrastructure/deployment/services/mssql-user-manager.service.js +7 -3
- package/dist/infrastructure/deployment/services/oci-artifact.service.js +8 -3
- package/dist/infrastructure/deployment/services/secret-manager.service.js +14 -5
- package/dist/infrastructure/deployment/services/service-manager.service.js +1 -1
- package/dist/infrastructure/deployment/services/version-compatibility.service.js +9 -5
- package/dist/infrastructure/dotnet/dotnet-publisher.adapter.js +143 -0
- package/dist/infrastructure/dotnet/index.js +9 -0
- package/dist/infrastructure/environment/index.js +11 -0
- package/dist/infrastructure/environment/interfaces/index.js +3 -0
- package/dist/infrastructure/{platform-detector.js → environment/platform-detector.util.js} +1 -1
- package/dist/infrastructure/environment/services/hardware-info.service.js +8 -8
- package/dist/infrastructure/environment/services/index.js +11 -0
- package/dist/infrastructure/errors/{error-handler.js → error-handler.adapter.js} +17 -17
- package/dist/infrastructure/errors/index.js +5 -21
- package/dist/infrastructure/execution/builders/base-command.builder.js +32 -11
- package/dist/infrastructure/execution/builders/index.js +26 -0
- package/dist/infrastructure/execution/builders/wsl-command.builder.js +39 -1
- package/dist/infrastructure/execution/command-builder.util.js +94 -0
- package/dist/infrastructure/execution/environments/index.js +23 -0
- package/dist/infrastructure/execution/environments/wsl-execution.environment.js +22 -7
- package/dist/infrastructure/execution/index.js +1 -2
- package/dist/infrastructure/execution/services/command-executor.service.js +389 -0
- package/dist/infrastructure/execution/services/index.js +8 -0
- package/dist/infrastructure/execution/{script-executor.service.js → services/script-executor.service.js} +12 -15
- package/dist/infrastructure/filesystem/filesystem.adapter.js +86 -0
- package/dist/infrastructure/filesystem/index.js +23 -0
- package/dist/infrastructure/http/{http-client.service.js → http-client.adapter.js} +20 -13
- package/dist/infrastructure/http/index.js +1 -1
- package/dist/infrastructure/interceptors/decorators/index.js +23 -0
- package/dist/infrastructure/interceptors/index.js +2 -2
- package/dist/infrastructure/interceptors/interceptor.factory.js +3 -3
- package/dist/infrastructure/interceptors/interfaces/index.js +3 -0
- package/dist/infrastructure/interceptors/services/index.js +6 -0
- package/dist/infrastructure/interceptors/{logging.interceptor.js → services/logging-interceptor.service.js} +4 -4
- package/dist/infrastructure/logger/services/file-log-reader.repository.js +1 -1
- package/dist/infrastructure/logger/services/file-log-writer.repository.js +1 -1
- package/dist/infrastructure/persistence/instance-metadata.adapter.js +2 -1
- package/dist/infrastructure/persistence/services/file-system-config.repository.js +10 -4
- package/dist/infrastructure/persistence/services/file-system-instance.repository.js +2 -2
- package/dist/infrastructure/platforms/index.js +18 -0
- package/dist/infrastructure/platforms/windows/index.js +13 -0
- package/dist/infrastructure/platforms/windows/interfaces/index.js +3 -0
- package/dist/infrastructure/platforms/windows/parsers/index.js +9 -0
- package/dist/infrastructure/platforms/windows/services/index.js +33 -0
- package/dist/infrastructure/platforms/windows/services/microk8s.service.js +28 -10
- package/dist/infrastructure/platforms/windows/services/rootfs-manager.service.js +7 -3
- package/dist/infrastructure/platforms/windows/services/windows-features.service.js +22 -8
- package/dist/infrastructure/platforms/windows/services/windows-info.service.js +10 -6
- package/dist/infrastructure/platforms/windows/services/wsl-config.service.js +15 -6
- package/dist/infrastructure/platforms/windows/services/wsl-info.service.js +12 -12
- package/dist/infrastructure/platforms/windows/services/wsl-instance-inspection.service.js +3 -3
- package/dist/infrastructure/platforms/windows/services/wsl-instance-lifecycle.service.js +76 -22
- package/dist/infrastructure/platforms/windows/services/wsl-updater.service.js +20 -15
- package/dist/infrastructure/platforms/windows/services/wslconfig-parser.service.js +3 -3
- package/dist/infrastructure/platforms/windows/wsl-instance-manager.adapter.js +8 -3
- package/dist/infrastructure/platforms/windows/wsl-setup.adapter.js +100 -0
- package/dist/infrastructure/schematics/index.js +11 -0
- package/dist/infrastructure/schematics/project-scaffolder.adapter.js +314 -0
- package/dist/infrastructure/schematics/schematics-runner.adapter.js +175 -0
- package/dist/infrastructure/template/index.js +25 -0
- package/dist/infrastructure/template/interfaces/index.js +22 -0
- package/dist/infrastructure/template/interfaces/template-downloader.interface.js +6 -0
- package/dist/infrastructure/template/interfaces/template-registry.interface.js +6 -0
- package/dist/infrastructure/template/services/index.js +24 -0
- package/dist/infrastructure/template/services/template-downloader.service.js +319 -0
- package/dist/infrastructure/template/services/template-registry.service.js +175 -0
- package/dist/infrastructure/template/template-manager.adapter.js +196 -0
- package/dist/infrastructure/utils/index.js +23 -0
- package/dist/infrastructure/utils/input-validator.util.js +7 -6
- package/dist/presentation/controllers/base.controller.js +36 -0
- package/dist/presentation/controllers/{config.controller.js → config/config.controller.js} +17 -62
- package/dist/presentation/controllers/config/index.js +21 -0
- package/dist/presentation/controllers/dev/dev.controller.js +202 -0
- package/dist/presentation/controllers/dev/index.js +23 -0
- package/dist/presentation/controllers/dev/template.controller.js +158 -0
- package/dist/presentation/controllers/{credentials.controller.js → env/credentials.controller.js} +8 -14
- package/dist/presentation/controllers/env/index.js +23 -0
- package/dist/presentation/controllers/{instance.controller.js → env/instance.controller.js} +35 -92
- package/dist/presentation/controllers/{setup.controller.js → env/setup.controller.js} +33 -66
- package/dist/presentation/controllers/index.js +9 -5
- package/dist/presentation/controllers/logs/index.js +21 -0
- package/dist/presentation/controllers/{logs.controller.js → logs/logs.controller.js} +8 -14
- package/dist/presentation/interfaces/index.js +21 -0
- package/dist/presentation/prompts/acr-credentials.prompt.js +37 -9
- package/dist/presentation/ui/constants/index.js +23 -0
- package/dist/presentation/ui/interaction.service.js +4 -4
- package/dist/presentation/ui/interfaces/cli-progress.interface.js +0 -6
- package/dist/presentation/ui/interfaces/index.js +6 -0
- package/package.json +6 -1
- package/dist/application/dtos/request/set-config.request.dto.js +0 -16
- package/dist/infrastructure/errors/error-handler.interface.js +0 -3
- package/dist/infrastructure/execution/command-builder.js +0 -252
- package/dist/infrastructure/execution/command-executor.service.js +0 -230
- /package/dist/application/dtos/{request → config/request}/get-config.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/delete-instance.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/get-credentials.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/install-instance.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/list-charts.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/setup-environment.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/start-instance.request.dto.js +0 -0
- /package/dist/application/dtos/{request → env/request}/stop-instance.request.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/credentials.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/delete-instance.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/install-instance.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/instance-list.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/instance-status.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/setup-result.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/start-instance.response.dto.js +0 -0
- /package/dist/application/dtos/{response → env/response}/stop-instance.response.dto.js +0 -0
- /package/dist/application/dtos/{request → logs/request}/show-logs.request.dto.js +0 -0
- /package/dist/application/dtos/{response → logs/response}/show-logs.response.dto.js +0 -0
- /package/dist/application/use-cases/{instance → env}/list-charts.use-case.js +0 -0
- /package/dist/application/use-cases/{instance → env}/list-instances.use-case.js +0 -0
- /package/dist/application/use-cases/{instance → env}/stop-instance.use-case.js +0 -0
- /package/dist/{infrastructure → domain}/errors/app-error.js +0 -0
- /package/dist/{infrastructure → domain}/errors/exit-codes.js +0 -0
- /package/dist/infrastructure/config/{app-config.interface.js → interfaces/app-config.interface.js} +0 -0
- /package/dist/{domain → infrastructure/interceptors}/decorators/sensitive.decorator.js +0 -0
- /package/dist/infrastructure/interceptors/{interceptor.interface.js → interfaces/interceptor.interface.js} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
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.OutputPath = void 0;
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* 輸出路徑 Value Object
|
|
41
|
+
*
|
|
42
|
+
* 封裝輸出路徑的安全驗證邏輯,防止寫入系統保護目錄
|
|
43
|
+
*/
|
|
44
|
+
class OutputPath {
|
|
45
|
+
constructor(resolvedPath) {
|
|
46
|
+
this.resolvedPath = resolvedPath;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 建立輸出路徑
|
|
50
|
+
* @param rawPath - 原始路徑字串
|
|
51
|
+
* @returns 輸出路徑物件
|
|
52
|
+
*/
|
|
53
|
+
static create(rawPath) {
|
|
54
|
+
return new OutputPath(path.resolve(rawPath));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 檢查路徑是否為系統保護路徑
|
|
58
|
+
* @param resolvedPath - 已解析的絕對路徑
|
|
59
|
+
* @returns 若為系統保護路徑則回傳 true
|
|
60
|
+
*/
|
|
61
|
+
static isProtected(resolvedPath) {
|
|
62
|
+
const normalized = resolvedPath.replace(/\\/g, '/').toLowerCase();
|
|
63
|
+
const homeDir = os.homedir().replace(/\\/g, '/').toLowerCase();
|
|
64
|
+
if (normalized === homeDir) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return this.FORBIDDEN_PREFIXES.some((prefix) => normalized.startsWith(prefix));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 取得已解析的絕對路徑
|
|
71
|
+
* @returns 已解析的路徑字串
|
|
72
|
+
*/
|
|
73
|
+
get value() {
|
|
74
|
+
return this.resolvedPath;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.OutputPath = OutputPath;
|
|
78
|
+
/** 系統保護路徑前綴清單 */
|
|
79
|
+
OutputPath.FORBIDDEN_PREFIXES = [
|
|
80
|
+
'/windows',
|
|
81
|
+
'/system32',
|
|
82
|
+
'c:/windows',
|
|
83
|
+
'c:/program files',
|
|
84
|
+
];
|
|
85
|
+
//# sourceMappingURL=output-path.value-object.js.map
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RsaKeyPair = void 0;
|
|
7
7
|
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const errors_1 = require("../errors");
|
|
8
9
|
/**
|
|
9
10
|
* RSA 金鑰對 Value Object
|
|
10
11
|
*
|
|
@@ -32,12 +33,14 @@ class RsaKeyPair {
|
|
|
32
33
|
const keyPair = new RsaKeyPair(privateKey, publicKey);
|
|
33
34
|
// 驗證生成的金鑰對
|
|
34
35
|
if (!keyPair.validate()) {
|
|
35
|
-
throw new
|
|
36
|
+
throw new errors_1.AppError('Generated RSA key pair validation failed', {
|
|
37
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
38
|
+
});
|
|
36
39
|
}
|
|
37
40
|
return keyPair;
|
|
38
41
|
}
|
|
39
42
|
catch (error) {
|
|
40
|
-
throw new
|
|
43
|
+
throw new errors_1.AppError(`Failed to generate RSA key pair: ${error instanceof Error ? error.message : String(error)}`, { exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR });
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
/**
|
|
@@ -50,7 +53,9 @@ class RsaKeyPair {
|
|
|
50
53
|
static create(privateKey, publicKey) {
|
|
51
54
|
const keyPair = new RsaKeyPair(privateKey, publicKey);
|
|
52
55
|
if (!keyPair.validate()) {
|
|
53
|
-
throw new
|
|
56
|
+
throw new errors_1.AppError('Invalid RSA key pair: keys do not match', {
|
|
57
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
58
|
+
});
|
|
54
59
|
}
|
|
55
60
|
return keyPair;
|
|
56
61
|
}
|
|
@@ -168,6 +173,27 @@ class RsaKeyPair {
|
|
|
168
173
|
// 第二次 Base64 編碼使用 UTF-8 (Helm 參數需求)
|
|
169
174
|
return Buffer.from(first, 'utf8').toString('base64');
|
|
170
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* 防止 JSON.stringify 意外洩露金鑰,回傳遮罩值
|
|
178
|
+
* @returns 遮罩後的物件
|
|
179
|
+
*/
|
|
180
|
+
toJSON() {
|
|
181
|
+
return {
|
|
182
|
+
privateKey: '***MASKED***',
|
|
183
|
+
publicKey: '***MASKED***',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 回傳可安全記錄到日志的物件
|
|
188
|
+
* 金鑰欄位將被遮罩
|
|
189
|
+
* @returns 遮罩後的物件,可安全寫入日志
|
|
190
|
+
*/
|
|
191
|
+
toSafeLog() {
|
|
192
|
+
return {
|
|
193
|
+
privateKey: '***MASKED***',
|
|
194
|
+
publicKey: '***MASKED***',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
171
197
|
/**
|
|
172
198
|
* 比較兩個金鑰對是否相等
|
|
173
199
|
* @param other - 另一個金鑰對
|
package/dist/index.js
CHANGED
|
@@ -2,5 +2,10 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const cli_1 = require("./cli");
|
|
5
|
-
(0, cli_1.run)(process.argv)
|
|
5
|
+
(0, cli_1.run)(process.argv)
|
|
6
|
+
.then(() => process.exit(0))
|
|
7
|
+
.catch(() => {
|
|
8
|
+
// 錯誤已由 BaseController.executeAction 和全域 ErrorHandler 處理
|
|
9
|
+
// 此處僅確保 Promise chain 不產生 unhandled rejection
|
|
10
|
+
});
|
|
6
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -45,15 +45,16 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
45
45
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
46
|
};
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.
|
|
48
|
+
exports.AppConfigAdapter = void 0;
|
|
49
49
|
const fs = __importStar(require("fs"));
|
|
50
50
|
const path = __importStar(require("path"));
|
|
51
51
|
const os = __importStar(require("os"));
|
|
52
52
|
const tsyringe_1 = require("tsyringe");
|
|
53
|
-
const
|
|
53
|
+
const config_validator_util_1 = require("./config-validator.util");
|
|
54
54
|
const acr_credentials_value_object_1 = require("../../domain/value-objects/acr-credentials.value-object");
|
|
55
55
|
const tokens_1 = require("../../di/tokens");
|
|
56
|
-
const
|
|
56
|
+
const errors_1 = require("../../domain/errors");
|
|
57
|
+
const crypto_service_1 = require("./services/crypto.service");
|
|
57
58
|
/**
|
|
58
59
|
* 混淆用字典字串
|
|
59
60
|
*/
|
|
@@ -78,11 +79,9 @@ function decodeObfuscated(indices) {
|
|
|
78
79
|
* 設定服務實作
|
|
79
80
|
* 負責載入、合併與驗證配置
|
|
80
81
|
*
|
|
81
|
-
*
|
|
82
|
-
* - IAppConfig: Infrastructure 層內部介面(完整配置功能)
|
|
83
|
-
* - IAppConfigPort: Domain Port(供 Application 層使用)
|
|
82
|
+
* 實作 IAppConfigPort Domain Port,供 Application 層使用
|
|
84
83
|
*/
|
|
85
|
-
let
|
|
84
|
+
let AppConfigAdapter = class AppConfigAdapter {
|
|
86
85
|
constructor(logger) {
|
|
87
86
|
this.logger = logger;
|
|
88
87
|
}
|
|
@@ -140,7 +139,7 @@ let AppConfig = class AppConfig {
|
|
|
140
139
|
const userConfig = this.loadUserConfig();
|
|
141
140
|
const merged = this.mergeConfigs(defaultConfig, userConfig);
|
|
142
141
|
// 驗證設定
|
|
143
|
-
(0,
|
|
142
|
+
(0, config_validator_util_1.validateConfig)(merged, this.logger);
|
|
144
143
|
return merged;
|
|
145
144
|
}
|
|
146
145
|
/**
|
|
@@ -173,7 +172,7 @@ let AppConfig = class AppConfig {
|
|
|
173
172
|
password: crypto_service_1.CryptoService.encrypt(configToSave.acr.password),
|
|
174
173
|
};
|
|
175
174
|
}
|
|
176
|
-
fs.writeFileSync(configPath, JSON.stringify(configToSave, null, 2), 'utf-8');
|
|
175
|
+
fs.writeFileSync(configPath, JSON.stringify(configToSave, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
177
176
|
this.logger.debug('Configuration saved', { configPath });
|
|
178
177
|
}
|
|
179
178
|
/**
|
|
@@ -182,7 +181,7 @@ let AppConfig = class AppConfig {
|
|
|
182
181
|
*/
|
|
183
182
|
getCliVersion() {
|
|
184
183
|
try {
|
|
185
|
-
// 目錄結構:dist/infrastructure/config/app-config.
|
|
184
|
+
// 目錄結構:dist/infrastructure/config/app-config.adapter.js
|
|
186
185
|
// 需要往上 3 層才能到達專案根目錄
|
|
187
186
|
const possiblePaths = [
|
|
188
187
|
path.resolve(__dirname, '../../../package.json'), // dist 環境
|
|
@@ -236,23 +235,36 @@ let AppConfig = class AppConfig {
|
|
|
236
235
|
*/
|
|
237
236
|
loadAcrCredentialsFromFile(filePath) {
|
|
238
237
|
if (!fs.existsSync(filePath)) {
|
|
239
|
-
throw new
|
|
238
|
+
throw new errors_1.AppError(`ACR credentials file not found: ${filePath}`, {
|
|
239
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
240
|
+
});
|
|
240
241
|
}
|
|
241
242
|
try {
|
|
242
243
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
243
244
|
const data = JSON.parse(content);
|
|
244
245
|
if (!acr_credentials_value_object_1.AcrCredentials.isValid(data.name, data.account, data.password)) {
|
|
245
|
-
throw new
|
|
246
|
+
throw new errors_1.AppError('Invalid ACR credentials format: name, account, and password are required', {
|
|
247
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
248
|
+
});
|
|
246
249
|
}
|
|
247
250
|
return acr_credentials_value_object_1.AcrCredentials.create(data.name, data.account, data.password);
|
|
248
251
|
}
|
|
249
252
|
catch (error) {
|
|
250
253
|
if (error instanceof SyntaxError) {
|
|
251
|
-
throw new
|
|
254
|
+
throw new errors_1.AppError(`Invalid JSON in ACR credentials file: ${filePath}`, {
|
|
255
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
256
|
+
});
|
|
252
257
|
}
|
|
253
258
|
throw error;
|
|
254
259
|
}
|
|
255
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* 取得使用者配置目錄路徑
|
|
263
|
+
* @returns 使用者配置目錄路徑(如 ~/.uofx)
|
|
264
|
+
*/
|
|
265
|
+
getUserConfigDir() {
|
|
266
|
+
return path.join(os.homedir(), '.uofx');
|
|
267
|
+
}
|
|
256
268
|
/**
|
|
257
269
|
* 深度合併設定物件
|
|
258
270
|
* @param defaultConfig 預設設定
|
|
@@ -271,10 +283,10 @@ let AppConfig = class AppConfig {
|
|
|
271
283
|
};
|
|
272
284
|
}
|
|
273
285
|
};
|
|
274
|
-
exports.
|
|
275
|
-
exports.
|
|
286
|
+
exports.AppConfigAdapter = AppConfigAdapter;
|
|
287
|
+
exports.AppConfigAdapter = AppConfigAdapter = __decorate([
|
|
276
288
|
(0, tsyringe_1.injectable)(),
|
|
277
289
|
__param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.ILoggerPort)),
|
|
278
290
|
__metadata("design:paramtypes", [Object])
|
|
279
|
-
],
|
|
280
|
-
//# sourceMappingURL=app-config.
|
|
291
|
+
], AppConfigAdapter);
|
|
292
|
+
//# sourceMappingURL=app-config.adapter.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateConfig = exports.validateLogLevel = exports.CryptoService = exports.AppConfigAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Infrastructure Config 模組匯出
|
|
6
|
+
*/
|
|
7
|
+
var app_config_adapter_1 = require("./app-config.adapter");
|
|
8
|
+
Object.defineProperty(exports, "AppConfigAdapter", { enumerable: true, get: function () { return app_config_adapter_1.AppConfigAdapter; } });
|
|
9
|
+
var crypto_service_1 = require("./services/crypto.service");
|
|
10
|
+
Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
|
|
11
|
+
var config_validator_util_1 = require("./config-validator.util");
|
|
12
|
+
Object.defineProperty(exports, "validateLogLevel", { enumerable: true, get: function () { return config_validator_util_1.validateLogLevel; } });
|
|
13
|
+
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return config_validator_util_1.validateConfig; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.CryptoService = void 0;
|
|
37
37
|
const crypto = __importStar(require("crypto"));
|
|
38
|
+
const errors_1 = require("../../../domain/errors");
|
|
38
39
|
/**
|
|
39
40
|
* 混淆用字典字串
|
|
40
41
|
*/
|
|
@@ -93,7 +94,9 @@ class CryptoService {
|
|
|
93
94
|
*/
|
|
94
95
|
static decrypt(encrypted) {
|
|
95
96
|
if (!this.isEncrypted(encrypted)) {
|
|
96
|
-
throw new
|
|
97
|
+
throw new errors_1.AppError('Invalid encrypted format', {
|
|
98
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
99
|
+
});
|
|
97
100
|
}
|
|
98
101
|
const key = this.getKey();
|
|
99
102
|
const data = Buffer.from(encrypted.slice(ENCRYPTED_PREFIX.length), 'base64');
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CryptoService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Config 模組服務匯出
|
|
6
|
+
*/
|
|
7
|
+
var crypto_service_1 = require("./crypto.service");
|
|
8
|
+
Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -107,11 +107,11 @@ exports.DeploymentAdapter = DeploymentAdapter = __decorate([
|
|
|
107
107
|
(0, tsyringe_1.injectable)(),
|
|
108
108
|
__param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IMssqlHelmDeployment)),
|
|
109
109
|
__param(1, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IK8sJobRunner)),
|
|
110
|
-
__param(2, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.
|
|
111
|
-
__param(3, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.
|
|
112
|
-
__param(4, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.
|
|
113
|
-
__param(5, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.
|
|
114
|
-
__param(6, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.
|
|
110
|
+
__param(2, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IInfraManager)),
|
|
111
|
+
__param(3, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IServiceManager)),
|
|
112
|
+
__param(4, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IAppManager)),
|
|
113
|
+
__param(5, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.ISecretManager)),
|
|
114
|
+
__param(6, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IHelmRegistry)),
|
|
115
115
|
__param(7, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.VersionCompatibilityService)),
|
|
116
116
|
__metadata("design:paramtypes", [Object, Object, Object, Object, Object, Object, Object, Object])
|
|
117
117
|
], DeploymentAdapter);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeploymentAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Infrastructure Deployment 模組匯出
|
|
6
|
+
*/
|
|
7
|
+
var deployment_adapter_1 = require("./deployment.adapter");
|
|
8
|
+
Object.defineProperty(exports, "DeploymentAdapter", { enumerable: true, get: function () { return deployment_adapter_1.DeploymentAdapter; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -49,7 +49,8 @@ exports.AcrCredentialManagerService = void 0;
|
|
|
49
49
|
const tsyringe_1 = require("tsyringe");
|
|
50
50
|
const fs = __importStar(require("fs"));
|
|
51
51
|
const tokens_1 = require("../../../di/tokens");
|
|
52
|
-
const sensitive_decorator_1 = require("
|
|
52
|
+
const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
|
|
53
|
+
const errors_1 = require("../../../domain/errors");
|
|
53
54
|
let AcrCredentialManagerService = class AcrCredentialManagerService {
|
|
54
55
|
constructor(appConfig) {
|
|
55
56
|
this.appConfig = appConfig;
|
|
@@ -62,7 +63,9 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
|
|
|
62
63
|
loadCredentialsFromFile(filePath) {
|
|
63
64
|
// 檢查檔案存在
|
|
64
65
|
if (!fs.existsSync(filePath)) {
|
|
65
|
-
throw new
|
|
66
|
+
throw new errors_1.AppError(`Pull secret file not found: ${filePath}`, {
|
|
67
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
68
|
+
});
|
|
66
69
|
}
|
|
67
70
|
// 讀取檔案
|
|
68
71
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
@@ -72,7 +75,9 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
|
|
|
72
75
|
raw = JSON.parse(content);
|
|
73
76
|
}
|
|
74
77
|
catch {
|
|
75
|
-
throw new
|
|
78
|
+
throw new errors_1.AppError('Invalid JSON format in pull secret file', {
|
|
79
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
80
|
+
});
|
|
76
81
|
}
|
|
77
82
|
// 正規化欄位名稱(支援舊格式相容)
|
|
78
83
|
const credentials = this.normalizeCredentials(raw);
|
|
@@ -113,13 +118,19 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
|
|
|
113
118
|
*/
|
|
114
119
|
validateCredentials(credentials) {
|
|
115
120
|
if (!credentials.name) {
|
|
116
|
-
throw new
|
|
121
|
+
throw new errors_1.AppError('Missing required field in pull secret: name (or acrName)', {
|
|
122
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
123
|
+
});
|
|
117
124
|
}
|
|
118
125
|
if (!credentials.account) {
|
|
119
|
-
throw new
|
|
126
|
+
throw new errors_1.AppError('Missing required field in pull secret: account (or acrAccount)', {
|
|
127
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
128
|
+
});
|
|
120
129
|
}
|
|
121
130
|
if (!credentials.password) {
|
|
122
|
-
throw new
|
|
131
|
+
throw new errors_1.AppError('Missing required field in pull secret: password (or acrPassword)', {
|
|
132
|
+
exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
|
|
133
|
+
});
|
|
123
134
|
}
|
|
124
135
|
}
|
|
125
136
|
};
|
|
@@ -138,7 +149,7 @@ __decorate([
|
|
|
138
149
|
], AcrCredentialManagerService.prototype, "getDefaultCredentials", null);
|
|
139
150
|
exports.AcrCredentialManagerService = AcrCredentialManagerService = __decorate([
|
|
140
151
|
(0, tsyringe_1.injectable)(),
|
|
141
|
-
__param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.
|
|
152
|
+
__param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.IAppConfigPort)),
|
|
142
153
|
__metadata("design:paramtypes", [Object])
|
|
143
154
|
], AcrCredentialManagerService);
|
|
144
155
|
//# sourceMappingURL=acr-credential-manager.service.js.map
|
|
@@ -16,7 +16,7 @@ exports.AppManagerService = void 0;
|
|
|
16
16
|
const tsyringe_1 = require("tsyringe");
|
|
17
17
|
const tokens_1 = require("../../../di/tokens");
|
|
18
18
|
const deployment_parameters_entity_1 = require("../../../domain/entities/deployment-parameters.entity");
|
|
19
|
-
const sensitive_decorator_1 = require("
|
|
19
|
+
const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
|
|
20
20
|
const base_helm_deployment_service_1 = require("./base-helm-deployment.service");
|
|
21
21
|
const index_1 = require("../../../constants/index");
|
|
22
22
|
/**
|
|
@@ -71,7 +71,7 @@ let AppManagerService = class AppManagerService extends base_helm_deployment_ser
|
|
|
71
71
|
releaseName: 'uofx-blue',
|
|
72
72
|
chartPath,
|
|
73
73
|
wait: true,
|
|
74
|
-
timeout: '
|
|
74
|
+
timeout: '3600s',
|
|
75
75
|
sensitiveStdin: valuesContent,
|
|
76
76
|
});
|
|
77
77
|
this.logger.debug('[App] Deploying application chart', {
|
|
@@ -102,7 +102,7 @@ let AppManagerService = class AppManagerService extends base_helm_deployment_ser
|
|
|
102
102
|
.arg('secret')
|
|
103
103
|
.arg('web-appsettings-secret')
|
|
104
104
|
.arg('-n', 'uofx')
|
|
105
|
-
.arg('-p',
|
|
105
|
+
.arg('-p', patchData);
|
|
106
106
|
try {
|
|
107
107
|
await builder.exec();
|
|
108
108
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseHelmDeploymentService = void 0;
|
|
4
4
|
const retry_util_1 = require("../../utils/retry.util");
|
|
5
|
+
const errors_1 = require("../../../domain/errors");
|
|
5
6
|
/**
|
|
6
7
|
* Helm 部署基類
|
|
7
8
|
*
|
|
@@ -97,7 +98,9 @@ class BaseHelmDeploymentService {
|
|
|
97
98
|
*/
|
|
98
99
|
createHelmUpgradeBuilder(instanceName, options) {
|
|
99
100
|
if (!this.envFactory) {
|
|
100
|
-
throw new
|
|
101
|
+
throw new errors_1.AppError('ExecutionEnvironmentFactory is required for createHelmUpgradeBuilder', {
|
|
102
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
103
|
+
});
|
|
101
104
|
}
|
|
102
105
|
const env = this.envFactory.getForInstance(instanceName);
|
|
103
106
|
const builder = env.helm('upgrade')
|
|
@@ -112,7 +115,7 @@ class BaseHelmDeploymentService {
|
|
|
112
115
|
}
|
|
113
116
|
// Release 名稱和 Chart 路徑
|
|
114
117
|
builder.arg(options.releaseName);
|
|
115
|
-
builder.arg(
|
|
118
|
+
builder.arg(options.chartPath);
|
|
116
119
|
// 命名空間
|
|
117
120
|
const namespace = options.namespace ?? 'uofx';
|
|
118
121
|
builder.arg('-n', namespace);
|
|
@@ -126,7 +129,7 @@ class BaseHelmDeploymentService {
|
|
|
126
129
|
// 添加敏感的 --set 參數
|
|
127
130
|
if (options.sensitiveSetArgs) {
|
|
128
131
|
for (const { key, value } of options.sensitiveSetArgs) {
|
|
129
|
-
builder.sensitiveArg('--set', `${key}
|
|
132
|
+
builder.sensitiveArg('--set', `${key}=${value}`);
|
|
130
133
|
}
|
|
131
134
|
}
|
|
132
135
|
// 從 stdin 讀取 values
|
|
@@ -147,7 +150,10 @@ class BaseHelmDeploymentService {
|
|
|
147
150
|
await (0, retry_util_1.retryWithBackoff)(async () => {
|
|
148
151
|
const result = await builder.exec();
|
|
149
152
|
if (result.exitCode !== 0) {
|
|
150
|
-
|
|
153
|
+
this.logger.debug('Helm deployment failed', { stderr: result.stderr });
|
|
154
|
+
throw new errors_1.AppError('Helm deployment failed', {
|
|
155
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
156
|
+
});
|
|
151
157
|
}
|
|
152
158
|
}, (0, retry_util_1.createHelmRetryOptions)({
|
|
153
159
|
onRetry: (attempt) => {
|
|
@@ -155,7 +161,9 @@ class BaseHelmDeploymentService {
|
|
|
155
161
|
this.logger.warn(`[${serviceName}] Retrying install (${attempt}/3)...`);
|
|
156
162
|
},
|
|
157
163
|
})).catch((error) => {
|
|
158
|
-
throw new
|
|
164
|
+
throw new errors_1.AppError(`Failed to install ${chartName} chart: ${error.message}`, {
|
|
165
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
166
|
+
});
|
|
159
167
|
});
|
|
160
168
|
}
|
|
161
169
|
}
|
|
@@ -16,7 +16,8 @@ exports.HelmRegistryService = void 0;
|
|
|
16
16
|
const tsyringe_1 = require("tsyringe");
|
|
17
17
|
const tokens_1 = require("../../../di/tokens");
|
|
18
18
|
const acr_credentials_value_object_1 = require("../../../domain/value-objects/acr-credentials.value-object");
|
|
19
|
-
const sensitive_decorator_1 = require("
|
|
19
|
+
const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
|
|
20
|
+
const errors_1 = require("../../../domain/errors");
|
|
20
21
|
/**
|
|
21
22
|
* Helm Registry 服務
|
|
22
23
|
*
|
|
@@ -56,7 +57,10 @@ let HelmRegistryService = class HelmRegistryService {
|
|
|
56
57
|
.sensitiveStdin(acrPassword);
|
|
57
58
|
const result = await builder.exec();
|
|
58
59
|
if (result.exitCode !== 0) {
|
|
59
|
-
|
|
60
|
+
this.logger.debug('Failed to login to helm registry', { stderr: result.stderr });
|
|
61
|
+
throw new errors_1.AppError('Failed to login to helm registry', {
|
|
62
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
63
|
+
});
|
|
60
64
|
}
|
|
61
65
|
this.logger.debug(`[HelmRegistry] Successfully logged in to ${registry}`);
|
|
62
66
|
}
|
|
@@ -85,7 +89,10 @@ let HelmRegistryService = class HelmRegistryService {
|
|
|
85
89
|
.arg('--destination', destDir);
|
|
86
90
|
const result = await builder.exec();
|
|
87
91
|
if (result.exitCode !== 0) {
|
|
88
|
-
|
|
92
|
+
this.logger.debug(`Failed to pull ${chartName} chart`, { stderr: result.stderr });
|
|
93
|
+
throw new errors_1.AppError(`Failed to pull ${chartName} chart`, {
|
|
94
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
95
|
+
});
|
|
89
96
|
}
|
|
90
97
|
const chartPath = `${destDir}/${chartName}-${version}.tgz`;
|
|
91
98
|
this.logger.debug(`[HelmRegistry] Chart pulled successfully: ${chartPath}`);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VersionCompatibilityService = exports.ServiceManagerService = exports.SecretManagerService = exports.OciArtifactService = exports.MssqlUserManagerService = exports.MssqlStorageService = exports.MssqlHelmDeploymentService = exports.MssqlDatabaseInitService = exports.K8sJobRunnerService = exports.InfraManagerService = exports.HelmRegistryService = exports.BaseHelmDeploymentService = exports.AppManagerService = exports.AcrCredentialManagerService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Deployment 模組服務匯出
|
|
6
|
+
*/
|
|
7
|
+
var acr_credential_manager_service_1 = require("./acr-credential-manager.service");
|
|
8
|
+
Object.defineProperty(exports, "AcrCredentialManagerService", { enumerable: true, get: function () { return acr_credential_manager_service_1.AcrCredentialManagerService; } });
|
|
9
|
+
var app_manager_service_1 = require("./app-manager.service");
|
|
10
|
+
Object.defineProperty(exports, "AppManagerService", { enumerable: true, get: function () { return app_manager_service_1.AppManagerService; } });
|
|
11
|
+
var base_helm_deployment_service_1 = require("./base-helm-deployment.service");
|
|
12
|
+
Object.defineProperty(exports, "BaseHelmDeploymentService", { enumerable: true, get: function () { return base_helm_deployment_service_1.BaseHelmDeploymentService; } });
|
|
13
|
+
var helm_registry_service_1 = require("./helm-registry.service");
|
|
14
|
+
Object.defineProperty(exports, "HelmRegistryService", { enumerable: true, get: function () { return helm_registry_service_1.HelmRegistryService; } });
|
|
15
|
+
var infra_manager_service_1 = require("./infra-manager.service");
|
|
16
|
+
Object.defineProperty(exports, "InfraManagerService", { enumerable: true, get: function () { return infra_manager_service_1.InfraManagerService; } });
|
|
17
|
+
var k8s_job_runner_service_1 = require("./k8s-job-runner.service");
|
|
18
|
+
Object.defineProperty(exports, "K8sJobRunnerService", { enumerable: true, get: function () { return k8s_job_runner_service_1.K8sJobRunnerService; } });
|
|
19
|
+
var mssql_database_init_service_1 = require("./mssql-database-init.service");
|
|
20
|
+
Object.defineProperty(exports, "MssqlDatabaseInitService", { enumerable: true, get: function () { return mssql_database_init_service_1.MssqlDatabaseInitService; } });
|
|
21
|
+
var mssql_helm_deployment_service_1 = require("./mssql-helm-deployment.service");
|
|
22
|
+
Object.defineProperty(exports, "MssqlHelmDeploymentService", { enumerable: true, get: function () { return mssql_helm_deployment_service_1.MssqlHelmDeploymentService; } });
|
|
23
|
+
var mssql_storage_service_1 = require("./mssql-storage.service");
|
|
24
|
+
Object.defineProperty(exports, "MssqlStorageService", { enumerable: true, get: function () { return mssql_storage_service_1.MssqlStorageService; } });
|
|
25
|
+
var mssql_user_manager_service_1 = require("./mssql-user-manager.service");
|
|
26
|
+
Object.defineProperty(exports, "MssqlUserManagerService", { enumerable: true, get: function () { return mssql_user_manager_service_1.MssqlUserManagerService; } });
|
|
27
|
+
var oci_artifact_service_1 = require("./oci-artifact.service");
|
|
28
|
+
Object.defineProperty(exports, "OciArtifactService", { enumerable: true, get: function () { return oci_artifact_service_1.OciArtifactService; } });
|
|
29
|
+
var secret_manager_service_1 = require("./secret-manager.service");
|
|
30
|
+
Object.defineProperty(exports, "SecretManagerService", { enumerable: true, get: function () { return secret_manager_service_1.SecretManagerService; } });
|
|
31
|
+
var service_manager_service_1 = require("./service-manager.service");
|
|
32
|
+
Object.defineProperty(exports, "ServiceManagerService", { enumerable: true, get: function () { return service_manager_service_1.ServiceManagerService; } });
|
|
33
|
+
var version_compatibility_service_1 = require("./version-compatibility.service");
|
|
34
|
+
Object.defineProperty(exports, "VersionCompatibilityService", { enumerable: true, get: function () { return version_compatibility_service_1.VersionCompatibilityService; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -16,9 +16,10 @@ exports.InfraManagerService = void 0;
|
|
|
16
16
|
const tsyringe_1 = require("tsyringe");
|
|
17
17
|
const tokens_1 = require("../../../di/tokens");
|
|
18
18
|
const deployment_parameters_entity_1 = require("../../../domain/entities/deployment-parameters.entity");
|
|
19
|
-
const sensitive_decorator_1 = require("
|
|
19
|
+
const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
|
|
20
20
|
const base_helm_deployment_service_1 = require("./base-helm-deployment.service");
|
|
21
21
|
const paths_1 = require("../../../constants/paths");
|
|
22
|
+
const errors_1 = require("../../../domain/errors");
|
|
22
23
|
/**
|
|
23
24
|
* 基礎設施管理服務
|
|
24
25
|
*
|
|
@@ -61,21 +62,21 @@ let InfraManagerService = class InfraManagerService extends base_helm_deployment
|
|
|
61
62
|
releaseName: 'uofx-infra',
|
|
62
63
|
chartPath,
|
|
63
64
|
setArgs: [
|
|
64
|
-
`k8sType=
|
|
65
|
+
`k8sType=microk8s`,
|
|
65
66
|
`traefik.web.TLS.enable=true`,
|
|
66
67
|
`traefik.admin.TLS.enable=true`,
|
|
67
|
-
`imageCredentials.registry
|
|
68
|
-
`imageCredentials.username
|
|
69
|
-
`storage.type=
|
|
70
|
-
`storage.local.defaultPath
|
|
71
|
-
`storage.local.mqShare.path
|
|
72
|
-
`storage.local.lokiShare.path
|
|
73
|
-
`storage.local.redisShare.path
|
|
74
|
-
`storage.local.fileShare.path
|
|
75
|
-
`storage.local.syncShare.path
|
|
76
|
-
`storage.local.searchShare.path
|
|
77
|
-
`loki.retentionPeriod=
|
|
78
|
-
`installType=
|
|
68
|
+
`imageCredentials.registry=${registry}`,
|
|
69
|
+
`imageCredentials.username=${acrAccount}`,
|
|
70
|
+
`storage.type=local`,
|
|
71
|
+
`storage.local.defaultPath=${paths_1.LINUX_PATHS.UOFX_STORAGE_BASE}`,
|
|
72
|
+
`storage.local.mqShare.path=/rabbitmq`,
|
|
73
|
+
`storage.local.lokiShare.path=/loki`,
|
|
74
|
+
`storage.local.redisShare.path=/redis`,
|
|
75
|
+
`storage.local.fileShare.path=/file`,
|
|
76
|
+
`storage.local.syncShare.path=/system`,
|
|
77
|
+
`storage.local.searchShare.path=/search`,
|
|
78
|
+
`loki.retentionPeriod=365d`,
|
|
79
|
+
`installType=install`,
|
|
79
80
|
`enabledSearch=true`,
|
|
80
81
|
],
|
|
81
82
|
sensitiveSetArgs: [
|
|
@@ -108,7 +109,10 @@ let InfraManagerService = class InfraManagerService extends base_helm_deployment
|
|
|
108
109
|
.args(...directories);
|
|
109
110
|
const result = await builder.exec();
|
|
110
111
|
if (result.exitCode !== 0) {
|
|
111
|
-
|
|
112
|
+
this.logger.debug('Failed to create storage directories', { stderr: result.stderr });
|
|
113
|
+
throw new errors_1.AppError('Failed to create storage directories', {
|
|
114
|
+
exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
|
|
115
|
+
});
|
|
112
116
|
}
|
|
113
117
|
this.logger.debug('[Infra] Storage directories created');
|
|
114
118
|
}
|