devfile 0.0.12.pre.alpha1-x86_64-linux → 0.0.13.pre.alpha1-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/devfile +0 -0
  3. data/ext/devfile.go +25 -74
  4. data/ext/volume.go +117 -0
  5. metadata +2 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cc3363280657ceecbb55931395fc354e8d13cb814c2a83b11dd679e0a67edd6
4
- data.tar.gz: b8bdad6991ddc7a87cd72c49fc2d684f8fe055245ae8747136e08df8608a7bd0
3
+ metadata.gz: 2828c04bd596361245d3c284bc14a54c665480503bee24306bd05c112a7eead5
4
+ data.tar.gz: fbcc19449ed34019693d5ef30d4f5499cf36b90e6f0f96fd48439e234873cde3
5
5
  SHA512:
6
- metadata.gz: 928d238a1651d90afb2d1e81e8eafbfbbbb421487a51a21eba8b5262f6649619fcedcbc25ea1bcb4db2632e6e011491eb3abc41bd4736fc3540f2c14fe3b6ef6
7
- data.tar.gz: 2dec36f8b4bd994a41cc3b20c2fb7099b54558dc1864dcd80b13594a036d84c55932d688dc595b38652c0479329e616ee92090f09a8fb0388877b638d1213a47
6
+ metadata.gz: bdb5fb6df7de30d29c351b584746ca0fd149054a43162d9c9cadae5fd0bb577f694c0fb72b3d19512889282af121d75b80e3ac94ec9a6e6e46febff7eb6c04b3
7
+ data.tar.gz: '04308c3afdf61e819014e6d63e9e0460a7e6a402d9c9f271a79b54132aa27ea77ae17182aa9ad691cd08a01b5b1c25c6e7a2b3dcd3c3ed211263f6c6747035f1'
data/bin/devfile CHANGED
Binary file
data/ext/devfile.go CHANGED
@@ -2,8 +2,6 @@ package main
2
2
 
