@bluedynamics/cdk8s-plone 0.0.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/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { Plone, PloneOptions, PloneBaseOptions } from './plone';
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Plone = void 0;
4
+ var plone_1 = require("./plone");
5
+ Object.defineProperty(exports, "Plone", { enumerable: true, get: function () { return plone_1.Plone; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWdFO0FBQXZELDhGQUFBLEtBQUssT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFBsb25lLCBQbG9uZU9wdGlvbnMsIFBsb25lQmFzZU9wdGlvbnMgfSBmcm9tICcuL3Bsb25lJztcbiJdfQ==
package/lib/pdb.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { Construct } from 'constructs';
2
+ export interface PlonePDBOptions {
3
+ /**
4
+ * maxUnavailable specification
5
+ * @default - none
6
+ */
7
+ readonly maxUnavailable?: number | string;
8
+ /**
9
+ * minAvailable specification.
10
+ * default only set if maxUnavailable is not set.
11
+ * @default 1
12
+ */
13
+ readonly minAvailable?: number | string;
14
+ /**
15
+ * Extra labels to associate with resources.
16
+ * @default - none
17
+ */
18
+ readonly labels?: {
19
+ [name: string]: string;
20
+ };
21
+ }
22
+ export declare class PlonePDB extends Construct {
23
+ constructor(scope: Construct, id: string, selectorLabel: {
24
+ [name: string]: string;
25
+ }, options: PlonePDBOptions);
26
+ }
package/lib/pdb.js ADDED
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlonePDB = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const k8s = require("./imports/k8s");
6
+ class PlonePDB extends constructs_1.Construct {
7
+ constructor(scope, id, selectorLabel, options) {
8
+ super(scope, id);
9
+ var spec = {};
10
+ if (typeof options.maxUnavailable === 'number') {
11
+ spec = {
12
+ maxUnavailable: k8s.IntOrString.fromNumber(options.maxUnavailable),
13
+ };
14
+ }
15
+ else if (typeof options.maxUnavailable === 'string') {
16
+ spec = {
17
+ maxUnavailable: k8s.IntOrString.fromString(options.maxUnavailable),
18
+ };
19
+ }
20
+ if (typeof options.minAvailable === 'number') {
21
+ spec = {
22
+ ...spec,
23
+ minAvailable: k8s.IntOrString.fromNumber(options.minAvailable),
24
+ };
25
+ }
26
+ else if (typeof options.minAvailable === 'string') {
27
+ spec = {
28
+ ...spec,
29
+ minAvailable: k8s.IntOrString.fromString(options.minAvailable),
30
+ };
31
+ }
32
+ if (options.maxUnavailable === undefined && options.minAvailable === undefined) {
33
+ spec = {
34
+ minAvailable: k8s.IntOrString.fromNumber(1),
35
+ };
36
+ }
37
+ spec = {
38
+ ...spec,
39
+ selector: { matchLabels: selectorLabel },
40
+ };
41
+ const pdb_labels = {
42
+ ...options.labels ?? {},
43
+ 'app.kubernetes.io/part-of': 'plone',
44
+ 'app.kubernetes.io/managed-by': 'cdk8s-plone',
45
+ };
46
+ new k8s.KubePodDisruptionBudget(this, 'PDB', {
47
+ metadata: {
48
+ labels: pdb_labels,
49
+ },
50
+ spec: spec,
51
+ });
52
+ }
53
+ }
54
+ exports.PlonePDB = PlonePDB;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BkYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMscUNBQXFDO0FBdUJyQyxNQUFhLFFBQVMsU0FBUSxzQkFBUztJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLGFBQXlDLEVBQUUsT0FBd0I7UUFDM0csS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLElBQUksR0FBZ0MsRUFBRSxDQUFDO1FBQzNDLElBQUksT0FBTyxPQUFPLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksR0FBRztnQkFDTCxjQUFjLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQXdCLENBQUM7YUFDN0UsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLE9BQU8sT0FBTyxDQUFDLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0RCxJQUFJLEdBQUc7Z0JBQ0wsY0FBYyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUF3QixDQUFDO2FBQzdFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0MsSUFBSSxHQUFHO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQXNCLENBQUM7YUFDekUsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxJQUFJLEdBQUc7Z0JBQ0wsR0FBRyxJQUFJO2dCQUNQLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBc0IsQ0FBQzthQUN6RSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvRSxJQUFJLEdBQUc7Z0JBQ0wsWUFBWSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUM1QyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksR0FBRztZQUNMLEdBQUcsSUFBSTtZQUNQLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUU7U0FDekMsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO1lBQ3ZCLDJCQUEyQixFQUFFLE9BQU87WUFDcEMsOEJBQThCLEVBQUUsYUFBYTtTQUM5QyxDQUFDO1FBRUYsSUFBSSxHQUFHLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUMzQyxRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRCxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpERCw0QkFpREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcblxuZXhwb3J0IGludGVyZmFjZSBQbG9uZVBEQk9wdGlvbnMge1xuICAvKipcbiAgICogbWF4VW5hdmFpbGFibGUgc3BlY2lmaWNhdGlvblxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IG1heFVuYXZhaWxhYmxlPzogbnVtYmVyIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBtaW5BdmFpbGFibGUgc3BlY2lmaWNhdGlvbi5cbiAgICogZGVmYXVsdCBvbmx5IHNldCBpZiBtYXhVbmF2YWlsYWJsZSBpcyBub3Qgc2V0LlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBtaW5BdmFpbGFibGU/OiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dHJhIGxhYmVscyB0byBhc3NvY2lhdGUgd2l0aCByZXNvdXJjZXMuXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBjbGFzcyBQbG9uZVBEQiBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgc2VsZWN0b3JMYWJlbDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sIG9wdGlvbnM6IFBsb25lUERCT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB2YXIgc3BlYzogazhzLlBvZERpc3J1cHRpb25CdWRnZXRTcGVjID0ge307XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heFVuYXZhaWxhYmxlID09PSAnbnVtYmVyJykge1xuICAgICAgc3BlYyA9IHtcbiAgICAgICAgbWF4VW5hdmFpbGFibGU6IGs4cy5JbnRPclN0cmluZy5mcm9tTnVtYmVyKG9wdGlvbnMubWF4VW5hdmFpbGFibGUgYXMgbnVtYmVyKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXhVbmF2YWlsYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNwZWMgPSB7XG4gICAgICAgIG1heFVuYXZhaWxhYmxlOiBrOHMuSW50T3JTdHJpbmcuZnJvbVN0cmluZyhvcHRpb25zLm1heFVuYXZhaWxhYmxlIGFzIHN0cmluZyksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluQXZhaWxhYmxlID09PSAnbnVtYmVyJykge1xuICAgICAgc3BlYyA9IHtcbiAgICAgICAgLi4uc3BlYyxcbiAgICAgICAgbWluQXZhaWxhYmxlOiBrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcihvcHRpb25zLm1pbkF2YWlsYWJsZSBhcyBudW1iZXIpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLm1pbkF2YWlsYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNwZWMgPSB7XG4gICAgICAgIC4uLnNwZWMsXG4gICAgICAgIG1pbkF2YWlsYWJsZTogazhzLkludE9yU3RyaW5nLmZyb21TdHJpbmcob3B0aW9ucy5taW5BdmFpbGFibGUgYXMgc3RyaW5nKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1heFVuYXZhaWxhYmxlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5taW5BdmFpbGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc3BlYyA9IHtcbiAgICAgICAgbWluQXZhaWxhYmxlOiBrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcigxKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3BlYyA9IHtcbiAgICAgIC4uLnNwZWMsXG4gICAgICBzZWxlY3RvcjogeyBtYXRjaExhYmVsczogc2VsZWN0b3JMYWJlbCB9LFxuICAgIH07XG4gICAgY29uc3QgcGRiX2xhYmVscyA9IHtcbiAgICAgIC4uLm9wdGlvbnMubGFiZWxzID8/IHt9LFxuICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3BhcnQtb2YnOiAncGxvbmUnLFxuICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnknOiAnY2RrOHMtcGxvbmUnLFxuICAgIH07XG5cbiAgICBuZXcgazhzLkt1YmVQb2REaXNydXB0aW9uQnVkZ2V0KHRoaXMsICdQREInLCB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYWJlbHM6IHBkYl9sYWJlbHMsXG4gICAgICB9LFxuICAgICAgc3BlYzogc3BlYyxcbiAgICB9KTtcbiAgfVxufVxuIl19
package/lib/plone.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import * as kplus from 'cdk8s-plus-24';
2
+ import { Construct } from 'constructs';
3
+ export interface PloneBaseOptions {
4
+ readonly image?: string;
5
+ readonly imagePullPolicy?: string;
6
+ readonly replicas?: number;
7
+ readonly maxUnavailable?: number | string;
8
+ readonly minAvailable?: number | string;
9
+ readonly limitCpu?: number;
10
+ readonly limitMemory?: string;
11
+ readonly environment?: kplus.Env;
12
+ }
13
+ export interface PloneOptions {
14
+ readonly version?: string;
15
+ readonly backend?: PloneBaseOptions;
16
+ readonly frontend?: PloneBaseOptions;
17
+ readonly imagePullSecrets?: string[];
18
+ }
19
+ export declare class Plone extends Construct {
20
+ readonly backendServiceName: string;
21
+ readonly frontendServiceName: string;
22
+ constructor(scope: Construct, id: string, options?: PloneOptions);
23
+ }
package/lib/plone.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Plone = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdk8s_1 = require("cdk8s");
7
+ const kplus = require("cdk8s-plus-24");
8
+ const constructs_1 = require("constructs");
9
+ const deployment_1 = require("./deployment");
10
+ const k8s_1 = require("./imports/k8s");
11
+ const service_1 = require("./service");
12
+ class Plone extends constructs_1.Construct {
13
+ constructor(scope, id, options = {}) {
14
+ super(scope, id);
15
+ // ------------------------------------------------------------------------
16
+ // Backend
17
+ const backend = options.backend ?? {};
18
+ const backendPort = 8080;
19
+ const backendLabels = {
20
+ 'app.kubernetes.io/name': 'plone-backend',
21
+ 'app.kubernetes.io/component': 'backend',
22
+ 'app.kubernetes.io/version': options.version ?? 'undefined',
23
+ };
24
+ // Probing
25
+ const backendLivenessProbe = {
26
+ httpGet: {
27
+ path: '/',
28
+ port: k8s_1.IntOrString.fromNumber(backendPort),
29
+ },
30
+ initialDelaySeconds: 30,
31
+ timeoutSeconds: 1,
32
+ periodSeconds: 10,
33
+ successThreshold: 1,
34
+ failureThreshold: 3,
35
+ };
36
+ const backendReadinessProbe = {
37
+ httpGet: {
38
+ path: '/',
39
+ port: k8s_1.IntOrString.fromNumber(backendPort),
40
+ },
41
+ initialDelaySeconds: 10,
42
+ timeoutSeconds: 15,
43
+ periodSeconds: 10,
44
+ successThreshold: 1,
45
+ failureThreshold: 3,
46
+ };
47
+ // Deployment
48
+ const backendDeployment = new deployment_1.PloneDeployment(this, 'backend', {
49
+ labels: backendLabels,
50
+ image: {
51
+ image: backend.image ?? 'plone/plone-backend:latest',
52
+ imagePullSecrets: options.imagePullSecrets ?? [],
53
+ imagePullPolicy: backend.imagePullPolicy ?? 'IfNotPresent',
54
+ },
55
+ replicas: backend.replicas,
56
+ limitCpu: backend.limitCpu ?? 1,
57
+ limitMemory: backend.limitMemory ?? '512Mi',
58
+ pdb: {
59
+ maxUnavailable: backend.maxUnavailable ?? undefined,
60
+ minAvailable: backend.minAvailable ?? undefined,
61
+ },
62
+ port: backendPort,
63
+ environment: backend.environment,
64
+ livenessProbe: backendLivenessProbe,
65
+ readinessProbe: backendReadinessProbe,
66
+ });
67
+ // Service
68
+ const backendService = new service_1.PloneService(backendDeployment, 'service', {
69
+ labels: {
70
+ 'app.kubernetes.io/name': 'plone-backend-service',
71
+ 'app.kubernetes.io/component': 'service',
72
+ },
73
+ targetPort: backendPort,
74
+ selectorLabel: { app: cdk8s_1.Names.toLabelValue(backendDeployment) },
75
+ });
76
+ this.backendServiceName = backendService.name;
77
+ // ------------------------------------------------------------------------
78
+ // Frontend
79
+ const frontend = options.frontend ?? {};
80
+ const frontendPort = 3000;
81
+ const frontendLabels = {
82
+ 'app.kubernetes.io/name': 'plone-frontend',
83
+ 'app.kubernetes.io/component': 'frontend',
84
+ 'app.kubernetes.io/version': options.version ?? 'undefined',
85
+ };
86
+ // Probing
87
+ const frontendLivenessProbe = {
88
+ httpGet: {
89
+ path: '/',
90
+ port: k8s_1.IntOrString.fromNumber(frontendPort),
91
+ },
92
+ initialDelaySeconds: 30,
93
+ timeoutSeconds: 1,
94
+ periodSeconds: 10,
95
+ successThreshold: 1,
96
+ failureThreshold: 3,
97
+ };
98
+ const frontendReadinessProbe = {
99
+ httpGet: {
100
+ path: '/',
101
+ port: k8s_1.IntOrString.fromNumber(frontendPort),
102
+ },
103
+ initialDelaySeconds: 10,
104
+ timeoutSeconds: 15,
105
+ periodSeconds: 10,
106
+ successThreshold: 1,
107
+ failureThreshold: 3,
108
+ };
109
+ // Environment
110
+ var frontendEnvironment = frontend.environment ?? new kplus.Env([], {});
111
+ if (frontendEnvironment.variables.RAZZLE_INTERNAL_API_PATH === undefined) {
112
+ frontendEnvironment?.addVariable('RAZZLE_INTERNAL_API_PATH', kplus.EnvValue.fromValue(`http://${backendService.name}:80`));
113
+ }
114
+ // Deployment
115
+ const frontendDeployment = new deployment_1.PloneDeployment(this, 'frontend', {
116
+ labels: frontendLabels,
117
+ image: {
118
+ image: frontend.image ?? 'plone/plone-frontend:latest',
119
+ imagePullSecrets: options.imagePullSecrets ?? [],
120
+ imagePullPolicy: frontend.imagePullPolicy ?? 'IfNotPresent',
121
+ },
122
+ replicas: frontend.replicas,
123
+ limitCpu: frontend.limitCpu ?? 1,
124
+ limitMemory: frontend.limitMemory ?? '1Gi',
125
+ pdb: {
126
+ maxUnavailable: frontend.maxUnavailable ?? undefined,
127
+ minAvailable: frontend.minAvailable ?? undefined,
128
+ },
129
+ port: frontendPort,
130
+ environment: frontendEnvironment,
131
+ livenessProbe: frontendLivenessProbe,
132
+ readinessProbe: frontendReadinessProbe,
133
+ });
134
+ // Service
135
+ const frontendService = new service_1.PloneService(frontendDeployment, 'service', {
136
+ labels: {
137
+ 'app.kubernetes.io/name': 'plone-frontend-service',
138
+ 'app.kubernetes.io/component': 'service',
139
+ },
140
+ targetPort: frontendPort,
141
+ selectorLabel: { app: cdk8s_1.Names.toLabelValue(frontendDeployment) },
142
+ });
143
+ this.frontendServiceName = frontendService.name;
144
+ }
145
+ }
146
+ exports.Plone = Plone;
147
+ _a = JSII_RTTI_SYMBOL_1;
148
+ Plone[_a] = { fqn: "@bluedynamics/cdk8s-plone.Plone", version: "0.0.0" };
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGxvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBOEI7QUFDOUIsdUNBQXVDO0FBQ3ZDLDJDQUF1QztBQUN2Qyw2Q0FBK0M7QUFDL0MsdUNBQW1EO0FBQ25ELHVDQUF5QztBQW1CekMsTUFBYSxLQUFNLFNBQVEsc0JBQVM7SUFLbEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxVQUF3QixFQUFFO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsMkVBQTJFO1FBQzNFLFVBQVU7UUFDVixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDekIsTUFBTSxhQUFhLEdBQUc7WUFDcEIsd0JBQXdCLEVBQUUsZUFBZTtZQUN6Qyw2QkFBNkIsRUFBRSxTQUFTO1lBQ3hDLDJCQUEyQixFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksV0FBVztTQUM1RCxDQUFDO1FBRUYsVUFBVTtRQUNWLE1BQU0sb0JBQW9CLEdBQVU7WUFDbEMsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxHQUFHO2dCQUNULElBQUksRUFBRSxpQkFBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7YUFDMUM7WUFDRCxtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwQixDQUFDO1FBQ0YsTUFBTSxxQkFBcUIsR0FBVTtZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLGlCQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQzthQUMxQztZQUNELG1CQUFtQixFQUFFLEVBQUU7WUFD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QUFLLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7U0FDL0QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQzs7QUFqSkgsc0JBa0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmFtZXMgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgKiBhcyBrcGx1cyBmcm9tICdjZGs4cy1wbHVzLTI0JztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUGxvbmVEZXBsb3ltZW50IH0gZnJvbSAnLi9kZXBsb3ltZW50JztcbmltcG9ydCB7IFByb2JlLCBJbnRPclN0cmluZyB9IGZyb20gJy4vaW1wb3J0cy9rOHMnO1xuaW1wb3J0IHsgUGxvbmVTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBQbG9uZUJhc2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW1hZ2U/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlUHVsbFBvbGljeT86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVwbGljYXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFVuYXZhaWxhYmxlPzogbnVtYmVyIHwgc3RyaW5nO1xuICByZWFkb25seSBtaW5BdmFpbGFibGU/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbWl0Q3B1PzogbnVtYmVyO1xuICByZWFkb25seSBsaW1pdE1lbW9yeT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBrcGx1cy5FbnY7XG59XG5leHBvcnQgaW50ZXJmYWNlIFBsb25lT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJhY2tlbmQ/OiBQbG9uZUJhc2VPcHRpb25zO1xuICByZWFkb25seSBmcm9udGVuZD86IFBsb25lQmFzZU9wdGlvbnM7XG4gIHJlYWRvbmx5IGltYWdlUHVsbFNlY3JldHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBsb25lIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgYmFja2VuZFNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBmcm9udGVuZFNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgb3B0aW9uczogUGxvbmVPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQmFja2VuZFxuICAgIGNvbnN0IGJhY2tlbmQgPSBvcHRpb25zLmJhY2tlbmQgPz8ge307XG4gICAgY29uc3QgYmFja2VuZFBvcnQgPSA4MDgwO1xuICAgIGNvbnN0IGJhY2tlbmRMYWJlbHMgPSB7XG4gICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICdwbG9uZS1iYWNrZW5kJyxcbiAgICAgICdhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnQnOiAnYmFja2VuZCcsXG4gICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vdmVyc2lvbic6IG9wdGlvbnMudmVyc2lvbiA/PyAndW5kZWZpbmVkJyxcbiAgICB9O1xuXG4gICAgLy8gUHJvYmluZ1xuICAgIGNvbnN0IGJhY2tlbmRMaXZlbmVzc1Byb2JlOiBQcm9iZSA9IHtcbiAgICAgIGh0dHBHZXQ6IHtcbiAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICBwb3J0OiBJbnRPclN0cmluZy5mcm9tTnVtYmVyKGJhY2tlbmRQb3J0KSxcbiAgICAgIH0sXG4gICAgICBpbml0aWFsRGVsYXlTZWNvbmRzOiAzMCxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiAxLFxuICAgICAgcGVyaW9kU2Vjb25kczogMTAsXG4gICAgICBzdWNjZXNzVGhyZXNob2xkOiAxLFxuICAgICAgZmFpbHVyZVRocmVzaG9sZDogMyxcbiAgICB9O1xuICAgIGNvbnN0IGJhY2tlbmRSZWFkaW5lc3NQcm9iZTogUHJvYmUgPSB7XG4gICAgICBodHRwR2V0OiB7XG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgcG9ydDogSW50T3JTdHJpbmcuZnJvbU51bWJlcihiYWNrZW5kUG9ydCksXG4gICAgICB9LFxuICAgICAgaW5pdGlhbERlbGF5U2Vjb25kczogMTAsXG4gICAgICB0aW1lb3V0U2Vjb25kczogMTUsXG4gICAgICBwZXJpb2RTZWNvbmRzOiAxMCxcbiAgICAgIHN1Y2Nlc3NUaHJlc2hvbGQ6IDEsXG4gICAgICBmYWlsdXJlVGhyZXNob2xkOiAzLFxuICAgIH07XG5cbiAgICAvLyBEZXBsb3ltZW50XG4gICAgY29uc3QgYmFja2VuZERlcGxveW1lbnQgPSBuZXcgUGxvbmVEZXBsb3ltZW50KHRoaXMsICdiYWNrZW5kJywge1xuICAgICAgbGFiZWxzOiBiYWNrZW5kTGFiZWxzLFxuICAgICAgaW1hZ2U6IHtcbiAgICAgICAgaW1hZ2U6IGJhY2tlbmQuaW1hZ2UgPz8gJ3Bsb25lL3Bsb25lLWJhY2tlbmQ6bGF0ZXN0JyxcbiAgICAgICAgaW1hZ2VQdWxsU2VjcmV0czogb3B0aW9ucy5pbWFnZVB1bGxTZWNyZXRzID8/IFtdLFxuICAgICAgICBpbWFnZVB1bGxQb2xpY3k6IGJhY2tlbmQuaW1hZ2VQdWxsUG9saWN5ID8/ICdJZk5vdFByZXNlbnQnLFxuICAgICAgfSxcbiAgICAgIHJlcGxpY2FzOiBiYWNrZW5kLnJlcGxpY2FzLFxuICAgICAgbGltaXRDcHU6IGJhY2tlbmQubGltaXRDcHUgPz8gMSxcbiAgICAgIGxpbWl0TWVtb3J5OiBiYWNrZW5kLmxpbWl0TWVtb3J5ID8/ICc1MTJNaScsXG4gICAgICBwZGI6IHtcbiAgICAgICAgbWF4VW5hdmFpbGFibGU6IGJhY2tlbmQubWF4VW5hdmFpbGFibGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBtaW5BdmFpbGFibGU6IGJhY2tlbmQubWluQXZhaWxhYmxlID8/IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBwb3J0OiBiYWNrZW5kUG9ydCxcbiAgICAgIGVudmlyb25tZW50OiBiYWNrZW5kLmVudmlyb25tZW50LFxuICAgICAgbGl2ZW5lc3NQcm9iZTogYmFja2VuZExpdmVuZXNzUHJvYmUsXG4gICAgICByZWFkaW5lc3NQcm9iZTogYmFja2VuZFJlYWRpbmVzc1Byb2JlLFxuICAgIH0pO1xuXG4gICAgLy8gU2VydmljZVxuICAgIGNvbnN0IGJhY2tlbmRTZXJ2aWNlID0gbmV3IFBsb25lU2VydmljZShiYWNrZW5kRGVwbG95bWVudCwgJ3NlcnZpY2UnLCB7XG4gICAgICBsYWJlbHM6IHtcbiAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL25hbWUnOiAncGxvbmUtYmFja2VuZC1zZXJ2aWNlJyxcbiAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudCc6ICdzZXJ2aWNlJyxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRQb3J0OiBiYWNrZW5kUG9ydCxcbiAgICAgIHNlbGVjdG9yTGFiZWw6IHsgYXBwOiBOYW1lcy50b0xhYmVsVmFsdWUoYmFja2VuZERlcGxveW1lbnQpIH0sXG4gICAgfSk7XG4gICAgdGhpcy5iYWNrZW5kU2VydmljZU5hbWUgPSBiYWNrZW5kU2VydmljZS5uYW1lO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gRnJvbnRlbmRcbiAgICBjb25zdCBmcm9udGVuZCA9IG9wdGlvbnMuZnJvbnRlbmQgPz8ge307XG4gICAgY29uc3QgZnJvbnRlbmRQb3J0ID0gMzAwMDtcbiAgICBjb25zdCBmcm9udGVuZExhYmVscyA9IHtcbiAgICAgICdhcHAua3ViZXJuZXRlcy5pby9uYW1lJzogJ3Bsb25lLWZyb250ZW5kJyxcbiAgICAgICdhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnQnOiAnZnJvbnRlbmQnLFxuICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3ZlcnNpb24nOiBvcHRpb25zLnZlcnNpb24gPz8gJ3VuZGVmaW5lZCcsXG4gICAgfTtcblxuICAgIC8vIFByb2JpbmdcbiAgICBjb25zdCBmcm9udGVuZExpdmVuZXNzUHJvYmU6IFByb2JlID0ge1xuICAgICAgaHR0cEdldDoge1xuICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgIHBvcnQ6IEludE9yU3RyaW5nLmZyb21OdW1iZXIoZnJvbnRlbmRQb3J0KSxcbiAgICAgIH0sXG4gICAgICBpbml0aWFsRGVsYXlTZWNvbmRzOiAzMCxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiAxLFxuICAgICAgcGVyaW9kU2Vjb25kczogMTAsXG4gICAgICBzdWNjZXNzVGhyZXNob2xkOiAxLFxuICAgICAgZmFpbHVyZVRocmVzaG9sZDogMyxcbiAgICB9O1xuICAgIGNvbnN0IGZyb250ZW5kUmVhZGluZXNzUHJvYmU6IFByb2JlID0ge1xuICAgICAgaHR0cEdldDoge1xuICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgIHBvcnQ6IEludE9yU3RyaW5nLmZyb21OdW1iZXIoZnJvbnRlbmRQb3J0KSxcbiAgICAgIH0sXG4gICAgICBpbml0aWFsRGVsYXlTZWNvbmRzOiAxMCxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiAxNSxcbiAgICAgIHBlcmlvZFNlY29uZHM6IDEwLFxuICAgICAgc3VjY2Vzc1RocmVzaG9sZDogMSxcbiAgICAgIGZhaWx1cmVUaHJlc2hvbGQ6IDMsXG4gICAgfTtcblxuICAgIC8vIEVudmlyb25tZW50XG4gICAgdmFyIGZyb250ZW5kRW52aXJvbm1lbnQgPSBmcm9udGVuZC5lbnZpcm9ubWVudCA/PyBuZXcga3BsdXMuRW52KFtdLCB7fSk7XG4gICAgaWYgKGZyb250ZW5kRW52aXJvbm1lbnQudmFyaWFibGVzLlJBWlpMRV9JTlRFUk5BTF9BUElfUEFUSCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcm9udGVuZEVudmlyb25tZW50Py5hZGRWYXJpYWJsZSgnUkFaWkxFX0lOVEVSTkFMX0FQSV9QQVRIJywga3BsdXMuRW52VmFsdWUuZnJvbVZhbHVlKGBodHRwOi8vJHtiYWNrZW5kU2VydmljZS5uYW1lfTo4MGApKTtcbiAgICB9XG5cbiAgICAvLyBEZXBsb3ltZW50XG4gICAgY29uc3QgZnJvbnRlbmREZXBsb3ltZW50ID0gbmV3IFBsb25lRGVwbG95bWVudCh0aGlzLCAnZnJvbnRlbmQnLCB7XG4gICAgICBsYWJlbHM6IGZyb250ZW5kTGFiZWxzLFxuICAgICAgaW1hZ2U6IHtcbiAgICAgICAgaW1hZ2U6IGZyb250ZW5kLmltYWdlID8/ICdwbG9uZS9wbG9uZS1mcm9udGVuZDpsYXRlc3QnLFxuICAgICAgICBpbWFnZVB1bGxTZWNyZXRzOiBvcHRpb25zLmltYWdlUHVsbFNlY3JldHMgPz8gW10sXG4gICAgICAgIGltYWdlUHVsbFBvbGljeTogZnJvbnRlbmQuaW1hZ2VQdWxsUG9saWN5ID8/ICdJZk5vdFByZXNlbnQnLFxuICAgICAgfSxcbiAgICAgIHJlcGxpY2FzOiBmcm9udGVuZC5yZXBsaWNhcyxcbiAgICAgIGxpbWl0Q3B1OiBmcm9udGVuZC5saW1pdENwdSA/PyAxLFxuICAgICAgbGltaXRNZW1vcnk6IGZyb250ZW5kLmxpbWl0TWVtb3J5ID8/ICcxR2knLFxuICAgICAgcGRiOiB7XG4gICAgICAgIG1heFVuYXZhaWxhYmxlOiBmcm9udGVuZC5tYXhVbmF2YWlsYWJsZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIG1pbkF2YWlsYWJsZTogZnJvbnRlbmQubWluQXZhaWxhYmxlID8/IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBwb3J0OiBmcm9udGVuZFBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogZnJvbnRlbmRFbnZpcm9ubWVudCxcbiAgICAgIGxpdmVuZXNzUHJvYmU6IGZyb250ZW5kTGl2ZW5lc3NQcm9iZSxcbiAgICAgIHJlYWRpbmVzc1Byb2JlOiBmcm9udGVuZFJlYWRpbmVzc1Byb2JlLFxuICAgIH0pO1xuXG4gICAgLy8gU2VydmljZVxuICAgIGNvbnN0IGZyb250ZW5kU2VydmljZSA9IG5ldyBQbG9uZVNlcnZpY2UoZnJvbnRlbmREZXBsb3ltZW50LCAnc2VydmljZScsIHtcbiAgICAgIGxhYmVsczoge1xuICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICdwbG9uZS1mcm9udGVuZC1zZXJ2aWNlJyxcbiAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudCc6ICdzZXJ2aWNlJyxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRQb3J0OiBmcm9udGVuZFBvcnQsXG4gICAgICBzZWxlY3RvckxhYmVsOiB7IGFwcDogTmFtZXMudG9MYWJlbFZhbHVlKGZyb250ZW5kRGVwbG95bWVudCkgfSxcbiAgICB9KTtcbiAgICB0aGlzLmZyb250ZW5kU2VydmljZU5hbWUgPSBmcm9udGVuZFNlcnZpY2UubmFtZTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,24 @@
1
+ import { Construct } from 'constructs';
2
+ export interface PloneServiceOptions {
3
+ /**
4
+ * targetPort number.
5
+ */
6
+ readonly targetPort: number;
7
+ /**
8
+ * Selector label.
9
+ */
10
+ readonly selectorLabel: {
11
+ [name: string]: string;
12
+ };
13
+ /**
14
+ * Extra labels to associate with resources.
15
+ * @default - none
16
+ */
17
+ readonly labels?: {
18
+ [name: string]: string;
19
+ };
20
+ }
21
+ export declare class PloneService extends Construct {
22
+ name: string;
23
+ constructor(scope: Construct, id: string, options: PloneServiceOptions);
24
+ }
package/lib/service.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PloneService = void 0;
4
+ // eslint-disable-next-line import/no-extraneous-dependencies
5
+ const constructs_1 = require("constructs");
6
+ const k8s = require("./imports/k8s");
7
+ class PloneService extends constructs_1.Construct {
8
+ constructor(scope, id, options) {
9
+ super(scope, id);
10
+ const targetPort = k8s.IntOrString.fromNumber(options.targetPort);
11
+ const selectorLabel = options.selectorLabel;
12
+ const service_labels = {
13
+ ...options.labels ?? {},
14
+ 'app.kubernetes.io/part-of': 'plone',
15
+ 'app.kubernetes.io/managed-by': 'cdk8s-plone',
16
+ };
17
+ const serviceOpts = {
18
+ metadata: {
19
+ labels: service_labels,
20
+ },
21
+ spec: {
22
+ ports: [{ port: options.targetPort, targetPort: targetPort, name: 'backend-http' }],
23
+ selector: selectorLabel,
24
+ },
25
+ };
26
+ const service = new k8s.KubeService(this, 'service', serviceOpts);
27
+ this.name = service.name;
28
+ }
29
+ }
30
+ exports.PloneService = PloneService;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUE2RDtBQUM3RCwyQ0FBdUM7QUFDdkMscUNBQXFDO0FBcUJyQyxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUl6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE9BQTRCO1FBQ3BFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUU7WUFDdkIsMkJBQTJCLEVBQUUsT0FBTztZQUNwQyw4QkFBOEIsRUFBRSxhQUFhO1NBQzlDLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBeUI7WUFDeEMsUUFBUSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxjQUFjO2FBQ3ZCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQ25GLFFBQVEsRUFBRSxhQUFhO2FBQ3hCO1NBQ0YsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUEzQkQsb0NBMkJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxvbmVTZXJ2aWNlT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIHRhcmdldFBvcnQgbnVtYmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RvciBsYWJlbC5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdG9yTGFiZWw6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYSBsYWJlbHMgdG8gYXNzb2NpYXRlIHdpdGggcmVzb3VyY2VzLlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVscz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgY2xhc3MgUGxvbmVTZXJ2aWNlIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFBsb25lU2VydmljZU9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdGFyZ2V0UG9ydCA9IGs4cy5JbnRPclN0cmluZy5mcm9tTnVtYmVyKG9wdGlvbnMudGFyZ2V0UG9ydCk7XG4gICAgY29uc3Qgc2VsZWN0b3JMYWJlbCA9IG9wdGlvbnMuc2VsZWN0b3JMYWJlbDtcbiAgICBjb25zdCBzZXJ2aWNlX2xhYmVscyA9IHtcbiAgICAgIC4uLm9wdGlvbnMubGFiZWxzID8/IHt9LFxuICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3BhcnQtb2YnOiAncGxvbmUnLFxuICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnknOiAnY2RrOHMtcGxvbmUnLFxuICAgIH07XG5cbiAgICBjb25zdCBzZXJ2aWNlT3B0czogazhzLkt1YmVTZXJ2aWNlUHJvcHMgPSB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYWJlbHM6IHNlcnZpY2VfbGFiZWxzLFxuICAgICAgfSxcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgcG9ydHM6IFt7IHBvcnQ6IG9wdGlvbnMudGFyZ2V0UG9ydCwgdGFyZ2V0UG9ydDogdGFyZ2V0UG9ydCwgbmFtZTogJ2JhY2tlbmQtaHR0cCcgfV0sXG4gICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvckxhYmVsLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgazhzLkt1YmVTZXJ2aWNlKHRoaXMsICdzZXJ2aWNlJywgc2VydmljZU9wdHMpO1xuICAgIHRoaXMubmFtZSA9IHNlcnZpY2UubmFtZTtcbiAgfVxufVxuIl19
package/package.json ADDED
@@ -0,0 +1,140 @@
1
+ {
2
+ "name": "@bluedynamics/cdk8s-plone",
3
+ "description": "Provides a CMS Plone Backend and Frontend for Kubernetes with cdk8s",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/bluedynamics/cdk8s-plone.git"
7
+ },
8
+ "scripts": {
9
+ "build": "npx projen build",
10
+ "bump": "npx projen bump",
11
+ "clobber": "npx projen clobber",
12
+ "compat": "npx projen compat",
13
+ "compile": "npx projen compile",
14
+ "default": "npx projen default",
15
+ "docgen": "npx projen docgen",
16
+ "eject": "npx projen eject",
17
+ "eslint": "npx projen eslint",
18
+ "package": "npx projen package",
19
+ "package-all": "npx projen package-all",
20
+ "package:js": "npx projen package:js",
21
+ "package:python": "npx projen package:python",
22
+ "post-compile": "npx projen post-compile",
23
+ "post-upgrade": "npx projen post-upgrade",
24
+ "pre-compile": "npx projen pre-compile",
25
+ "release": "npx projen release",
26
+ "test": "npx projen test",
27
+ "test:watch": "npx projen test:watch",
28
+ "unbump": "npx projen unbump",
29
+ "upgrade": "npx projen upgrade",
30
+ "watch": "npx projen watch",
31
+ "projen": "npx projen"
32
+ },
33
+ "author": {
34
+ "name": "Jens W. Klein",
35
+ "email": "jk@kleinundpartner.at",
36
+ "organization": false
37
+ },
38
+ "devDependencies": {
39
+ "@types/jest": "^29.5.12",
40
+ "@types/node": "^18",
41
+ "@typescript-eslint/eslint-plugin": "^7",
42
+ "@typescript-eslint/parser": "^7",
43
+ "cdk8s": "^2.68.87",
44
+ "cdk8s-plus-24": "^2.12.1",
45
+ "constructs": "^10.0.0",
46
+ "eslint": "^8",
47
+ "eslint-import-resolver-typescript": "^3.6.1",
48
+ "eslint-plugin-import": "^2.29.1",
49
+ "jest": "^29.7.0",
50
+ "jest-junit": "^15",
51
+ "jsii": "~5.4.0",
52
+ "jsii-diff": "^1.101.0",
53
+ "jsii-docgen": "^10.4.19",
54
+ "jsii-pacmak": "^1.101.0",
55
+ "jsii-rosetta": "~5.4.0",
56
+ "projen": "^0.84.9",
57
+ "standard-version": "^9",
58
+ "ts-jest": "^29.2.3",
59
+ "ts-node": "^10.9.2",
60
+ "typescript": "^5.5.4",
61
+ "yaml": "^2.5.0"
62
+ },
63
+ "peerDependencies": {
64
+ "cdk8s": "^2.68.87",
65
+ "cdk8s-plus-24": "^2.12.1",
66
+ "constructs": "^10.3.0"
67
+ },
68
+ "dependencies": {
69
+ "cdk8s": "^2.68.87",
70
+ "cdk8s-plus-24": "^2.12.1",
71
+ "constructs": "^10.3.0"
72
+ },
73
+ "main": "lib/index.js",
74
+ "license": "Apache-2.0",
75
+ "publishConfig": {
76
+ "access": "public"
77
+ },
78
+ "version": "0.0.0",
79
+ "jest": {
80
+ "coverageProvider": "v8",
81
+ "testMatch": [
82
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
83
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
84
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
85
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
86
+ ],
87
+ "clearMocks": true,
88
+ "collectCoverage": true,
89
+ "coverageReporters": [
90
+ "json",
91
+ "lcov",
92
+ "clover",
93
+ "cobertura",
94
+ "text"
95
+ ],
96
+ "coverageDirectory": "coverage",
97
+ "coveragePathIgnorePatterns": [
98
+ "/node_modules/"
99
+ ],
100
+ "testPathIgnorePatterns": [
101
+ "/node_modules/"
102
+ ],
103
+ "watchPathIgnorePatterns": [
104
+ "/node_modules/"
105
+ ],
106
+ "reporters": [
107
+ "default",
108
+ [
109
+ "jest-junit",
110
+ {
111
+ "outputDirectory": "test-reports"
112
+ }
113
+ ]
114
+ ],
115
+ "transform": {
116
+ "^.+\\.[t]sx?$": [
117
+ "ts-jest",
118
+ {
119
+ "tsconfig": "tsconfig.dev.json"
120
+ }
121
+ ]
122
+ }
123
+ },
124
+ "types": "lib/index.d.ts",
125
+ "stability": "stable",
126
+ "jsii": {
127
+ "outdir": "dist",
128
+ "targets": {
129
+ "python": {
130
+ "distName": "cdk8s-plone",
131
+ "module": "cdk8s_plone"
132
+ }
133
+ },
134
+ "tsc": {
135
+ "outDir": "lib",
136
+ "rootDir": "src"
137
+ }
138
+ },
139
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
140
+ }