devfile 0.0.11.pre.alpha1-x86_64-linux → 0.0.13.pre.alpha1-x86_64-linux
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.
- checksums.yaml +4 -4
- data/bin/devfile +0 -0
- data/ext/devfile.go +51 -2
- data/ext/go.mod +2 -2
- data/ext/main.go +45 -8
- data/ext/volume.go +17 -14
- data/lib/devfile.rb +10 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2828c04bd596361245d3c284bc14a54c665480503bee24306bd05c112a7eead5
|
4
|
+
data.tar.gz: fbcc19449ed34019693d5ef30d4f5499cf36b90e6f0f96fd48439e234873cde3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdb5fb6df7de30d29c351b584746ca0fd149054a43162d9c9cadae5fd0bb577f694c0fb72b3d19512889282af121d75b80e3ac94ec9a6e6e46febff7eb6c04b3
|
7
|
+
data.tar.gz: '04308c3afdf61e819014e6d63e9e0460a7e6a402d9c9f271a79b54132aa27ea77ae17182aa9ad691cd08a01b5b1c25c6e7a2b3dcd3c3ed211263f6c6747035f1'
|
data/bin/devfile
CHANGED
Binary file
|
data/ext/devfile.go
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
package main
|
2
2
|
|
3
|
-
import "C"
|
4
3
|
import (
|
5
4
|
"bytes"
|
6
5
|
"strconv"
|
@@ -12,6 +11,7 @@ import (
|
|
12
11
|
appsv1 "k8s.io/api/apps/v1"
|
13
12
|
corev1 "k8s.io/api/core/v1"
|
14
13
|
networkingv1 "k8s.io/api/networking/v1"
|
14
|
+
"k8s.io/apimachinery/pkg/api/resource"
|
15
15
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
16
16
|
"k8s.io/apimachinery/pkg/runtime"
|
17
17
|
"k8s.io/cli-runtime/pkg/printers"
|
@@ -22,6 +22,11 @@ type Devfile struct {
|
|
22
22
|
devfileObj parser.DevfileObj
|
23
23
|
}
|
24
24
|
|
25
|
+
type pvcOptions struct {
|
26
|
+
Name string
|
27
|
+
Size string
|
28
|
+
}
|
29
|
+
|
25
30
|
func (d Devfile) getDeployment(name, namespace string, labels, annotations map[string]string, replicas int) (*appsv1.Deployment, error) {
|
26
31
|
containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
|
27
32
|
if err != nil {
|
@@ -31,7 +36,7 @@ func (d Devfile) getDeployment(name, namespace string, labels, annotations map[s
|
|
31
36
|
if err != nil {
|
32
37
|
return nil, err
|
33
38
|
}
|
34
|
-
volumes, err := d.getVolumesAndVolumeMounts(containers, initContainers, name)
|
39
|
+
volumes, _, err := d.getVolumesAndVolumeMounts(containers, initContainers, name)
|
35
40
|
if err != nil {
|
36
41
|
return nil, err
|
37
42
|
}
|
@@ -146,6 +151,42 @@ func (d Devfile) getIngress(name, namespace string, labels, annotations map[stri
|
|
146
151
|
return ingress, nil
|
147
152
|
}
|
148
153
|
|
154
|
+
func (d Devfile) getPVC(name, namespace string, labels, annotations map[string]string) ([]*corev1.PersistentVolumeClaim, error) {
|
155
|
+
containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
|
156
|
+
if err != nil {
|
157
|
+
return nil, err
|
158
|
+
}
|
159
|
+
initContainers, err := generator.GetInitContainers(d.devfileObj)
|
160
|
+
if err != nil {
|
161
|
+
return nil, err
|
162
|
+
}
|
163
|
+
_, pvcNameToPvcOptions, err := d.getVolumesAndVolumeMounts(containers, initContainers, name)
|
164
|
+
if err != nil {
|
165
|
+
return nil, err
|
166
|
+
}
|
167
|
+
|
168
|
+
pvcs := make([]*corev1.PersistentVolumeClaim, 0)
|
169
|
+
for _, options := range pvcNameToPvcOptions {
|
170
|
+
quantity, err := resource.ParseQuantity(options.Size)
|
171
|
+
if err != nil {
|
172
|
+
return nil, err
|
173
|
+
}
|
174
|
+
pvcParams := generator.PVCParams{
|
175
|
+
TypeMeta: generator.GetTypeMeta("PersistentVolumeClaim", "v1"),
|
176
|
+
ObjectMeta: metav1.ObjectMeta{
|
177
|
+
Name: options.Name,
|
178
|
+
Namespace: namespace,
|
179
|
+
Labels: labels,
|
180
|
+
Annotations: annotations,
|
181
|
+
},
|
182
|
+
Quantity: quantity,
|
183
|
+
}
|
184
|
+
pvc := generator.GetPVC(pvcParams)
|
185
|
+
pvcs = append(pvcs, pvc)
|
186
|
+
}
|
187
|
+
return pvcs, nil
|
188
|
+
}
|
189
|
+
|
149
190
|
func (d Devfile) getAll(name, namespace string, labels, annotations map[string]string, replicas int, domainTemplate, ingressClass string) ([]runtime.Object, error) {
|
150
191
|
|
151
192
|
var result []runtime.Object
|
@@ -170,6 +211,14 @@ func (d Devfile) getAll(name, namespace string, labels, annotations map[string]s
|
|
170
211
|
result = append(result, ingress)
|
171
212
|
}
|
172
213
|
|
214
|
+
pvcs, err := d.getPVC(name, namespace, labels, annotations)
|
215
|
+
if err != nil {
|
216
|
+
return nil, err
|
217
|
+
}
|
218
|
+
for _, pvc := range pvcs {
|
219
|
+
result = append(result, pvc)
|
220
|
+
}
|
221
|
+
|
173
222
|
return result, nil
|
174
223
|
}
|
175
224
|
|
data/ext/go.mod
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module gitlab
|
1
|
+
module gitlab-org/remote-development/devfile-gem
|
2
2
|
|
3
3
|
go 1.18
|
4
4
|
|
@@ -7,6 +7,7 @@ require (
|
|
7
7
|
k8s.io/api v0.26.1
|
8
8
|
k8s.io/apimachinery v0.26.1
|
9
9
|
k8s.io/cli-runtime v0.26.1
|
10
|
+
sigs.k8s.io/yaml v1.3.0
|
10
11
|
)
|
11
12
|
|
12
13
|
require (
|
@@ -115,5 +116,4 @@ require (
|
|
115
116
|
sigs.k8s.io/controller-runtime v0.13.1 // indirect
|
116
117
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
|
117
118
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
|
118
|
-
sigs.k8s.io/yaml v1.3.0 // indirect
|
119
119
|
)
|
data/ext/main.go
CHANGED
@@ -30,6 +30,8 @@ func main() {
|
|
30
30
|
content, err = getService(devfile, args[3], args[4], args[5], args[6])
|
31
31
|
case "ingress":
|
32
32
|
content, err = getIngress(devfile, args[3], args[4], args[5], args[6], args[7], args[8])
|
33
|
+
case "pvc":
|
34
|
+
content, err = getPVC(devfile, args[3], args[4], args[5], args[6])
|
33
35
|
case "all":
|
34
36
|
content, err = getAll(devfile, args[3], args[4], args[5], args[6], args[7], args[8], args[9])
|
35
37
|
case "flatten":
|
@@ -62,8 +64,8 @@ func getDeployment(devfile, name, namespace, labelsStr, annotationsStr, replicas
|
|
62
64
|
if err != nil {
|
63
65
|
return "", err
|
64
66
|
}
|
65
|
-
if exists
|
66
|
-
return "",
|
67
|
+
if !exists {
|
68
|
+
return "", nil
|
67
69
|
}
|
68
70
|
labels, err := unmarshalKeyValuePair(labelsStr)
|
69
71
|
if err != nil {
|
@@ -97,8 +99,8 @@ func getService(devfile, name, namespace, labelsStr, annotationsStr string) (str
|
|
97
99
|
if err != nil {
|
98
100
|
return "", err
|
99
101
|
}
|
100
|
-
if exists
|
101
|
-
return "",
|
102
|
+
if !exists {
|
103
|
+
return "", nil
|
102
104
|
}
|
103
105
|
labels, err := unmarshalKeyValuePair(labelsStr)
|
104
106
|
if err != nil {
|
@@ -128,8 +130,8 @@ func getIngress(devfile, name, namespace, labelsStr, annotationsStr, domainTempl
|
|
128
130
|
if err != nil {
|
129
131
|
return "", err
|
130
132
|
}
|
131
|
-
if exists
|
132
|
-
return "",
|
133
|
+
if !exists {
|
134
|
+
return "", nil
|
133
135
|
}
|
134
136
|
labels, err := unmarshalKeyValuePair(labelsStr)
|
135
137
|
if err != nil {
|
@@ -155,7 +157,7 @@ func getIngress(devfile, name, namespace, labelsStr, annotationsStr, domainTempl
|
|
155
157
|
return content, nil
|
156
158
|
}
|
157
159
|
|
158
|
-
func
|
160
|
+
func getPVC(devfile, name, namespace, labelsStr, annotationsStr string) (string, error) {
|
159
161
|
d, err := parseDevfile(devfile)
|
160
162
|
if err != nil {
|
161
163
|
return "", err
|
@@ -164,9 +166,44 @@ func getAll(devfile string, name, namespace, labelsStr, annotationsStr, replicas
|
|
164
166
|
if err != nil {
|
165
167
|
return "", err
|
166
168
|
}
|
167
|
-
if exists
|
169
|
+
if !exists {
|
170
|
+
return "", nil
|
171
|
+
}
|
172
|
+
labels, err := unmarshalKeyValuePair(labelsStr)
|
173
|
+
if err != nil {
|
174
|
+
return "", err
|
175
|
+
}
|
176
|
+
annotations, err := unmarshalKeyValuePair(annotationsStr)
|
177
|
+
if err != nil {
|
178
|
+
return "", err
|
179
|
+
}
|
180
|
+
pvcs, err := d.getPVC(name, namespace, labels, annotations)
|
181
|
+
if err != nil {
|
182
|
+
return "", err
|
183
|
+
}
|
184
|
+
var result []runtime.Object
|
185
|
+
for _, pvc := range pvcs {
|
186
|
+
result = append(result, pvc)
|
187
|
+
}
|
188
|
+
content, err := marshalResources(result)
|
189
|
+
if err != nil {
|
190
|
+
return "", err
|
191
|
+
}
|
192
|
+
return content, nil
|
193
|
+
}
|
194
|
+
|
195
|
+
func getAll(devfile string, name, namespace, labelsStr, annotationsStr, replicas, domainTemplate, ingressClass string) (string, error) {
|
196
|
+
d, err := parseDevfile(devfile)
|
197
|
+
if err != nil {
|
198
|
+
return "", err
|
199
|
+
}
|
200
|
+
exists, err := d.hasContainerComponents()
|
201
|
+
if err != nil {
|
168
202
|
return "", err
|
169
203
|
}
|
204
|
+
if !exists {
|
205
|
+
return "", nil
|
206
|
+
}
|
170
207
|
labels, err := unmarshalKeyValuePair(labelsStr)
|
171
208
|
if err != nil {
|
172
209
|
return "", err
|
data/ext/volume.go
CHANGED
@@ -9,44 +9,47 @@ import (
|
|
9
9
|
"strings"
|
10
10
|
)
|
11
11
|
|
12
|
-
func (d Devfile) getVolumesAndVolumeMounts(containers []corev1.Container, initContainers []corev1.Container,
|
12
|
+
func (d Devfile) getVolumesAndVolumeMounts(containers []corev1.Container, initContainers []corev1.Container, volumeNamePrefix string) ([]corev1.Volume, map[string]pvcOptions, error) {
|
13
13
|
containerComponents, err := d.devfileObj.Data.GetDevfileContainerComponents(common.DevfileOptions{})
|
14
14
|
if err != nil {
|
15
|
-
return nil, err
|
15
|
+
return nil, nil, err
|
16
16
|
}
|
17
17
|
volumeComponents, err := d.devfileObj.Data.GetDevfileVolumeComponents(common.DevfileOptions{})
|
18
18
|
if err != nil {
|
19
|
-
return nil, err
|
19
|
+
return nil, nil, err
|
20
20
|
}
|
21
21
|
|
22
22
|
var volumes []corev1.Volume
|
23
|
+
pvcNameToPvcOptions := map[string]pvcOptions{}
|
23
24
|
for _, volumeComponent := range volumeComponents {
|
24
|
-
|
25
|
+
volumeName := fmt.Sprintf("%s-%s", volumeNamePrefix, volumeComponent.Name)
|
25
26
|
if bool(*volumeComponent.Volume.Ephemeral) == true {
|
26
|
-
emptyDir, err := getEmptyDir(
|
27
|
+
emptyDir, err := getEmptyDir(volumeName, volumeComponent.Volume.Size)
|
27
28
|
if err != nil {
|
28
|
-
return nil, err
|
29
|
+
return nil, nil, err
|
29
30
|
}
|
30
31
|
volumes = append(volumes, emptyDir)
|
31
32
|
} else {
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
volumes = append(volumes, getPersistentVolumeClaim(volumeName, volumeName))
|
34
|
+
pvcNameToPvcOptions[volumeComponent.Name] = pvcOptions{
|
35
|
+
Name: volumeName,
|
36
|
+
Size: volumeComponent.Volume.Size,
|
37
|
+
}
|
35
38
|
}
|
36
39
|
// containerNameToMountPaths is a map of the Devfile container name to their Devfile Volume Mount Paths for a given Volume Name
|
37
40
|
containerNameToMountPaths := make(map[string][]string)
|
38
41
|
for _, containerComp := range containerComponents {
|
39
42
|
for _, volumeMount := range containerComp.Container.VolumeMounts {
|
40
|
-
if
|
43
|
+
if volumeComponent.Name == volumeMount.Name {
|
41
44
|
containerNameToMountPaths[containerComp.Name] = append(containerNameToMountPaths[containerComp.Name], generator.GetVolumeMountPath(volumeMount))
|
42
45
|
}
|
43
46
|
}
|
44
47
|
}
|
45
48
|
|
46
|
-
addVolumeMountToContainers(containers, initContainers,
|
49
|
+
addVolumeMountToContainers(containers, initContainers, volumeName, containerNameToMountPaths)
|
47
50
|
}
|
48
51
|
|
49
|
-
return volumes, nil
|
52
|
+
return volumes, pvcNameToPvcOptions, nil
|
50
53
|
}
|
51
54
|
|
52
55
|
// addVolumeMountToContainers adds the Volume Mounts in containerNameToMountPaths to the containers for a given pvc and volumeName
|
@@ -82,8 +85,8 @@ func addVolumeMountToContainers(containers []corev1.Container, initContainers []
|
|
82
85
|
}
|
83
86
|
}
|
84
87
|
|
85
|
-
//
|
86
|
-
func
|
88
|
+
// getPersistentVolumeClaim gets a pvc type volume with the given volume name and pvc name.
|
89
|
+
func getPersistentVolumeClaim(volumeName, pvcName string) corev1.Volume {
|
87
90
|
|
88
91
|
return corev1.Volume{
|
89
92
|
Name: volumeName,
|
data/lib/devfile.rb
CHANGED
@@ -39,6 +39,16 @@ module Devfile
|
|
39
39
|
stdout
|
40
40
|
end
|
41
41
|
|
42
|
+
def get_pvc(devfile, name, namespace, labels, annotations)
|
43
|
+
stdout, stderr, status = Open3.capture3(
|
44
|
+
"#{FILE_PATH} deployment '#{devfile}' #{name} #{namespace} '#{labels}' '#{annotations}'"
|
45
|
+
)
|
46
|
+
|
47
|
+
raise stderr unless status.success?
|
48
|
+
|
49
|
+
stdout
|
50
|
+
end
|
51
|
+
|
42
52
|
def get_all(devfile, name, namespace, labels, annotations, replicas, domain_template, ingress_class)
|
43
53
|
stdout, stderr, status = Open3.capture3(
|
44
54
|
"#{FILE_PATH} all '#{devfile}' #{name} #{namespace} '#{labels}' '#{annotations}' #{replicas} #{domain_template} #{ingress_class}"
|
metadata
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devfile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13.pre.alpha1
|
5
5
|
platform: x86_64-linux
|
6
6
|
authors:
|
7
7
|
- GitLab
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Library used to generate kubernetes manifests from a Devfile.
|
14
|
-
email:
|
14
|
+
email:
|
15
|
+
- cwoolley@gitlab.com
|
16
|
+
- vtak@gitlab.com
|
17
|
+
- spatnaik@gitlab.com
|
15
18
|
executables: []
|
16
19
|
extensions: []
|
17
20
|
extra_rdoc_files: []
|