3
3
  import (
4
4
  "bytes"
5
- "fmt"
6
- "sort"
7
5
  "strconv"
8
6
  "text/template"
9
7
 
@@ -24,14 +22,21 @@ type Devfile struct {
24
22
  devfileObj parser.DevfileObj
25
23
  }
26
24
 
27
- type volumeOptions struct {
28
- Info generator.VolumeInfo
29
- Size string
30
- IsEphemeral bool
25
+ type pvcOptions struct {
26
+ Name string
27
+ Size string
31
28
  }
32
29
 
33
30
  func (d Devfile) getDeployment(name, namespace string, labels, annotations map[string]string, replicas int) (*appsv1.Deployment, error) {
34
- containers, initContainers, volumes, _, err := d.getContainersAndVolumes(name)
31
+ containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
32
+ if err != nil {
33
+ return nil, err
34
+ }
35
+ initContainers, err := generator.GetInitContainers(d.devfileObj)
36
+ if err != nil {
37
+ return nil, err
38
+ }
39
+ volumes, _, err := d.getVolumesAndVolumeMounts(containers, initContainers, name)
35
40
  if err != nil {
36
41
  return nil, err
37
42
  }
@@ -147,24 +152,29 @@ func (d Devfile) getIngress(name, namespace string, labels, annotations map[stri
147
152
  }
148
153
 
149
154
  func (d Devfile) getPVC(name, namespace string, labels, annotations map[string]string) ([]*corev1.PersistentVolumeClaim, error) {
150
- _, _, volumes, volumeNameToVolumeOptions, err := d.getContainersAndVolumes(name)
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)
151
164
  if err != nil {
152
165
  return nil, err
153
166
  }
167
+
154
168
  pvcs := make([]*corev1.PersistentVolumeClaim, 0)
155
- for _, volume := range volumes {
156
- volumeOptions := volumeNameToVolumeOptions[volume.Name]
157
- if volumeOptions.IsEphemeral {
158
- continue
159
- }
160
- quantity, err := resource.ParseQuantity(volumeOptions.Size)
169
+ for _, options := range pvcNameToPvcOptions {
170
+ quantity, err := resource.ParseQuantity(options.Size)
161
171
  if err != nil {
162
172
  return nil, err
163
173
  }
164
174
  pvcParams := generator.PVCParams{
165
175
  TypeMeta: generator.GetTypeMeta("PersistentVolumeClaim", "v1"),
166
176
  ObjectMeta: metav1.ObjectMeta{
167
- Name: volumeOptions.Info.PVCName,
177
+ Name: options.Name,
168
178
  Namespace: namespace,
169
179
  Labels: labels,
170
180
  Annotations: annotations,
@@ -212,65 +222,6 @@ func (d Devfile) getAll(name, namespace string, labels, annotations map[string]s
212
222
  return result, nil
213
223
  }
214
224
 
215
- func (d Devfile) getContainersAndVolumes(name string) ([]corev1.Container, []corev1.Container, []corev1.Volume, map[string]volumeOptions, error) {
216
- containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
217
- if err != nil {
218
- return nil, nil, nil, nil, err
219
- }
220
- initContainers, err := generator.GetInitContainers(d.devfileObj)
221
- if err != nil {
222
- return nil, nil, nil, nil, err
223
- }
224
- allContainers := append(containers, initContainers...)
225
-
226
- volumeComponents, err := d.devfileObj.Data.GetDevfileVolumeComponents(common.DevfileOptions{})
227
- if err != nil {
228
- return nil, nil, nil, nil, err
229
- }
230
- volumeNameToVolumeOptions := map[string]volumeOptions{}
231
- volumeNameToVolumeInfo := map[string]generator.VolumeInfo{}
232
- for _, volumeComponent := range volumeComponents {
233
- info := generator.VolumeInfo{
234
- PVCName: fmt.Sprintf("%s-%s", name, volumeComponent.Name),
235
- VolumeName: volumeComponent.Name,
236
- }
237
- volumeNameToVolumeInfo[volumeComponent.Name] = info
238
- volumeNameToVolumeOptions[volumeComponent.Name] = volumeOptions{
239
- Info: info,
240
- Size: volumeComponent.Volume.Size,
241
- IsEphemeral: *volumeComponent.Volume.Ephemeral,
242
- }
243
- }
244
-
245
- volumeParams := generator.VolumeParams{
246
- Containers: allContainers,
247
- VolumeNameToVolumeInfo: volumeNameToVolumeInfo,
248
- }
249
- options := common.DevfileOptions{}
250
- // "containers" and "initContainers" are updated in place with the volume mounts parameters
251
- // after the following function is called
252
- volumes, err := generator.GetVolumesAndVolumeMounts(d.devfileObj, volumeParams, options)
253
- if err != nil {
254
- return nil, nil, nil, nil, err
255
- }
256
- // sort all volumes and volume mounts in the containers and initContainers
257
- // to keep the array order deterministic
258
- sort.SliceStable(volumes, func(i, j int) bool {
259
- return volumes[i].Name < volumes[j].Name
260
- })
261
- for _, container := range containers {
262
- sort.SliceStable(container.VolumeMounts, func(i, j int) bool {
263
- return container.VolumeMounts[i].Name < container.VolumeMounts[j].Name
264
- })
265
- }
266
- for _, initContainer := range initContainers {
267
- sort.SliceStable(initContainer.VolumeMounts, func(i, j int) bool {
268
- return initContainer.VolumeMounts[i].Name < initContainer.VolumeMounts[j].Name
269
- })
270
- }
271
- return containers, initContainers, volumes, volumeNameToVolumeOptions, nil
272
- }
273
-
274
225
  func (d Devfile) hasContainerComponents() (bool, error) {
275
226
  containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
276
227
  if err != nil {
data/ext/volume.go ADDED
@@ -0,0 +1,117 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "github.com/devfile/library/v2/pkg/devfile/generator"
6
+ "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
7
+ corev1 "k8s.io/api/core/v1"
8
+ "k8s.io/apimachinery/pkg/api/resource"
9
+ "strings"
10
+ )
11
+
12
+ func (d Devfile) getVolumesAndVolumeMounts(containers []corev1.Container, initContainers []corev1.Container, volumeNamePrefix string) ([]corev1.Volume, map[string]pvcOptions, error) {
13
+ containerComponents, err := d.devfileObj.Data.GetDevfileContainerComponents(common.DevfileOptions{})
14
+ if err != nil {
15
+ return nil, nil, err
16
+ }
17
+ volumeComponents, err := d.devfileObj.Data.GetDevfileVolumeComponents(common.DevfileOptions{})
18
+ if err != nil {
19
+ return nil, nil, err
20
+ }
21
+
22
+ var volumes []corev1.Volume
23
+ pvcNameToPvcOptions := map[string]pvcOptions{}
24
+ for _, volumeComponent := range volumeComponents {
25
+ volumeName := fmt.Sprintf("%s-%s", volumeNamePrefix, volumeComponent.Name)
26
+ if bool(*volumeComponent.Volume.Ephemeral) == true {
27
+ emptyDir, err := getEmptyDir(volumeName, volumeComponent.Volume.Size)
28
+ if err != nil {
29
+ return nil, nil, err
30
+ }
31
+ volumes = append(volumes, emptyDir)
32
+ } else {
33
+ volumes = append(volumes, getPersistentVolumeClaim(volumeName, volumeName))
34
+ pvcNameToPvcOptions[volumeComponent.Name] = pvcOptions{
35
+ Name: volumeName,
36
+ Size: volumeComponent.Volume.Size,
37
+ }
38
+ }
39
+ // containerNameToMountPaths is a map of the Devfile container name to their Devfile Volume Mount Paths for a given Volume Name
40
+ containerNameToMountPaths := make(map[string][]string)
41
+ for _, containerComp := range containerComponents {
42
+ for _, volumeMount := range containerComp.Container.VolumeMounts {
43
+ if volumeComponent.Name == volumeMount.Name {
44
+ containerNameToMountPaths[containerComp.Name] = append(containerNameToMountPaths[containerComp.Name], generator.GetVolumeMountPath(volumeMount))
45
+ }
46
+ }
47
+ }
48
+
49
+ addVolumeMountToContainers(containers, initContainers, volumeName, containerNameToMountPaths)
50
+ }
51
+
52
+ return volumes, pvcNameToPvcOptions, nil
53
+ }
54
+
55
+ // addVolumeMountToContainers adds the Volume Mounts in containerNameToMountPaths to the containers for a given pvc and volumeName
56
+ // containerNameToMountPaths is a map of a container name to an array of its Mount Paths.
57
+ // To be moved to devfile/library.
58
+ func addVolumeMountToContainers(containers []corev1.Container, initContainers []corev1.Container, volumeName string, containerNameToMountPaths map[string][]string) {
59
+
60
+ for containerName, mountPaths := range containerNameToMountPaths {
61
+ for i := range containers {
62
+ if containers[i].Name == containerName {
63
+ for _, mountPath := range mountPaths {
64
+ containers[i].VolumeMounts = append(containers[i].VolumeMounts, corev1.VolumeMount{
65
+ Name: volumeName,
66
+ MountPath: mountPath,
67
+ SubPath: "",
68
+ },
69
+ )
70
+ }
71
+ }
72
+ }
73
+ for i := range initContainers {
74
+ if strings.HasPrefix(initContainers[i].Name, containerName) {
75
+ for _, mountPath := range mountPaths {
76
+ initContainers[i].VolumeMounts = append(initContainers[i].VolumeMounts, corev1.VolumeMount{
77
+ Name: volumeName,
78
+ MountPath: mountPath,
79
+ SubPath: "",
80
+ },
81
+ )
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+ // getPersistentVolumeClaim gets a pvc type volume with the given volume name and pvc name.
89
+ func getPersistentVolumeClaim(volumeName, pvcName string) corev1.Volume {
90
+
91
+ return corev1.Volume{
92
+ Name: volumeName,
93
+ VolumeSource: corev1.VolumeSource{
94
+ PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
95
+ ClaimName: pvcName,
96
+ },
97
+ },
98
+ }
99
+ }
100
+
101
+ // getEmptyDir gets an emptyDir type volume with the given volume name and size.
102
+ // size should be parseable as a Kubernetes `Quantity` or an error will be returned
103
+ func getEmptyDir(volumeName string, size string) (corev1.Volume, error) {
104
+
105
+ emptyDir := &corev1.EmptyDirVolumeSource{}
106
+ qty, err := resource.ParseQuantity(size)
107
+ if err != nil {
108
+ return corev1.Volume{}, err
109
+ }
110
+ emptyDir.SizeLimit = &qty
111
+ return corev1.Volume{
112
+ Name: volumeName,
113
+ VolumeSource: corev1.VolumeSource{
114
+ EmptyDir: emptyDir,
115
+ },
116
+ }, nil
117
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devfile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12.pre.alpha1
4
+ version: 0.0.13.pre.alpha1
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - GitLab
@@ -24,6 +24,7 @@ files:
24
24
  - ext/go.mod
25
25
  - ext/go.sum
26
26
  - ext/main.go
27
+ - ext/volume.go
27
28
  - lib/devfile.rb
28
29
  homepage: https://gitlab.com
29
30
  licenses: