1
+ const path = require ( 'path' )
1
2
const { isEmpty, mergeDeepRight } = require ( 'ramda' )
3
+ const kubernetes = require ( '@kubernetes/client-node' )
2
4
const { Component } = require ( '@serverless/core' )
3
5
4
6
const defaults = {
5
- foo : 'bar'
7
+ kubeConfigPath : path . join ( process . env . HOME , '.kube' , 'config' ) ,
8
+ name : 'default'
6
9
}
7
10
8
11
class KubernetesNamespace extends Component {
9
12
async default ( inputs = { } ) {
10
13
const config = mergeDeepRight ( defaults , inputs )
11
14
15
+ const k8sCore = this . getKubernetesClient ( config . kubeConfigPath , kubernetes . CoreV1Api )
16
+
17
+ let namespaceExists = true
18
+ try {
19
+ await this . readNamespace ( k8sCore , config )
20
+ } catch ( error ) {
21
+ namespaceExists = error . response . body . code === 404 ? false : true
22
+ }
23
+
24
+ if ( ! namespaceExists ) {
25
+ await this . createNamespace ( k8sCore , config )
26
+ }
27
+
12
28
this . state = config
13
29
await this . save ( )
14
30
return this . state
@@ -20,10 +36,34 @@ class KubernetesNamespace extends Component {
20
36
config = this . state
21
37
}
22
38
39
+ const k8sCore = this . getKubernetesClient ( config . kubeConfigPath , kubernetes . CoreV1Api )
40
+
41
+ await this . deleteNamespace ( k8sCore , config )
42
+
23
43
this . state = { }
24
44
await this . save ( )
25
45
return { }
26
46
}
47
+
48
+ // "private" methods
49
+ getKubernetesClient ( configPath , type ) {
50
+ let kc = new kubernetes . KubeConfig ( )
51
+ kc . loadFromFile ( configPath )
52
+ kc = kc . makeApiClient ( type )
53
+ return kc
54
+ }
55
+
56
+ async createNamespace ( k8s , { name } ) {
57
+ return k8s . createNamespace ( { metadata : { name } } )
58
+ }
59
+
60
+ async readNamespace ( k8s , { name } ) {
61
+ return k8s . readNamespace ( name )
62
+ }
63
+
64
+ async deleteNamespace ( k8s , { name } ) {
65
+ return k8s . deleteNamespace ( name )
66
+ }
27
67
}
28
68
29
69
module . exports = KubernetesNamespace
0 commit comments