forked from nushell/nu_scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompose.nu
More file actions
155 lines (149 loc) · 5.09 KB
/
compose.nu
File metadata and controls
155 lines (149 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# kubernetes to docker-compose
export def kube-compose [--without-service(-s)] {
let a = $in
let dpl = $a | where kind == 'Deployment'
mut dpl_svc = {}
mut svc = {}
if not $without_service {
let svcs = $a | where kind == 'Service'
for s in $svcs {
for d in $dpl {
let dl = $d.metadata.labels?
let ss = $s.spec.selector?
mut p = true
for x in ($ss | transpose k v) {
if (not ($x.k in $dl)) or (($dl | get $x.k) != $x.v) {
$p = false
break
}
}
if $p {
let dn = $d.metadata.name
let dv = if $dn in $dpl_svc {
$dpl_svc | get $dn
} else { [] }
$dpl_svc = ($dpl_svc | upsert $dn ($dv | append $s.metadata.name))
}
}
}
$svc = ($svcs
| reduce -f {} {|i, a|
$a | upsert $i.metadata.name $i.spec.ports
})
}
let dpl_svc = $dpl_svc
let svc = $svc
let cm = $a | where kind == 'ConfigMap'
| reduce -f {} {|i,a|
let p = ['.kcmp', 'ConfigMap', $i.metadata.name] | path join
mkdir $p
for f in ($i.data | transpose k v) {
$f.v | save -f ([$p $f.k] | path join)
}
$a | insert $i.metadata.name $p
}
let sec = $a | where kind == 'Secret'
| reduce -f {} {|i,a|
let p = ['.kcmp', 'Secret', $i.metadata.name] | path join
mkdir $p
for f in ($i.data | transpose k v) {
$f.v | decode base64 | save -f ([$p $f.k] | path join)
}
$a | insert $i.metadata.name $p
}
let pv = $a | where kind == 'PersistentVolume'
| reduce -f {} {|i,a| $a | insert $i.metadata.name $i.spec.local?.path? }
let pvc = $a | where kind == 'PersistentVolumeClaim'
| reduce -f {} {|i,a| $a | insert $i.metadata.name ($pv | get $i.spec.volumeName) }
let services = $dpl
| each {|x|
let d = $x.metadata.name
let s = if not $without_service {
$dpl_svc
| get $d
| each {|z| $svc | get $z}
| flatten
| each {|z| [$z.port $z.targetPort] }
}
let v = $x.spec.template.spec.volumes?
| reduce -f {} {|i,a|
$a | insert $i.name $i
}
$x.spec.template.spec.containers?
| default []
| each {|y|
let ca = $y.securityContext?.capabilities?.add?
let cd = $y.securityContext?.capabilities?.drop?
let v = $y.volumeMounts?
| default []
| each {|z|
let sp = $z.subPath? | default ''
let s = $v | get $z.name
let s = if ($s.hostPath? | is-not-empty) {
$s.hostPath.path
} else if ($s.path? | is-not-empty) {
$s.path
} else if ($s.persistentVolumeClaim?.claimName? | is-not-empty) {
$pvc | get $s.persistentVolumeClaim.claimName
} else if ($s.configMap?.name? | is-not-empty) {
['.'
($cm | get $s.configMap.name)
$sp
] | path join
} else if ($s.secret?.secretName? | is-not-empty) {
['.'
($sec | get $s.secret.secretName)
$sp
] | path join
} else {
$s
}
let m = [$z.mountPath $sp] | path join
$"($s):($m)"
}
let s = if $without_service {
$y.ports? | default [] | each {|x| $"($x.containerPort):($x.containerPort)"}
} else {
$s | each {|x|
if ($x.1 | find -r '[^0-9]' | is-empty) {
$"($x.0):($x.1)"
} else {
mut p = ''
for i in ($y.ports? | default []) {
if $i.name == $x.1 {
$p = $i.containerPort
break
}
}
$"($x.0):($p)"
}
}
}
{
name: $"($d)_($y.name)"
image: $y.image
environment: ($y.env? | reduce -f {} {|i,a| $a | insert $i.name $i.value?})
ports: $s
entrypoint: $y.command?
command: $y.args?
cap_add: $ca
cap_drop: $cd
volumes: $v
}
| transpose k v
| reduce -f {} {|i,a|
if ($i.v | is-empty) {
$a
} else {
$a | insert $i.k $i.v
}
}
}
}
| flatten
| reduce -f {} {|i,a|
$a | insert $i.name ($i | reject name)
}
{ version: '3.8', services: $services}
| to yaml
}