devfile 0.0.5.pre.alpha1-arm64-darwin → 0.0.12.pre.alpha1-arm64-darwin

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7213c30bd262a47cc7230b2766d8af2af0d2d9e14f13d5deede4c80fc565abd7
4
- data.tar.gz: 14fb2059088725869adfb122c9da334d2890220be97dd46ec39eca2f9d502941
3
+ metadata.gz: 51f867c9659b085063e543b19d4aa1b368e0c5586dfb3753657195a0988a3477
4
+ data.tar.gz: 6fe5ebe8e2126969d14084a2b94df0056e42f00f7dd2bd66124f1e8e18e72fe3
5
5
  SHA512:
6
- metadata.gz: 3b0f12ae00f9f5752cb2da4c4805ce2323a7b0c79ce021a311a576ffea9d3436fbbeba04eab05037a7cf1b5cb9818461436e9ae5b3c2b55199b2a770d25c118f
7
- data.tar.gz: d483b86fd468e4d42104e7596b2e1a228de720a2b00889b34d43869f7817b667832f2e5d467f3bfa04444537c5ce922fb610dc44f17c6ffb8d0d914e3e222348
6
+ metadata.gz: a34eb8c12d90069e173cf18ea080e3a4c15e82d6e6e71ae969e7b1c192300c7f6eb36779faba39a44608522950c2eaeb6f0c948cc870ba1aad7ef5e998371b3f
7
+ data.tar.gz: d5cff0dd5b7d067cc42ba9f2d6c3c91c6ab0d3bf8253ab3406611a1791b1c28eb1d62dba3399dcc37d364875469ca5e5b4658f842e2a40d0618d489b05199642
data/bin/devfile CHANGED
Binary file
data/ext/devfile.go CHANGED
@@ -1,15 +1,19 @@
1
1
  package main
2
2
 
3
- import "C"
4
3
  import (
5
4
  "bytes"
5
+ "fmt"
6
+ "sort"
6
7
  "strconv"
7
8
  "text/template"
8
9
 
9
10
  "github.com/devfile/library/v2/pkg/devfile/generator"
10
11
  "github.com/devfile/library/v2/pkg/devfile/parser"
11
12
  "github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
13
+ appsv1 "k8s.io/api/apps/v1"
14
+ corev1 "k8s.io/api/core/v1"
12
15
  networkingv1 "k8s.io/api/networking/v1"
16
+ "k8s.io/apimachinery/pkg/api/resource"
13
17
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
18
  "k8s.io/apimachinery/pkg/runtime"
15
19
  "k8s.io/cli-runtime/pkg/printers"
@@ -20,16 +24,14 @@ type Devfile struct {
20
24
  devfileObj parser.DevfileObj
21
25
  }
22
26
 
23
- func (d Devfile) getDeployment(name, namespace string, labels, annotations map[string]string, replicas int) (runtime.Object, error) {
24
- containers, err := generator.GetContainers(d.devfileObj, common.DevfileOptions{})
25
- if err != nil {
26
- return nil, err
27
- }
28
- initContainers, err := generator.GetInitContainers(d.devfileObj)
29
- if err != nil {
30
- return nil, err
31
- }
32
- volumes, err := d.getVolumesAndVolumeMounts(containers, initContainers, name)
27
+ type volumeOptions struct {
28
+ Info generator.VolumeInfo
29
+ Size string
30
+ IsEphemeral bool
31
+ }
32
+
33
+ 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)
33
35
  if err != nil {
34
36
  return nil, err
35
37
  }
@@ -52,7 +54,7 @@ func (d Devfile) getDeployment(name, namespace string, labels, annotations map[s
52
54
  return deployment, err
53
55
  }
54
56
 
55
- func (d Devfile) getService(name, namespace string, labels, annotations map[string]string) (runtime.Object, error) {
57
+ func (d Devfile) getService(name, namespace string, labels, annotations map[string]string) (*corev1.Service, error) {
56
58
  service, err := generator.GetService(d.devfileObj, generator.ServiceParams{
57
59
  TypeMeta: generator.GetTypeMeta("Service", "v1"),
58
60
  ObjectMeta: generator.GetObjectMeta(name, namespace, labels, annotations),
@@ -65,7 +67,12 @@ func (d Devfile) getService(name, namespace string, labels, annotations map[stri
65
67
  return service, err
66
68
  }
67
69
 
68
- func (d Devfile) getIngress(name, namespace string, labels, annotations map[string]string, domainTemplate, ingressClass string) (runtime.Object, error) {
70
+ func (d Devfile) getIngress(name, namespace string, labels, annotations map[string]string, domainTemplate, ingressClass string) (*networkingv1.Ingress, error) {
71
+
72
+ if ingressClass == "none" {
73
+ return nil, nil
74
+ }
75
+
69
76
  components, err := d.devfileObj.Data.GetDevfileContainerComponents(common.DevfileOptions{})
70
77
  if err != nil {
71
78
  return nil, err
@@ -75,7 +82,10 @@ func (d Devfile) getIngress(name, namespace string, labels, annotations map[stri
75
82
  var rules []networkingv1.IngressRule
76
83
 
77
84
  // Create a new template and parse the letter into it.
78
- t := template.Must(template.New("domainTemplate").Parse(domainTemplate))
85
+ t, err := template.New("domainTemplate").Parse(domainTemplate)
86
+ if err != nil {
87
+ return nil, err
88
+ }
79
89
 
80
90
  for _, component := range components {
81
91
  for _, endpoint := range component.Container.Endpoints {
@@ -113,23 +123,16 @@ func (d Devfile) getIngress(name, namespace string, labels, annotations map[stri
113
123
  return nil, nil
114
124
  }
115
125
 
116
- // since annotations is a map, it is passed by reference in go
117
- // hence to modify it, create a new copy
118
- ingressAnnotations := map[string]string{
119
- "kubernetes.io/ingress.class": ingressClass,
120
- }
121
- for k, v := range annotations {
122
- ingressAnnotations[k] = v
123
- }
124
126
  ingress := &networkingv1.Ingress{
125
127
  TypeMeta: generator.GetTypeMeta("Ingress", "networking.k8s.io/v1"),
126
128
  ObjectMeta: metav1.ObjectMeta{
127
129
  Name: name,
128
130
  Namespace: namespace,
129
131
  Labels: labels,
130
- Annotations: ingressAnnotations,
132
+ Annotations: annotations,
131
133
  },
132
134
  Spec: networkingv1.IngressSpec{
135
+ IngressClassName: &ingressClass,
133
136
  //TLS: []networkingv1.IngressTLS{
134
137
  // {
135
138
  // Hosts: hosts,
@@ -143,21 +146,129 @@ func (d Devfile) getIngress(name, namespace string, labels, annotations map[stri
143
146
  return ingress, nil
144
147
  }
145
148
 
149
+ func (d Devfile) getPVC(name, namespace string, labels, annotations map[string]string) ([]*corev1.PersistentVolumeClaim, error) {
150
+ _, _, volumes, volumeNameToVolumeOptions, err := d.getContainersAndVolumes(name)
151
+ if err != nil {
152
+ return nil, err
153
+ }
154
+ 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)
161
+ if err != nil {
162
+ return nil, err
163
+ }
164
+ pvcParams := generator.PVCParams{
165
+ TypeMeta: generator.GetTypeMeta("PersistentVolumeClaim", "v1"),
166
+ ObjectMeta: metav1.ObjectMeta{
167
+ Name: volumeOptions.Info.PVCName,
168
+ Namespace: namespace,
169
+ Labels: labels,
170
+ Annotations: annotations,
171
+ },
172
+ Quantity: quantity,
173
+ }
174
+ pvc := generator.GetPVC(pvcParams)
175
+ pvcs = append(pvcs, pvc)
176
+ }
177
+ return pvcs, nil
178
+ }
179
+
146
180
  func (d Devfile) getAll(name, namespace string, labels, annotations map[string]string, replicas int, domainTemplate, ingressClass string) ([]runtime.Object, error) {
181
+
182
+ var result []runtime.Object
183
+
147
184
  deployment, err := d.getDeployment(name, namespace, labels, annotations, replicas)
148
185
  if err != nil {
149
186
  return nil, err
150
187
  }
188
+ result = append(result, deployment)
189
+
151
190
  service, err := d.getService(name, namespace, labels, annotations)
152
191
  if err != nil {
153
192
  return nil, err
154
193
  }
194
+ result = append(result, service)
195
+
155
196
  ingress, err := d.getIngress(name, namespace, labels, annotations, domainTemplate, ingressClass)
156
197
  if err != nil {
157
198
  return nil, err
158
199
  }
200
+ if ingress != nil {
201
+ result = append(result, ingress)
202
+ }
203
+
204
+ pvcs, err := d.getPVC(name, namespace, labels, annotations)
205
+ if err != nil {
206
+ return nil, err
207
+ }
208
+ for _, pvc := range pvcs {
209
+ result = append(result, pvc)
210
+ }
211
+
212
+ return result, nil
213
+ }
214
+
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...)
159
225
 
160
- return []runtime.Object{deployment, service, ingress}, nil
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
161
272
  }
162
273
 
163
274
  func (d Devfile) hasContainerComponents() (bool, error) {
data/ext/go.mod CHANGED
@@ -1,4 +1,4 @@
1
- module gitlab.com/gitlab-org/incubation-engineering/server-runtime/devfilerubyffi
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
@@ -9,11 +9,6 @@ import (
9
9
  "k8s.io/apimachinery/pkg/runtime"
10
10
  )
11
11
 
12
- type Result struct {
13
- content string
14
- err error
15
- }
16
-
17
12
  func main() {
18
13
  args := os.Args
19
14
 
@@ -25,27 +20,30 @@ func main() {
25
20
  fnName := os.Args[1]
26
21
  devfile := os.Args[2]
27
22
 
28
- var result Result
23
+ var content string
24
+ var err error
29
25
 
30
26
  switch fnName {
31
27
  case "deployment":
32
- result = getDeployment(devfile, args[3], args[4], args[5], args[6], args[7])
28
+ content, err = getDeployment(devfile, args[3], args[4], args[5], args[6], args[7])
33
29
  case "service":
34
- result = getService(devfile, args[3], args[4], args[5], args[6])
30
+ content, err = getService(devfile, args[3], args[4], args[5], args[6])
35
31
  case "ingress":
36
- result = getIngress(devfile, args[3], args[4], args[5], args[6], args[7], args[8])
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])
37
35
  case "all":
38
- result = getAll(devfile, args[3], args[4], args[5], args[6], args[7], args[8], args[9])
36
+ content, err = getAll(devfile, args[3], args[4], args[5], args[6], args[7], args[8], args[9])
39
37
  case "flatten":
40
- result = flatten(devfile)
38
+ content, err = flatten(devfile)
41
39
  }
42
40
 
43
- if result.err != nil {
44
- fmt.Fprint(os.Stderr, result.err)
41
+ if err != nil {
42
+ fmt.Fprint(os.Stderr, err)
45
43
  os.Exit(1)
46
44
  }
47
45
 
48
- fmt.Print(result.content)
46
+ fmt.Print(content)
49
47
  }
50
48
 
51
49
  func unmarshalKeyValuePair(data string) (map[string]string, error) {
@@ -57,147 +55,187 @@ func unmarshalKeyValuePair(data string) (map[string]string, error) {
57
55
  return values, err
58
56
  }
59
57
 
60
- func getDeployment(devfile, name, namespace, labelsStr, annotationsStr, replicas string) Result {
58
+ func getDeployment(devfile, name, namespace, labelsStr, annotationsStr, replicas string) (string, error) {
61
59
  d, err := parseDevfile(devfile)
62
60
  if err != nil {
63
- return Result{"", err}
61
+ return "", err
64
62
  }
65
63
  exists, err := d.hasContainerComponents()
66
64
  if err != nil {
67
- return Result{"", err}
65
+ return "", err
68
66
  }
69
- if exists == false {
70
- return Result{"", err}
67
+ if !exists {
68
+ return "", nil
71
69
  }
72
70
  labels, err := unmarshalKeyValuePair(labelsStr)
73
71
  if err != nil {
74
- return Result{"", err}
72
+ return "", err
75
73
  }
76
74
  annotations, err := unmarshalKeyValuePair(annotationsStr)
77
75
  if err != nil {
78
- return Result{"", err}
76
+ return "", err
79
77
  }
80
78
  replicasInt, err := strconv.Atoi(replicas)
81
79
  if err != nil {
82
- return Result{"", err}
80
+ return "", err
83
81
  }
84
82
  deployment, err := d.getDeployment(name, namespace, labels, annotations, replicasInt)
85
83
  if err != nil {
86
- return Result{"", err}
84
+ return "", err
87
85
  }
88
86
  content, err := marshalResources([]runtime.Object{deployment})
89
87
  if err != nil {
90
- return Result{"", err}
88
+ return "", err
91
89
  }
92
- return Result{content, nil}
90
+ return content, nil
93
91
  }
94
92
 
95
- func getService(devfile, name, namespace, labelsStr, annotationsStr string) Result {
93
+ func getService(devfile, name, namespace, labelsStr, annotationsStr string) (string, error) {
96
94
  d, err := parseDevfile(devfile)
97
95
  if err != nil {
98
- return Result{"", err}
96
+ return "", err
99
97
  }
100
98
  exists, err := d.hasContainerComponents()
101
99
  if err != nil {
102
- return Result{"", err}
100
+ return "", err
103
101
  }
104
- if exists == false {
105
- return Result{"", err}
102
+ if !exists {
103
+ return "", nil
106
104
  }
107
105
  labels, err := unmarshalKeyValuePair(labelsStr)
108
106
  if err != nil {
109
- return Result{"", err}
107
+ return "", err
110
108
  }
111
109
  annotations, err := unmarshalKeyValuePair(annotationsStr)
112
110
  if err != nil {
113
- return Result{"", err}
111
+ return "", err
114
112
  }
115
113
  service, err := d.getService(name, namespace, labels, annotations)
116
114
  if err != nil {
117
- return Result{"", err}
115
+ return "", err
118
116
  }
119
117
  content, err := marshalResources([]runtime.Object{service})
120
118
  if err != nil {
121
- return Result{"", err}
119
+ return "", err
122
120
  }
123
- return Result{content, nil}
121
+ return content, nil
124
122
  }
125
123
 
126
- func getIngress(devfile, name, namespace, labelsStr, annotationsStr, domainTemplate, ingressClass string) Result {
124
+ func getIngress(devfile, name, namespace, labelsStr, annotationsStr, domainTemplate, ingressClass string) (string, error) {
127
125
  d, err := parseDevfile(devfile)
128
126
  if err != nil {
129
- return Result{"", err}
127
+ return "", err
130
128
  }
131
129
  exists, err := d.hasContainerComponents()
132
130
  if err != nil {
133
- return Result{"", err}
131
+ return "", err
134
132
  }
135
- if exists == false {
136
- return Result{"", err}
133
+ if !exists {
134
+ return "", nil
137
135
  }
138
136
  labels, err := unmarshalKeyValuePair(labelsStr)
139
137
  if err != nil {
140
- return Result{"", err}
138
+ return "", err
141
139
  }
142
140
  annotations, err := unmarshalKeyValuePair(annotationsStr)
143
141
  if err != nil {
144
- return Result{"", err}
142
+ return "", err
145
143
  }
146
144
  ingress, err := d.getIngress(name, namespace, labels, annotations, domainTemplate, ingressClass)
147
145
  if err != nil {
148
- return Result{"", err}
146
+ return "", err
149
147
  }
148
+
149
+ if ingress == nil {
150
+ return "", nil
151
+ }
152
+
150
153
  content, err := marshalResources([]runtime.Object{ingress})
151
154
  if err != nil {
152
- return Result{"", err}
155
+ return "", err
156
+ }
157
+ return content, nil
158
+ }
159
+
160
+ func getPVC(devfile, name, namespace, labelsStr, annotationsStr string) (string, error) {
161
+ d, err := parseDevfile(devfile)
162
+ if err != nil {
163
+ return "", err
164
+ }
165
+ exists, err := d.hasContainerComponents()
166
+ if err != nil {
167
+ return "", err
168
+ }
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
153
191
  }
154
- return Result{content, nil}
192
+ return content, nil
155
193
  }
156
194
 
157
- func getAll(devfile string, name, namespace, labelsStr, annotationsStr, replicas, domainTemplate, ingressClass string) Result {
195
+ func getAll(devfile string, name, namespace, labelsStr, annotationsStr, replicas, domainTemplate, ingressClass string) (string, error) {
158
196
  d, err := parseDevfile(devfile)
159
197
  if err != nil {
160
- return Result{"", err}
198
+ return "", err
161
199
  }
162
200
  exists, err := d.hasContainerComponents()
163
201
  if err != nil {
164
- return Result{"", err}
202
+ return "", err
165
203
  }
166
- if exists == false {
167
- return Result{"", err}
204
+ if !exists {
205
+ return "", nil
168
206
  }
169
207
  labels, err := unmarshalKeyValuePair(labelsStr)
170
208
  if err != nil {
171
- return Result{"", err}
209
+ return "", err
172
210
  }
173
211
  annotations, err := unmarshalKeyValuePair(annotationsStr)
174
212
  if err != nil {
175
- return Result{"", err}
213
+ return "", err
176
214
  }
177
215
  replicasInt, err := strconv.Atoi(replicas)
178
216
  if err != nil {
179
- return Result{"", err}
217
+ return "", err
180
218
  }
181
219
  resources, err := d.getAll(name, namespace, labels, annotations, replicasInt, domainTemplate, ingressClass)
182
220
  if err != nil {
183
- return Result{"", err}
221
+ return "", err
184
222
  }
185
223
  content, err := marshalResources(resources)
186
224
  if err != nil {
187
- return Result{"", err}
225
+ return "", err
188
226
  }
189
- return Result{content, nil}
227
+ return content, nil
190
228
  }
191
229
 
192
- func flatten(devfile string) Result {
230
+ func flatten(devfile string) (string, error) {
193
231
  d, err := parseDevfile(devfile)
194
232
  if err != nil {
195
- return Result{"", err}
233
+ return "", err
196
234
  }
197
235
  flattenedDevfile := d.getFlattenedDevfileContent()
198
236
  content, err := marshalDevfile(flattenedDevfile)
199
237
  if err != nil {
200
- return Result{"", err}
238
+ return "", err
201
239
  }
202
- return Result{content, nil}
240
+ return content, err
203
241
  }
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.5.pre.alpha1
4
+ version: 0.0.12.pre.alpha1
5
5
  platform: arm64-darwin
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-09 00:00:00.000000000 Z
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: spatnaik@gitlab.com
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: []
@@ -21,7 +24,6 @@ files:
21
24
  - ext/go.mod
22
25
  - ext/go.sum
23
26
  - ext/main.go
24
- - ext/volume.go
25
27
  - lib/devfile.rb
26
28
  homepage: https://gitlab.com
27
29
  licenses:
@@ -43,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
45
  - !ruby/object:Gem::Version
44
46
  version: 1.3.1
45
47
  requirements: []
46
- rubygems_version: 3.4.7
48
+ rubygems_version: 3.4.9
47
49
  signing_key:
48
50
  specification_version: 4
49
51
  summary: Parse and generate kubernetes manifests from a Devfile
data/ext/volume.go DELETED
@@ -1,114 +0,0 @@
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, pvcNamePrefix string) ([]corev1.Volume, error) {
13
- containerComponents, err := d.devfileObj.Data.GetDevfileContainerComponents(common.DevfileOptions{})
14
- if err != nil {
15
- return nil, err
16
- }
17
- volumeComponents, err := d.devfileObj.Data.GetDevfileVolumeComponents(common.DevfileOptions{})
18
- if err != nil {
19
- return nil, err
20
- }
21
-
22
- var volumes []corev1.Volume
23
- for _, volumeComponent := range volumeComponents {
24
- volName := volumeComponent.Name
25
- if bool(*volumeComponent.Volume.Ephemeral) == true {
26
- emptyDir, err := getEmptyDir(volName, volumeComponent.Volume.Size)
27
- if err != nil {
28
- return nil, err
29
- }
30
- volumes = append(volumes, emptyDir)
31
- } else {
32
- // TODO: figure this out; how should we pass PVC name? should the object be generated here?
33
- pvcName := fmt.Sprintf("%s-%s", pvcNamePrefix, volName)
34
- volumes = append(volumes, getPVC(volName, pvcName))
35
- }
36
- // containerNameToMountPaths is a map of the Devfile container name to their Devfile Volume Mount Paths for a given Volume Name
37
- containerNameToMountPaths := make(map[string][]string)
38
- for _, containerComp := range containerComponents {
39
- for _, volumeMount := range containerComp.Container.VolumeMounts {
40
- if volName == volumeMount.Name {
41
- containerNameToMountPaths[containerComp.Name] = append(containerNameToMountPaths[containerComp.Name], generator.GetVolumeMountPath(volumeMount))
42
- }
43
- }
44
- }
45
-
46
- addVolumeMountToContainers(containers, initContainers, volName, containerNameToMountPaths)
47
- }
48
-
49
- return volumes, nil
50
- }
51
-
52
- // addVolumeMountToContainers adds the Volume Mounts in containerNameToMountPaths to the containers for a given pvc and volumeName
53
- // containerNameToMountPaths is a map of a container name to an array of its Mount Paths.
54
- // To be moved to devfile/library.
55
- func addVolumeMountToContainers(containers []corev1.Container, initContainers []corev1.Container, volumeName string, containerNameToMountPaths map[string][]string) {
56
-
57
- for containerName, mountPaths := range containerNameToMountPaths {
58
- for i := range containers {
59
- if containers[i].Name == containerName {
60
- for _, mountPath := range mountPaths {
61
- containers[i].VolumeMounts = append(containers[i].VolumeMounts, corev1.VolumeMount{
62
- Name: volumeName,
63
- MountPath: mountPath,
64
- SubPath: "",
65
- },
66
- )
67
- }
68
- }
69
- }
70
- for i := range initContainers {
71
- if strings.HasPrefix(initContainers[i].Name, containerName) {
72
- for _, mountPath := range mountPaths {
73
- initContainers[i].VolumeMounts = append(initContainers[i].VolumeMounts, corev1.VolumeMount{
74
- Name: volumeName,
75
- MountPath: mountPath,
76
- SubPath: "",
77
- },
78
- )
79
- }
80
- }
81
- }
82
- }
83
- }
84
-
85
- // getPVC gets a pvc type volume with the given volume name and pvc name.
86
- func getPVC(volumeName, pvcName string) corev1.Volume {
87
-
88
- return corev1.Volume{
89
- Name: volumeName,
90
- VolumeSource: corev1.VolumeSource{
91
- PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
92
- ClaimName: pvcName,
93
- },
94
- },
95
- }
96
- }
97
-
98
- // getEmptyDir gets an emptyDir type volume with the given volume name and size.
99
- // size should be parseable as a Kubernetes `Quantity` or an error will be returned
100
- func getEmptyDir(volumeName string, size string) (corev1.Volume, error) {
101
-
102
- emptyDir := &corev1.EmptyDirVolumeSource{}
103
- qty, err := resource.ParseQuantity(size)
104
- if err != nil {
105
- return corev1.Volume{}, err
106
- }
107
- emptyDir.SizeLimit = &qty
108
- return corev1.Volume{
109
- Name: volumeName,
110
- VolumeSource: corev1.VolumeSource{
111
- EmptyDir: emptyDir,
112
- },
113
- }, nil
114
- }