@ask-ell/k8s 0.0.5 → 0.0.7
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/.spec.swcrc +22 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/eslint.config.mjs +22 -0
- package/jest.config.ts +21 -0
- package/package.json +4 -3
- package/project.json +29 -0
- package/src/index.ts +3 -0
- package/src/{k8s.cluster.interface.d.ts → k8s.cluster.interface.ts} +2 -2
- package/src/k8s.cluster.ts +256 -0
- package/src/k8s.config.ts +13 -0
- package/src/middlewares/merge-patch.middleware.ts +10 -0
- package/src/{types.d.ts → types.ts} +28 -8
- package/src/utils.ts +18 -0
- package/tsconfig.json +13 -0
- package/tsconfig.lib.json +17 -0
- package/tsconfig.spec.json +21 -0
- package/src/index.d.ts +0 -4
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -6
- package/src/k8s.cluster.d.ts +0 -36
- package/src/k8s.cluster.d.ts.map +0 -1
- package/src/k8s.cluster.interface.d.ts.map +0 -1
- package/src/k8s.cluster.interface.js +0 -2
- package/src/k8s.cluster.js +0 -157
- package/src/k8s.config.d.ts +0 -4
- package/src/k8s.config.d.ts.map +0 -1
- package/src/k8s.config.js +0 -14
- package/src/types.d.ts.map +0 -1
- package/src/types.js +0 -2
- package/src/utils.d.ts +0 -3
- package/src/utils.d.ts.map +0 -1
- package/src/utils.js +0 -7
package/.spec.swcrc
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsc": {
|
|
3
|
+
"target": "es2017",
|
|
4
|
+
"parser": {
|
|
5
|
+
"syntax": "typescript",
|
|
6
|
+
"decorators": true,
|
|
7
|
+
"dynamicImport": true
|
|
8
|
+
},
|
|
9
|
+
"transform": {
|
|
10
|
+
"decoratorMetadata": true,
|
|
11
|
+
"legacyDecorator": true
|
|
12
|
+
},
|
|
13
|
+
"keepClassNames": true,
|
|
14
|
+
"externalHelpers": true,
|
|
15
|
+
"loose": true
|
|
16
|
+
},
|
|
17
|
+
"module": {
|
|
18
|
+
"type": "es6"
|
|
19
|
+
},
|
|
20
|
+
"sourceMaps": true,
|
|
21
|
+
"exclude": []
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"5.9.3"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import baseConfig from '../../eslint.config.mjs';
|
|
2
|
+
|
|
3
|
+
export default [
|
|
4
|
+
...baseConfig,
|
|
5
|
+
{
|
|
6
|
+
files: ['**/*.json'],
|
|
7
|
+
rules: {
|
|
8
|
+
'@nx/dependency-checks': [
|
|
9
|
+
'error',
|
|
10
|
+
{
|
|
11
|
+
ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
languageOptions: {
|
|
16
|
+
parser: await import('jsonc-eslint-parser'),
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
ignores: ['**/out-tsc'],
|
|
21
|
+
},
|
|
22
|
+
];
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
|
|
4
|
+
// Reading the SWC compilation config for the spec files
|
|
5
|
+
const swcJestConfig = JSON.parse(
|
|
6
|
+
readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
// Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves
|
|
10
|
+
swcJestConfig.swcrc = false;
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
displayName: '@ask-ell/k8s',
|
|
14
|
+
preset: '../../jest.preset.js',
|
|
15
|
+
testEnvironment: 'node',
|
|
16
|
+
transform: {
|
|
17
|
+
'^.+\\.[tj]s$': ['@swc/jest', swcJestConfig],
|
|
18
|
+
},
|
|
19
|
+
moduleFileExtensions: ['ts', 'js', 'html'],
|
|
20
|
+
coverageDirectory: 'test-output/jest/coverage',
|
|
21
|
+
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ask-ell/k8s",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./src/index.js",
|
|
7
7
|
"types": "./src/index.d.ts",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@
|
|
10
|
-
"@
|
|
9
|
+
"@ask-ell/core": "*",
|
|
10
|
+
"@kubernetes/client-node": "*",
|
|
11
|
+
"tslib": "*"
|
|
11
12
|
}
|
|
12
13
|
}
|
package/project.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "k8s",
|
|
3
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "packages/k8s/src",
|
|
5
|
+
"projectType": "library",
|
|
6
|
+
"tags": [],
|
|
7
|
+
"targets": {
|
|
8
|
+
"build": {
|
|
9
|
+
"executor": "@nx/js:tsc",
|
|
10
|
+
"dependsOn": ["^build"],
|
|
11
|
+
"outputs": [
|
|
12
|
+
"{options.outputPath}"
|
|
13
|
+
],
|
|
14
|
+
"options": {
|
|
15
|
+
"outputPath": "dist/packages/k8s",
|
|
16
|
+
"main": "packages/k8s/src/index.ts",
|
|
17
|
+
"tsConfig": "packages/k8s/tsconfig.lib.json",
|
|
18
|
+
"assets": [
|
|
19
|
+
"packages/k8s/*.md"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"test": {
|
|
24
|
+
"options": {
|
|
25
|
+
"passWithNoTests": true
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/index.ts
ADDED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PersistClusterCustomObjectDTO, K8SSecret, K8SService, K8SCustomResource, DeleteClusterCustomObjectDTO, K8SCustomResourceDefinition, K8SNamespace, CreateDeploymentDTO, CreateServiceDTO, DeleteComponentDTO, K8SDeployment, K8SServiceAccount, CreateServiceAccountDTO, CreateServiceAccountTokenDTO, GetRolesDTO, K8SRole, CreateRoleDTO, K8SRoleBinding, GetRoleBindingsDTO, CreateRoleBindingDTO } from "./types";
|
|
2
|
+
|
|
2
3
|
export interface IK8SCluster {
|
|
3
4
|
getAllNamespaces(): Promise<K8SNamespace[]>;
|
|
4
5
|
isNamespacePersisted(name: string): Promise<boolean>;
|
|
@@ -24,5 +25,4 @@ export interface IK8SCluster {
|
|
|
24
25
|
createClusterCustomObject<CustomResource extends K8SCustomResource>(dto: PersistClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
25
26
|
patchClusterCustomObject<CustomResource extends K8SCustomResource>(dto: PersistClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
26
27
|
deleteClusterCustomObject<CustomResource extends K8SCustomResource>(dto: DeleteClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=k8s.cluster.interface.d.ts.map
|
|
28
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { ILogger } from "@ask-ell/core";
|
|
2
|
+
import { ApiextensionsV1Api, AppsV1Api, CoreV1Api, CustomObjectsApi, KubeConfig, RbacAuthorizationV1Api } from "@kubernetes/client-node";
|
|
3
|
+
|
|
4
|
+
import { K8SClusterParams, PersistClusterCustomObjectDTO, K8SSecret, K8SService, K8SCustomResource, DeleteClusterCustomObjectDTO, K8SCustomResourceDefinition, K8SNamespace, CreateDeploymentDTO, CreateServiceDTO, DeleteComponentDTO, K8SDeployment, K8SServiceAccount, CreateServiceAccountDTO, CreateServiceAccountTokenDTO, GetRolesDTO, K8SRole, CreateRoleDTO, K8SRoleBinding, GetRoleBindingsDTO, CreateRoleBindingDTO } from "./types";
|
|
5
|
+
import { getK8SConfig } from "./k8s.config";
|
|
6
|
+
import { IK8SCluster } from "./k8s.cluster.interface";
|
|
7
|
+
import { getItems, getVersionName } from "./utils";
|
|
8
|
+
import { MERGE_PATCH_MIDDLEWARE } from "./middlewares/merge-patch.middleware";
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export class K8SCluster implements IK8SCluster {
|
|
12
|
+
private logger: ILogger;
|
|
13
|
+
private coreV1Api: CoreV1Api;
|
|
14
|
+
private appsV1Api: AppsV1Api;
|
|
15
|
+
private customObjectsApi: CustomObjectsApi;
|
|
16
|
+
private apiextensionsV1Api: ApiextensionsV1Api;
|
|
17
|
+
private rbacAuthorizationV1Api: RbacAuthorizationV1Api;
|
|
18
|
+
|
|
19
|
+
constructor({
|
|
20
|
+
configFilePath,
|
|
21
|
+
logger
|
|
22
|
+
}: K8SClusterParams) {
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
const config: KubeConfig = getK8SConfig(configFilePath);
|
|
25
|
+
this.coreV1Api = config.makeApiClient(CoreV1Api);
|
|
26
|
+
this.appsV1Api = config.makeApiClient(AppsV1Api);
|
|
27
|
+
this.customObjectsApi = config.makeApiClient(CustomObjectsApi);
|
|
28
|
+
this.apiextensionsV1Api = config.makeApiClient(ApiextensionsV1Api);
|
|
29
|
+
this.rbacAuthorizationV1Api = config.makeApiClient(RbacAuthorizationV1Api);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
getAllNamespaces(): Promise<K8SNamespace[]> {
|
|
33
|
+
return getItems(this.coreV1Api.listNamespace());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async isNamespacePersisted(name: string): Promise<boolean> {
|
|
37
|
+
const allNamespaces: K8SNamespace[] = await this.getAllNamespaces();
|
|
38
|
+
return allNamespaces.some((namespace: K8SNamespace): boolean => namespace.metadata?.name === name);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async createNamespace(name: string): Promise<void> {
|
|
42
|
+
await this.coreV1Api.createNamespace({
|
|
43
|
+
body: {
|
|
44
|
+
apiVersion: 'v1',
|
|
45
|
+
kind: 'Namespace',
|
|
46
|
+
metadata: {
|
|
47
|
+
name
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async deleteNamespace(namespace: string): Promise<void> {
|
|
54
|
+
await this.coreV1Api.deleteNamespace({ name: namespace });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
getDeploymentsFromNamespace(namespace: string): Promise<K8SDeployment[]> {
|
|
58
|
+
return getItems(this.appsV1Api.listNamespacedDeployment({ namespace }));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async createDeployment({ namespace, dto }: CreateDeploymentDTO): Promise<void> {
|
|
62
|
+
await this.appsV1Api.createNamespacedDeployment({ namespace, body: dto });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async deleteDeployment({ name, namespace }: DeleteComponentDTO): Promise<void> {
|
|
66
|
+
await this.appsV1Api.deleteNamespacedDeployment({ name, namespace })
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
getServicesFromNamespace(namespace: string): Promise<K8SService[]> {
|
|
70
|
+
return getItems(this.coreV1Api.listNamespacedService({ namespace }));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async getServiceAccountsFromNamespace(namespace: string): Promise<K8SServiceAccount[]> {
|
|
74
|
+
return getItems(this.coreV1Api.listNamespacedServiceAccount({ namespace }));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async createServiceAccount({ name, namespace }: CreateServiceAccountDTO): Promise<void> {
|
|
78
|
+
await this.coreV1Api.createNamespacedServiceAccount({
|
|
79
|
+
namespace,
|
|
80
|
+
body: {
|
|
81
|
+
apiVersion: 'v1',
|
|
82
|
+
kind: 'ServiceAccount',
|
|
83
|
+
metadata: {
|
|
84
|
+
name,
|
|
85
|
+
namespace
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async createServiceAccountToken({ namespace, name }: CreateServiceAccountTokenDTO): Promise<void> {
|
|
92
|
+
await this.coreV1Api.createNamespacedSecret({
|
|
93
|
+
namespace,
|
|
94
|
+
body: {
|
|
95
|
+
apiVersion: 'v1',
|
|
96
|
+
kind: 'Secret',
|
|
97
|
+
metadata: {
|
|
98
|
+
annotations: {
|
|
99
|
+
'kubernetes.io/service-account.name': namespace
|
|
100
|
+
},
|
|
101
|
+
name,
|
|
102
|
+
namespace
|
|
103
|
+
},
|
|
104
|
+
type: 'kubernetes.io/service-account-token'
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async createService({ namespace, dto }: CreateServiceDTO): Promise<void> {
|
|
110
|
+
await this.coreV1Api.createNamespacedService({ namespace, body: dto });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async deleteService({ name, namespace }: DeleteComponentDTO): Promise<void> {
|
|
114
|
+
await this.coreV1Api.deleteNamespacedService({ name, namespace });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
getSecretsFromNamespace(namespace: string): Promise<K8SSecret[]> {
|
|
118
|
+
return getItems(this.coreV1Api.listNamespacedSecret({ namespace }));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async getRoles({ namespace }: GetRolesDTO): Promise<K8SRole[]> {
|
|
122
|
+
return getItems(this.rbacAuthorizationV1Api.listNamespacedRole({ namespace }));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async createRole({ metadata: { name, namespace }, rules }: CreateRoleDTO): Promise<void> {
|
|
126
|
+
await this.rbacAuthorizationV1Api.createNamespacedRole({
|
|
127
|
+
namespace,
|
|
128
|
+
body: {
|
|
129
|
+
apiVersion: 'rbac.authorization.k8s.io/v1',
|
|
130
|
+
kind: 'Role',
|
|
131
|
+
metadata: {
|
|
132
|
+
name,
|
|
133
|
+
namespace
|
|
134
|
+
},
|
|
135
|
+
rules
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async getRoleBindings({ namespace }: GetRoleBindingsDTO): Promise<K8SRoleBinding[]> {
|
|
141
|
+
return getItems(this.rbacAuthorizationV1Api.listNamespacedRoleBinding({ namespace }));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async createRoleBinding({ name, namespace, subjects }: CreateRoleBindingDTO): Promise<void> {
|
|
145
|
+
await this.rbacAuthorizationV1Api.createNamespacedRoleBinding({
|
|
146
|
+
namespace,
|
|
147
|
+
body: {
|
|
148
|
+
apiVersion: 'rbac.authorization.k8s.io/v1',
|
|
149
|
+
kind: 'RoleBinding',
|
|
150
|
+
metadata: {
|
|
151
|
+
name,
|
|
152
|
+
namespace
|
|
153
|
+
},
|
|
154
|
+
roleRef: {
|
|
155
|
+
apiGroup: 'rbac.authorization.k8s.io',
|
|
156
|
+
kind: 'Role',
|
|
157
|
+
name
|
|
158
|
+
},
|
|
159
|
+
subjects
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async getAllCustomResourceDefinitions(): Promise<K8SCustomResourceDefinition[]> {
|
|
165
|
+
return getItems(this.apiextensionsV1Api.listCustomResourceDefinition());
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async createCustomResourceDefinition(body: K8SCustomResourceDefinition): Promise<void> {
|
|
169
|
+
await this.apiextensionsV1Api.createCustomResourceDefinition({ body }).catch(this.logger.error);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async getAllClusterCustomObjectsFromResourceDefinition<CustomResource extends K8SCustomResource>({
|
|
173
|
+
spec: { group, names: { plural }, versions }
|
|
174
|
+
}: K8SCustomResourceDefinition): Promise<CustomResource[]> {
|
|
175
|
+
const versionName: string = getVersionName(versions[0]);
|
|
176
|
+
const result: any = await this.customObjectsApi.listClusterCustomObject({
|
|
177
|
+
group,
|
|
178
|
+
plural,
|
|
179
|
+
version: versionName,
|
|
180
|
+
});
|
|
181
|
+
return result['items'];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
async createClusterCustomObject<CustomResource extends K8SCustomResource>({
|
|
185
|
+
resourceDefinition: {
|
|
186
|
+
spec: {
|
|
187
|
+
group,
|
|
188
|
+
versions,
|
|
189
|
+
names: {
|
|
190
|
+
plural,
|
|
191
|
+
kind
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
metadata,
|
|
196
|
+
spec
|
|
197
|
+
}: PersistClusterCustomObjectDTO<CustomResource>): Promise<void> {
|
|
198
|
+
const versionName: string = getVersionName(versions[0]);
|
|
199
|
+
const apiVersion = `${group}/${versionName}`;
|
|
200
|
+
|
|
201
|
+
await this.customObjectsApi.createClusterCustomObject({
|
|
202
|
+
group,
|
|
203
|
+
plural,
|
|
204
|
+
version: versionName,
|
|
205
|
+
body: {
|
|
206
|
+
apiVersion,
|
|
207
|
+
kind,
|
|
208
|
+
metadata,
|
|
209
|
+
spec
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async patchClusterCustomObject<CustomResource extends K8SCustomResource>({
|
|
215
|
+
resourceDefinition: {
|
|
216
|
+
spec: {
|
|
217
|
+
group,
|
|
218
|
+
versions,
|
|
219
|
+
names: {
|
|
220
|
+
plural,
|
|
221
|
+
kind
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
metadata,
|
|
226
|
+
spec
|
|
227
|
+
}: PersistClusterCustomObjectDTO<CustomResource>): Promise<void> {
|
|
228
|
+
const versionName: string = getVersionName(versions[0]);
|
|
229
|
+
const apiVersion = `${group}/${versionName}`;
|
|
230
|
+
|
|
231
|
+
await this.customObjectsApi.patchClusterCustomObject({
|
|
232
|
+
name: metadata.name,
|
|
233
|
+
group,
|
|
234
|
+
plural,
|
|
235
|
+
version: versionName,
|
|
236
|
+
body: {
|
|
237
|
+
apiVersion,
|
|
238
|
+
kind,
|
|
239
|
+
metadata,
|
|
240
|
+
spec
|
|
241
|
+
}
|
|
242
|
+
}, {
|
|
243
|
+
middleware: [MERGE_PATCH_MIDDLEWARE],
|
|
244
|
+
middlewareMergeStrategy: 'append'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async deleteClusterCustomObject<CustomResource extends K8SCustomResource>({ resourceDefinition, metadata }: DeleteClusterCustomObjectDTO<CustomResource>): Promise<void> {
|
|
249
|
+
await this.customObjectsApi.deleteClusterCustomObject({
|
|
250
|
+
group: resourceDefinition.spec.group,
|
|
251
|
+
version: resourceDefinition.spec.versions[0].name,
|
|
252
|
+
plural: resourceDefinition.spec.names.plural,
|
|
253
|
+
name: metadata.name
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { KubeConfig } from "@kubernetes/client-node";
|
|
2
|
+
import { MaybeUndefined } from "@ask-ell/core";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export function getK8SConfig(configFilePath: MaybeUndefined<string>): KubeConfig {
|
|
6
|
+
const config: KubeConfig = new KubeConfig();
|
|
7
|
+
if (configFilePath) {
|
|
8
|
+
config.loadFromFile(configFilePath);
|
|
9
|
+
} else {
|
|
10
|
+
config.loadFromDefault()
|
|
11
|
+
}
|
|
12
|
+
return config;
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Observable, ObservableMiddleware, RequestContext, ResponseContext } from "@kubernetes/client-node";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export const MERGE_PATCH_MIDDLEWARE: ObservableMiddleware = {
|
|
5
|
+
pre: (context: RequestContext): Observable<RequestContext> => {
|
|
6
|
+
context.setHeaderParam('Content-Type', 'application/merge-patch+json');
|
|
7
|
+
return new Observable(Promise.resolve(context));
|
|
8
|
+
},
|
|
9
|
+
post: (context: ResponseContext): Observable<ResponseContext> => new Observable(Promise.resolve(context))
|
|
10
|
+
};
|
|
@@ -1,43 +1,58 @@
|
|
|
1
1
|
import { ILogger, MaybeUndefined } from "@ask-ell/core";
|
|
2
2
|
import { RbacV1Subject, V1CustomResourceDefinition, V1Deployment, V1Namespace, V1PolicyRule, V1Role, V1RoleBinding, V1Secret, V1Service, V1ServiceAccount, V1ServicePort } from "@kubernetes/client-node";
|
|
3
|
+
|
|
3
4
|
export type K8SClusterParams = {
|
|
4
5
|
configFilePath: MaybeUndefined<string>;
|
|
5
6
|
logger: ILogger;
|
|
6
7
|
};
|
|
8
|
+
|
|
7
9
|
export type ComponentsFetchingResponse<Item> = {
|
|
8
|
-
|
|
9
|
-
items: Item[];
|
|
10
|
-
};
|
|
10
|
+
items: Item[];
|
|
11
11
|
};
|
|
12
|
+
|
|
12
13
|
type CreateComponentDTOWrapper<DTO> = {
|
|
13
14
|
namespace: string;
|
|
14
15
|
dto: DTO;
|
|
15
16
|
};
|
|
17
|
+
|
|
16
18
|
export type DeleteComponentDTO = {
|
|
17
19
|
namespace: string;
|
|
18
20
|
name: string;
|
|
19
21
|
};
|
|
22
|
+
|
|
20
23
|
export type K8SNamespace = V1Namespace;
|
|
24
|
+
|
|
21
25
|
export type K8SDeployment = V1Deployment;
|
|
26
|
+
|
|
22
27
|
export type CreateDeploymentDTO = CreateComponentDTOWrapper<K8SDeployment>;
|
|
28
|
+
|
|
23
29
|
export type K8SService = V1Service;
|
|
30
|
+
|
|
24
31
|
export type CreateServiceDTO = CreateComponentDTOWrapper<K8SService>;
|
|
32
|
+
|
|
25
33
|
export type K8SServicePort = V1ServicePort;
|
|
34
|
+
|
|
26
35
|
export type K8SServiceAccount = V1ServiceAccount;
|
|
36
|
+
|
|
27
37
|
export type CreateServiceAccountDTO = {
|
|
28
38
|
name: string;
|
|
29
39
|
namespace: string;
|
|
30
40
|
};
|
|
41
|
+
|
|
31
42
|
export type CreateServiceAccountTokenDTO = {
|
|
32
43
|
name: string;
|
|
33
44
|
namespace: string;
|
|
34
45
|
};
|
|
46
|
+
|
|
35
47
|
export type K8SSecret = V1Secret;
|
|
48
|
+
|
|
36
49
|
export type K8SRole = V1Role;
|
|
50
|
+
|
|
37
51
|
export type GetRolesDTO = {
|
|
38
52
|
name: string;
|
|
39
53
|
namespace: string;
|
|
40
54
|
};
|
|
55
|
+
|
|
41
56
|
export type CreateRoleDTO = {
|
|
42
57
|
metadata: {
|
|
43
58
|
name: string;
|
|
@@ -45,30 +60,35 @@ export type CreateRoleDTO = {
|
|
|
45
60
|
};
|
|
46
61
|
rules: V1PolicyRule[];
|
|
47
62
|
};
|
|
63
|
+
|
|
48
64
|
export type K8SRoleBinding = V1RoleBinding;
|
|
65
|
+
|
|
49
66
|
export type GetRoleBindingsDTO = {
|
|
50
67
|
name: string;
|
|
51
68
|
namespace: string;
|
|
52
69
|
};
|
|
70
|
+
|
|
53
71
|
export type CreateRoleBindingDTO = {
|
|
54
72
|
name: string;
|
|
55
73
|
namespace: string;
|
|
56
74
|
subjects: RbacV1Subject[];
|
|
57
|
-
}
|
|
75
|
+
}
|
|
76
|
+
|
|
58
77
|
export type K8SCustomResourceDefinition = V1CustomResourceDefinition;
|
|
78
|
+
|
|
59
79
|
export type K8SCustomResource<Spec = any> = {
|
|
60
80
|
apiVersion: string;
|
|
61
81
|
kind: string;
|
|
62
82
|
metadata: {
|
|
63
83
|
name: string;
|
|
64
|
-
}
|
|
84
|
+
},
|
|
65
85
|
spec: Spec;
|
|
66
86
|
};
|
|
87
|
+
|
|
67
88
|
export type PersistClusterCustomObjectDTO<CustomResource extends K8SCustomResource> = {
|
|
68
89
|
resourceDefinition: K8SCustomResourceDefinition;
|
|
69
90
|
metadata: CustomResource['metadata'];
|
|
70
91
|
spec: CustomResource['spec'];
|
|
71
92
|
};
|
|
72
|
-
|
|
73
|
-
export
|
|
74
|
-
//# sourceMappingURL=types.d.ts.map
|
|
93
|
+
|
|
94
|
+
export type DeleteClusterCustomObjectDTO<CustomResource extends K8SCustomResource> = Omit<PersistClusterCustomObjectDTO<CustomResource>, 'spec'>;
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MaybeUndefined } from "@ask-ell/core";
|
|
2
|
+
import { V1CustomResourceDefinitionVersion } from "@kubernetes/client-node";
|
|
3
|
+
|
|
4
|
+
import { ComponentsFetchingResponse } from "./types";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export async function getItems<T>(itemsFactory: Promise<ComponentsFetchingResponse<T>>): Promise<T[]> {
|
|
8
|
+
const { items } = await itemsFactory;
|
|
9
|
+
return items;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function getVersionName(version: V1CustomResourceDefinitionVersion): string {
|
|
13
|
+
const versionName: MaybeUndefined<string> = version?.name;
|
|
14
|
+
if(!versionName){
|
|
15
|
+
throw new Error('No version specified');
|
|
16
|
+
}
|
|
17
|
+
return versionName;
|
|
18
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"rootDir": "src",
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
|
|
8
|
+
"emitDeclarationOnly": false,
|
|
9
|
+
"module": "nodenext",
|
|
10
|
+
"moduleResolution": "nodenext",
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"types": ["node"]
|
|
13
|
+
},
|
|
14
|
+
"include": ["src/**/*.ts"],
|
|
15
|
+
"references": [],
|
|
16
|
+
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "./out-tsc/jest",
|
|
5
|
+
"types": ["jest", "node"],
|
|
6
|
+
"module": "nodenext",
|
|
7
|
+
"moduleResolution": "nodenext",
|
|
8
|
+
"forceConsistentCasingInFileNames": true
|
|
9
|
+
},
|
|
10
|
+
"include": [
|
|
11
|
+
"jest.config.ts",
|
|
12
|
+
"src/**/*.test.ts",
|
|
13
|
+
"src/**/*.spec.ts",
|
|
14
|
+
"src/**/*.d.ts"
|
|
15
|
+
],
|
|
16
|
+
"references": [
|
|
17
|
+
{
|
|
18
|
+
"path": "./tsconfig.lib.json"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
package/src/index.d.ts
DELETED
package/src/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAA;AACvC,cAAc,SAAS,CAAA"}
|
package/src/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
tslib_1.__exportStar(require("./k8s.cluster"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./k8s.cluster.interface"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./types"), exports);
|
package/src/k8s.cluster.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { K8SClusterParams, PersistClusterCustomObjectDTO, K8SSecret, K8SService, K8SCustomResource, DeleteClusterCustomObjectDTO, K8SCustomResourceDefinition, K8SNamespace, CreateDeploymentDTO, CreateServiceDTO, DeleteComponentDTO, K8SDeployment, K8SServiceAccount, CreateServiceAccountDTO, CreateServiceAccountTokenDTO, GetRolesDTO, K8SRole, CreateRoleDTO, K8SRoleBinding, GetRoleBindingsDTO, CreateRoleBindingDTO } from "./types";
|
|
2
|
-
import { IK8SCluster } from "./k8s.cluster.interface";
|
|
3
|
-
export declare class K8SCluster implements IK8SCluster {
|
|
4
|
-
private logger;
|
|
5
|
-
private coreV1Api;
|
|
6
|
-
private appsV1Api;
|
|
7
|
-
private customObjectsApi;
|
|
8
|
-
private apiextensionsV1Api;
|
|
9
|
-
private rbacAuthorizationV1Api;
|
|
10
|
-
constructor({ configFilePath, logger }: K8SClusterParams);
|
|
11
|
-
getAllNamespaces(): Promise<K8SNamespace[]>;
|
|
12
|
-
isNamespacePersisted(name: string): Promise<boolean>;
|
|
13
|
-
createNamespace(name: string): Promise<void>;
|
|
14
|
-
deleteNamespace(namespace: string): Promise<void>;
|
|
15
|
-
getDeploymentsFromNamespace(namespace: string): Promise<K8SDeployment[]>;
|
|
16
|
-
createDeployment({ namespace, dto }: CreateDeploymentDTO): Promise<void>;
|
|
17
|
-
deleteDeployment({ name, namespace }: DeleteComponentDTO): Promise<void>;
|
|
18
|
-
getServicesFromNamespace(namespace: string): Promise<K8SService[]>;
|
|
19
|
-
getServiceAccountsFromNamespace(namespace: string): Promise<K8SServiceAccount[]>;
|
|
20
|
-
createServiceAccount({ name, namespace }: CreateServiceAccountDTO): Promise<void>;
|
|
21
|
-
createServiceAccountToken({ namespace, name }: CreateServiceAccountTokenDTO): Promise<void>;
|
|
22
|
-
createService({ namespace, dto }: CreateServiceDTO): Promise<void>;
|
|
23
|
-
deleteService({ name, namespace }: DeleteComponentDTO): Promise<void>;
|
|
24
|
-
getSecretsFromNamespace(namespace: string): Promise<K8SSecret[]>;
|
|
25
|
-
getRoles({ name, namespace }: GetRolesDTO): Promise<K8SRole[]>;
|
|
26
|
-
createRole({ metadata: { name, namespace }, rules }: CreateRoleDTO): Promise<void>;
|
|
27
|
-
getRoleBindings({ name, namespace }: GetRoleBindingsDTO): Promise<K8SRoleBinding[]>;
|
|
28
|
-
createRoleBinding({ name, namespace, subjects }: CreateRoleBindingDTO): Promise<void>;
|
|
29
|
-
getAllCustomResourceDefinitions(): Promise<K8SCustomResourceDefinition[]>;
|
|
30
|
-
createCustomResourceDefinition(dto: K8SCustomResourceDefinition): Promise<void>;
|
|
31
|
-
getAllClusterCustomObjectsFromResourceDefinition<CustomResource extends K8SCustomResource>(dto: K8SCustomResourceDefinition): Promise<CustomResource[]>;
|
|
32
|
-
createClusterCustomObject<CustomResource extends K8SCustomResource>({ resourceDefinition, metadata, spec }: PersistClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
33
|
-
patchClusterCustomObject<CustomResource extends K8SCustomResource>({ resourceDefinition, metadata, spec }: PersistClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
34
|
-
deleteClusterCustomObject<CustomResource extends K8SCustomResource>({ resourceDefinition, metadata }: DeleteClusterCustomObjectDTO<CustomResource>): Promise<void>;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=k8s.cluster.d.ts.map
|
package/src/k8s.cluster.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"k8s.cluster.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/k8s.cluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"k8s.cluster.interface.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/k8s.cluster.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE9Z,MAAM,WAAW,WAAW;IACxB,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACnE,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,aAAa,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACjF,oBAAoB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,yBAAyB,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACpE,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,+BAA+B,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC1E,8BAA8B,CAAC,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,gDAAgD,CAAC,cAAc,SAAS,iBAAiB,EAAE,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxJ,yBAAyB,CAAC,cAAc,SAAS,iBAAiB,EAAE,GAAG,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvI,wBAAwB,CAAC,cAAc,SAAS,iBAAiB,EAAE,GAAG,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtI,yBAAyB,CAAC,cAAc,SAAS,iBAAiB,EAAE,GAAG,EAAE,4BAA4B,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzI"}
|
package/src/k8s.cluster.js
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.K8SCluster = void 0;
|
|
4
|
-
const client_node_1 = require("@kubernetes/client-node");
|
|
5
|
-
const k8s_config_1 = require("./k8s.config");
|
|
6
|
-
const utils_1 = require("./utils");
|
|
7
|
-
class K8SCluster {
|
|
8
|
-
logger;
|
|
9
|
-
coreV1Api;
|
|
10
|
-
appsV1Api;
|
|
11
|
-
customObjectsApi;
|
|
12
|
-
apiextensionsV1Api;
|
|
13
|
-
rbacAuthorizationV1Api;
|
|
14
|
-
constructor({ configFilePath, logger }) {
|
|
15
|
-
this.logger = logger;
|
|
16
|
-
const config = (0, k8s_config_1.getK8SConfig)(configFilePath);
|
|
17
|
-
this.coreV1Api = config.makeApiClient(client_node_1.CoreV1Api);
|
|
18
|
-
this.appsV1Api = config.makeApiClient(client_node_1.AppsV1Api);
|
|
19
|
-
this.customObjectsApi = config.makeApiClient(client_node_1.CustomObjectsApi);
|
|
20
|
-
this.apiextensionsV1Api = config.makeApiClient(client_node_1.ApiextensionsV1Api);
|
|
21
|
-
this.rbacAuthorizationV1Api = config.makeApiClient(client_node_1.RbacAuthorizationV1Api);
|
|
22
|
-
}
|
|
23
|
-
getAllNamespaces() {
|
|
24
|
-
return (0, utils_1.getItems)(this.coreV1Api.listNamespace());
|
|
25
|
-
}
|
|
26
|
-
async isNamespacePersisted(name) {
|
|
27
|
-
const allNamespaces = await this.getAllNamespaces();
|
|
28
|
-
return allNamespaces.some((namespace) => namespace.metadata?.name === name);
|
|
29
|
-
}
|
|
30
|
-
async createNamespace(name) {
|
|
31
|
-
await this.coreV1Api.createNamespace({
|
|
32
|
-
apiVersion: 'v1',
|
|
33
|
-
kind: 'Namespace',
|
|
34
|
-
metadata: {
|
|
35
|
-
name
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
async deleteNamespace(namespace) {
|
|
40
|
-
await this.coreV1Api.deleteNamespace(namespace);
|
|
41
|
-
}
|
|
42
|
-
getDeploymentsFromNamespace(namespace) {
|
|
43
|
-
return (0, utils_1.getItems)(this.appsV1Api.listNamespacedDeployment(namespace));
|
|
44
|
-
}
|
|
45
|
-
async createDeployment({ namespace, dto }) {
|
|
46
|
-
await this.appsV1Api.createNamespacedDeployment(namespace, dto);
|
|
47
|
-
}
|
|
48
|
-
async deleteDeployment({ name, namespace }) {
|
|
49
|
-
await this.appsV1Api.deleteNamespacedDeployment(name, namespace);
|
|
50
|
-
}
|
|
51
|
-
getServicesFromNamespace(namespace) {
|
|
52
|
-
return (0, utils_1.getItems)(this.coreV1Api.listNamespacedService(namespace));
|
|
53
|
-
}
|
|
54
|
-
async getServiceAccountsFromNamespace(namespace) {
|
|
55
|
-
return (0, utils_1.getItems)(this.coreV1Api.listNamespacedServiceAccount(namespace));
|
|
56
|
-
}
|
|
57
|
-
async createServiceAccount({ name, namespace }) {
|
|
58
|
-
await this.coreV1Api.createNamespacedServiceAccount(namespace, {
|
|
59
|
-
apiVersion: 'v1',
|
|
60
|
-
kind: 'ServiceAccount',
|
|
61
|
-
metadata: {
|
|
62
|
-
name,
|
|
63
|
-
namespace
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
async createServiceAccountToken({ namespace, name }) {
|
|
68
|
-
await this.coreV1Api.createNamespacedSecret(namespace, {
|
|
69
|
-
apiVersion: 'v1',
|
|
70
|
-
kind: 'Secret',
|
|
71
|
-
metadata: {
|
|
72
|
-
annotations: {
|
|
73
|
-
'kubernetes.io/service-account.name': namespace
|
|
74
|
-
},
|
|
75
|
-
name,
|
|
76
|
-
namespace
|
|
77
|
-
},
|
|
78
|
-
type: 'kubernetes.io/service-account-token'
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
async createService({ namespace, dto }) {
|
|
82
|
-
await this.coreV1Api.createNamespacedService(namespace, dto);
|
|
83
|
-
}
|
|
84
|
-
async deleteService({ name, namespace }) {
|
|
85
|
-
await this.coreV1Api.deleteNamespacedService(name, namespace);
|
|
86
|
-
}
|
|
87
|
-
getSecretsFromNamespace(namespace) {
|
|
88
|
-
return (0, utils_1.getItems)(this.coreV1Api.listNamespacedSecret(namespace));
|
|
89
|
-
}
|
|
90
|
-
async getRoles({ name, namespace }) {
|
|
91
|
-
return (0, utils_1.getItems)(this.rbacAuthorizationV1Api.listNamespacedRole(name, namespace));
|
|
92
|
-
}
|
|
93
|
-
async createRole({ metadata: { name, namespace }, rules }) {
|
|
94
|
-
await this.rbacAuthorizationV1Api.createNamespacedRole(namespace, {
|
|
95
|
-
apiVersion: 'rbac.authorization.k8s.io/v1',
|
|
96
|
-
kind: 'Role',
|
|
97
|
-
metadata: {
|
|
98
|
-
name,
|
|
99
|
-
namespace
|
|
100
|
-
},
|
|
101
|
-
rules
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
async getRoleBindings({ name, namespace }) {
|
|
105
|
-
return (0, utils_1.getItems)(this.rbacAuthorizationV1Api.listNamespacedRoleBinding(name, namespace));
|
|
106
|
-
}
|
|
107
|
-
async createRoleBinding({ name, namespace, subjects }) {
|
|
108
|
-
await this.rbacAuthorizationV1Api.createNamespacedRoleBinding(namespace, {
|
|
109
|
-
apiVersion: 'rbac.authorization.k8s.io/v1',
|
|
110
|
-
kind: 'RoleBinding',
|
|
111
|
-
metadata: {
|
|
112
|
-
name,
|
|
113
|
-
namespace
|
|
114
|
-
},
|
|
115
|
-
roleRef: {
|
|
116
|
-
apiGroup: 'rbac.authorization.k8s.io',
|
|
117
|
-
kind: 'Role',
|
|
118
|
-
name
|
|
119
|
-
},
|
|
120
|
-
subjects
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
async getAllCustomResourceDefinitions() {
|
|
124
|
-
return (0, utils_1.getItems)(this.apiextensionsV1Api.listCustomResourceDefinition());
|
|
125
|
-
}
|
|
126
|
-
async createCustomResourceDefinition(dto) {
|
|
127
|
-
await this.apiextensionsV1Api.createCustomResourceDefinition(dto).catch(this.logger.error);
|
|
128
|
-
}
|
|
129
|
-
async getAllClusterCustomObjectsFromResourceDefinition(dto) {
|
|
130
|
-
const { body } = await this.customObjectsApi.listClusterCustomObject(dto.spec.group, dto.spec.versions[0].name, dto.spec.names.plural);
|
|
131
|
-
return body['items'];
|
|
132
|
-
}
|
|
133
|
-
async createClusterCustomObject({ resourceDefinition, metadata, spec }) {
|
|
134
|
-
await this.customObjectsApi.createClusterCustomObject(resourceDefinition.spec.group, resourceDefinition.spec.versions[0].name, resourceDefinition.spec.names.plural, {
|
|
135
|
-
apiVersion: `${resourceDefinition.spec.group}/${resourceDefinition.spec.versions[0].name}`,
|
|
136
|
-
kind: resourceDefinition.spec.names.kind,
|
|
137
|
-
metadata,
|
|
138
|
-
spec
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
async patchClusterCustomObject({ resourceDefinition, metadata, spec }) {
|
|
142
|
-
await this.customObjectsApi.patchClusterCustomObject(resourceDefinition.spec.group, resourceDefinition.spec.versions[0].name, resourceDefinition.spec.names.plural, metadata.name, {
|
|
143
|
-
apiVersion: `${resourceDefinition.spec.group}/${resourceDefinition.spec.versions[0].name}`,
|
|
144
|
-
kind: resourceDefinition.spec.names.kind,
|
|
145
|
-
metadata,
|
|
146
|
-
spec
|
|
147
|
-
}, undefined, undefined, undefined, {
|
|
148
|
-
headers: {
|
|
149
|
-
'Content-Type': 'application/merge-patch+json'
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
async deleteClusterCustomObject({ resourceDefinition, metadata }) {
|
|
154
|
-
await this.customObjectsApi.deleteClusterCustomObject(resourceDefinition.spec.group, resourceDefinition.spec.versions[0].name, resourceDefinition.spec.names.plural, metadata.name);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
exports.K8SCluster = K8SCluster;
|
package/src/k8s.config.d.ts
DELETED
package/src/k8s.config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"k8s.config.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/k8s.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,wBAAgB,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,UAAU,CAQ/E"}
|
package/src/k8s.config.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getK8SConfig = getK8SConfig;
|
|
4
|
-
const client_node_1 = require("@kubernetes/client-node");
|
|
5
|
-
function getK8SConfig(configFilePath) {
|
|
6
|
-
const config = new client_node_1.KubeConfig();
|
|
7
|
-
if (configFilePath) {
|
|
8
|
-
config.loadFromFile(configFilePath);
|
|
9
|
-
}
|
|
10
|
-
else {
|
|
11
|
-
config.loadFromDefault();
|
|
12
|
-
}
|
|
13
|
-
return config;
|
|
14
|
-
}
|
package/src/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1M,MAAM,MAAM,gBAAgB,GAAG;IAC3B,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,IAAI,IAAI;IAC3C,IAAI,EAAE;QACF,KAAK,EAAE,IAAI,EAAE,CAAC;KACjB,CAAA;CACJ,CAAC;AAEF,KAAK,yBAAyB,CAAC,GAAG,IAAI;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC;AAEzC,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;AAE3E,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,0BAA0B,CAAC;AAErE,MAAM,MAAM,iBAAiB,CAAC,IAAI,GAAG,GAAG,IAAI;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE,IAAI,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,cAAc,SAAS,iBAAiB,IAAI;IAClF,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,4BAA4B,CAAC,cAAc,SAAS,iBAAiB,IAAI,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC"}
|
package/src/types.js
DELETED
package/src/utils.d.ts
DELETED
package/src/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../packages/k8s/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAErD,wBAAsB,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAGpG"}
|