@kwirthmagnify/kwirth-common-back 0.5.6 → 0.5.8

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.
@@ -0,0 +1,15 @@
1
+ import { IDaemonInstanceConfig, BackDaemonData, IBackDaemonRequirements } from '@kwirthmagnify/kwirth-common';
2
+ export interface IDaemon {
3
+ readonly daemonId: string;
4
+ readonly requirements: IBackDaemonRequirements;
5
+ getDaemonData(): BackDaemonData;
6
+ startDaemon(): Promise<void>;
7
+ addObject(instanceConfig: IDaemonInstanceConfig, podNamespace: string, podName: string, containerName: string): Promise<boolean>;
8
+ deleteObject(instanceConfig: IDaemonInstanceConfig, podNamespace: string, podName: string, containerName: string): Promise<boolean>;
9
+ containsInstance(instanceId: string): boolean;
10
+ containsAsset(instanceId: string, podNamespace: string, podName: string, containerName: string): boolean;
11
+ stopInstance(instanceId: string): void;
12
+ processProviderEvent(providerId: string, event: unknown): void;
13
+ processCommand(instanceId: string, command: string, data: unknown): Promise<unknown>;
14
+ subscribe(instanceId: string, callback: (event: unknown) => void): () => void;
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ export declare function applyAllResources(yamlContent: string, clusterInfo: any): Promise<void>;
2
+ export declare function deleteAllResources(yamlContent: string, clusterInfo: any): Promise<void>;
3
+ export interface ICrdInformerHandlers {
4
+ onAdd?: (obj: any) => void;
5
+ onUpdate?: (obj: any) => void;
6
+ onDelete?: (obj: any) => void;
7
+ onError?: (err: any) => void;
8
+ }
9
+ export declare function createCrdInformer(clusterInfo: any, apiGroup: string, apiVersion: string, plural: string, handlers: ICrdInformerHandlers): any;
10
+ export declare function restartController(kind: string, namespace: string, name: string, clusterInfo: any): Promise<void>;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyAllResources = applyAllResources;
4
+ exports.deleteAllResources = deleteAllResources;
5
+ exports.createCrdInformer = createCrdInformer;
6
+ exports.restartController = restartController;
7
+ const jsYaml = require('js-yaml');
8
+ const k8s = require('@kubernetes/client-node');
9
+ async function applyResource(resource, clusterInfo) {
10
+ try {
11
+ if (resource.metadata?.managedFields)
12
+ delete resource.metadata.managedFields;
13
+ await clusterInfo.objectsApi.patch(resource, undefined, undefined, 'kwirth', true, 'application/apply-patch+yaml');
14
+ return `${resource.kind} '${resource.metadata?.name}' applied successfully.`;
15
+ }
16
+ catch (err) {
17
+ console.log('[KubernetesTools] Error applying:', err);
18
+ return 'Error applying: ' + err;
19
+ }
20
+ }
21
+ async function applyAllResources(yamlContent, clusterInfo) {
22
+ try {
23
+ const resources = [];
24
+ jsYaml.loadAll(yamlContent, (doc) => { if (doc)
25
+ resources.push(doc); });
26
+ for (const resource of resources) {
27
+ try {
28
+ const result = await applyResource(resource, clusterInfo);
29
+ if (result !== '')
30
+ console.log('[KubernetesTools]', result);
31
+ }
32
+ catch (err) {
33
+ console.log('[KubernetesTools] Error applying resource:', err);
34
+ break;
35
+ }
36
+ }
37
+ }
38
+ catch (err) {
39
+ console.log('[KubernetesTools] Error applying all resources:', err);
40
+ }
41
+ }
42
+ async function deleteAllResources(yamlContent, clusterInfo) {
43
+ async function deleteResource(resource) {
44
+ const kind = resource.kind;
45
+ const name = resource.metadata?.name;
46
+ const namespace = resource.metadata?.namespace;
47
+ try {
48
+ switch (kind) {
49
+ case 'Namespace':
50
+ await clusterInfo.coreApi.deleteNamespace({ name });
51
+ break;
52
+ case 'ConfigMap':
53
+ await clusterInfo.coreApi.deleteNamespacedConfigMap({ name, namespace });
54
+ break;
55
+ case 'Secret':
56
+ await clusterInfo.coreApi.deleteNamespacedSecret({ name, namespace });
57
+ break;
58
+ case 'CustomResourceDefinition':
59
+ await clusterInfo.extensionApi.deleteCustomResourceDefinition({ name });
60
+ break;
61
+ case 'Deployment':
62
+ await clusterInfo.appsApi.deleteNamespacedDeployment({ name, namespace });
63
+ break;
64
+ case 'Service':
65
+ await clusterInfo.coreApi.deleteNamespacedService({ name, namespace });
66
+ break;
67
+ case 'ClusterRole':
68
+ await clusterInfo.rbacApi.deleteClusterRole({ name });
69
+ break;
70
+ case 'ClusterRoleBinding':
71
+ await clusterInfo.rbacApi.deleteClusterRoleBinding({ name });
72
+ break;
73
+ case 'RoleBinding':
74
+ await clusterInfo.rbacApi.deleteNamespacedRoleBinding({ name, namespace });
75
+ break;
76
+ case 'ServiceAccount':
77
+ await clusterInfo.coreApi.deleteNamespacedServiceAccount({ name, namespace });
78
+ break;
79
+ default:
80
+ console.log(`[KubernetesTools] Resource kind '${kind}' not implemented for deletion.`);
81
+ return;
82
+ }
83
+ console.log(`[KubernetesTools] ${kind} '${name}' removed.`);
84
+ }
85
+ catch (err) {
86
+ console.log(`[KubernetesTools] Error removing ${kind} '${name}':`, err);
87
+ }
88
+ }
89
+ try {
90
+ const resources = [];
91
+ jsYaml.loadAll(yamlContent, (doc) => { if (doc)
92
+ resources.push(doc); });
93
+ for (const resource of resources) {
94
+ try {
95
+ await deleteResource(resource);
96
+ }
97
+ catch (err) {
98
+ console.log('[KubernetesTools] Error deleting resource:', err);
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ catch (err) {
104
+ console.log('[KubernetesTools] Error deleting all resources:', err);
105
+ }
106
+ }
107
+ async function getSelector(kind, namespace, name, clusterInfo) {
108
+ try {
109
+ switch (kind) {
110
+ case 'Deployment': return (await clusterInfo.appsApi.readNamespacedDeployment({ name, namespace })).spec?.selector?.matchLabels;
111
+ case 'ReplicaSet': return (await clusterInfo.appsApi.readNamespacedReplicaSet({ name, namespace })).spec?.selector?.matchLabels;
112
+ case 'DaemonSet': return (await clusterInfo.appsApi.readNamespacedDaemonSet({ name, namespace })).spec?.selector?.matchLabels;
113
+ case 'StatefulSet': return (await clusterInfo.appsApi.readNamespacedStatefulSet({ name, namespace })).spec?.selector?.matchLabels;
114
+ case 'ReplicationController': return (await clusterInfo.coreApi.readNamespacedReplicationController({ name, namespace })).spec?.selector;
115
+ case 'Job': return (await clusterInfo.batchApi.readNamespacedJob({ name, namespace })).spec?.selector?.matchLabels;
116
+ }
117
+ }
118
+ catch (err) {
119
+ console.log('[KubernetesTools] Error getting selector:', err);
120
+ }
121
+ return undefined;
122
+ }
123
+ function createCrdInformer(clusterInfo, apiGroup, apiVersion, plural, handlers) {
124
+ const path = `/apis/${apiGroup}/${apiVersion}/${plural}`;
125
+ const listFunction = () => clusterInfo.crdApi.listCustomObjectForAllNamespaces({ group: apiGroup, version: apiVersion, plural })
126
+ .then((res) => res);
127
+ const informer = k8s.makeInformer(clusterInfo.kubeConfig, path, listFunction);
128
+ if (handlers.onAdd)
129
+ informer.on('add', handlers.onAdd);
130
+ if (handlers.onUpdate)
131
+ informer.on('update', handlers.onUpdate);
132
+ if (handlers.onDelete)
133
+ informer.on('delete', handlers.onDelete);
134
+ if (handlers.onError)
135
+ informer.on('error', handlers.onError);
136
+ return informer;
137
+ }
138
+ async function restartController(kind, namespace, name, clusterInfo) {
139
+ try {
140
+ const labels = await getSelector(kind, namespace, name, clusterInfo);
141
+ if (labels) {
142
+ const labelSelector = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');
143
+ const pods = await clusterInfo.coreApi.listNamespacedPod({ namespace, labelSelector });
144
+ for (const pod of pods.items) {
145
+ if (pod.metadata?.name) {
146
+ await clusterInfo.coreApi.deleteNamespacedPod({ name: pod.metadata.name, namespace });
147
+ console.log(`[KubernetesTools] Pod ${pod.metadata.name} deleted.`);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch (err) {
153
+ console.log('[KubernetesTools] Error restarting controller:', err);
154
+ }
155
+ }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './IChannel';
2
+ export * from './IDaemon';
2
3
  export * from './IProvider';
3
4
  export * from './ISender';
5
+ export * from './KubernetesTools';
4
6
  export * from '@kwirthmagnify/kwirth-common';
package/dist/index.js CHANGED
@@ -15,6 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./IChannel"), exports);
18
+ __exportStar(require("./IDaemon"), exports);
18
19
  __exportStar(require("./IProvider"), exports);
19
20
  __exportStar(require("./ISender"), exports);
21
+ __exportStar(require("./KubernetesTools"), exports);
20
22
  __exportStar(require("@kwirthmagnify/kwirth-common"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kwirthmagnify/kwirth-common-back",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "Backend interfaces for building Kwirth provider and channel plugins",
5
5
  "scripts": {
6
6
  "build": "tsc"
@@ -25,10 +25,13 @@
25
25
  "license": "ISC",
26
26
  "dependencies": {
27
27
  "@kwirthmagnify/kwirth-common": "^0.5.4",
28
- "express": "^4.18.0"
28
+ "@kubernetes/client-node": "^1.4.0",
29
+ "express": "^4.18.0",
30
+ "js-yaml": "^4.1.0"
29
31
  },
30
32
  "devDependencies": {
31
33
  "@types/express": "^4.17.21",
34
+ "@types/js-yaml": "^4.0.9",
32
35
  "typescript": "^5.8.3"
33
36
  }
34
37
  }