Skip to content

Commit e66e8ca

Browse files
authored
Adds support for linking a Devfile component with an Operator backed service (redhat-developer#3557)
* Add dependency on service binding operator * Add extra dependencies for service binding operator * Adds support for odo link between component and operator hub service * Add owner reference for the link * Deals with inability to install SBO the OLM way on k8s redhat-developer/service-binding-operator#536 * Adds and removes 'odo link' entry to/from env.yaml * Makes odo push set appropriate "envFrom" for a podTemplateSpec * Changes to unit test & those based on PR feedback * Rebase and "glide update -v" * Make the linter happy. Remove unused variables * Fix unit test of envinfo to include 'link' paramter * Move 'odo link' tests under operator hub tests * Install SBO on the cluster * Changes as per PR feedback * Check for Operator before trying to create a link * Change error message expected in tests * Make example less confusing by using less 'example'
1 parent 5644c53 commit e66e8ca

File tree

1,183 files changed

+92344
-59161
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,183 files changed

+92344
-59161
lines changed

glide.lock

+24-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

+9-4
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,20 @@ import:
8888
version: v1.3.3
8989
subpackages:
9090
- errdefs
91-
- package: github.com/google/go-github/github
91+
- package: github.com/google/go-github
9292
version: v30.1.0
93+
subpackages:
94+
- github
9395
- package: github.com/golang/mock
9496
version: v1.4.3
95-
# help glide with go mod submodule tag
9697
- package: github.com/Azure/go-autorest
9798
version: autorest/v0.9.0
98-
# use older version due to https://github.com/hashicorp/go-multierror/issues/36
9999
- package: github.com/hashicorp/go-multierror
100100
version: v1.0.0
101101
- package: github.com/zalando/go-keyring
102-
version: master
102+
version: master
103+
- package: github.com/redhat-developer/service-binding-operator
104+
version: v0.1.1
105+
- package: github.com/openshift/custom-resource-status
106+
- package: sigs.k8s.io/controller-runtime/
107+
version: v0.6.0

pkg/devfile/adapters/kubernetes/component/adapter.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88

99
componentlabels "github.com/openshift/odo/pkg/component/labels"
10+
"github.com/openshift/odo/pkg/envinfo"
1011
"github.com/openshift/odo/pkg/exec"
1112

1213
corev1 "k8s.io/api/core/v1"
@@ -107,7 +108,7 @@ func (a Adapter) Push(parameters common.PushParameters) (err error) {
107108
parameters.ForceBuild = true
108109
}
109110

110-
err = a.createOrUpdateComponent(componentExists)
111+
err = a.createOrUpdateComponent(componentExists, parameters.EnvSpecificInfo)
111112
if err != nil {
112113
return errors.Wrap(err, "unable to create or update component")
113114
}
@@ -211,7 +212,7 @@ func (a Adapter) DoesComponentExist(cmpName string) (bool, error) {
211212
return utils.ComponentExists(a.Client, cmpName)
212213
}
213214

214-
func (a Adapter) createOrUpdateComponent(componentExists bool) (err error) {
215+
func (a Adapter) createOrUpdateComponent(componentExists bool, ei envinfo.EnvSpecificInfo) (err error) {
215216
componentName := a.ComponentName
216217

217218
componentType := strings.TrimSuffix(a.AdapterContext.Devfile.Data.GetMetadata().Name, "-")
@@ -234,6 +235,12 @@ func (a Adapter) createOrUpdateComponent(componentExists bool) (err error) {
234235
return err
235236
}
236237

238+
// set EnvFrom to the container that's supposed to have link to the Operator backed service
239+
containers, err = utils.UpdateContainerWithEnvFrom(containers, a.Devfile, a.devfileRunCmd, ei)
240+
if err != nil {
241+
return err
242+
}
243+
237244
objectMeta := kclient.CreateObjectMeta(componentName, a.Client.Namespace, labels, nil)
238245
podTemplateSpec := kclient.GeneratePodTemplateSpec(objectMeta, containers)
239246

pkg/devfile/adapters/kubernetes/component/adapter_test.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package component
33
import (
44
"testing"
55

6+
"github.com/openshift/odo/pkg/envinfo"
67
"github.com/openshift/odo/pkg/util"
78
"github.com/pkg/errors"
89

@@ -39,30 +40,35 @@ func TestCreateOrUpdateComponent(t *testing.T) {
3940
tests := []struct {
4041
name string
4142
componentType versionsCommon.DevfileComponentType
43+
envInfo envinfo.EnvSpecificInfo
4244
running bool
4345
wantErr bool
4446
}{
4547
{
4648
name: "Case 1: Invalid devfile",
4749
componentType: "",
50+
envInfo: envinfo.EnvSpecificInfo{},
4851
running: false,
4952
wantErr: true,
5053
},
5154
{
5255
name: "Case 2: Valid devfile",
5356
componentType: versionsCommon.ContainerComponentType,
57+
envInfo: envinfo.EnvSpecificInfo{},
5458
running: false,
5559
wantErr: false,
5660
},
5761
{
5862
name: "Case 3: Invalid devfile, already running component",
5963
componentType: "",
64+
envInfo: envinfo.EnvSpecificInfo{},
6065
running: true,
6166
wantErr: true,
6267
},
6368
{
6469
name: "Case 4: Valid devfile, already running component",
6570
componentType: versionsCommon.ContainerComponentType,
71+
envInfo: envinfo.EnvSpecificInfo{},
6672
running: true,
6773
wantErr: false,
6874
},
@@ -98,7 +104,7 @@ func TestCreateOrUpdateComponent(t *testing.T) {
98104
}
99105

100106
componentAdapter := New(adapterCtx, *fkclient)
101-
err := componentAdapter.createOrUpdateComponent(tt.running)
107+
err := componentAdapter.createOrUpdateComponent(tt.running, tt.envInfo)
102108

103109
// Checks for unexpected error cases
104110
if !tt.wantErr == (err != nil) {
@@ -269,27 +275,31 @@ func TestDoesComponentExist(t *testing.T) {
269275
componentType versionsCommon.DevfileComponentType
270276
componentName string
271277
getComponentName string
278+
envInfo envinfo.EnvSpecificInfo
272279
want bool
273280
wantErr bool
274281
}{
275282
{
276283
name: "Case 1: Valid component name",
277284
componentName: "test-name",
278285
getComponentName: "test-name",
286+
envInfo: envinfo.EnvSpecificInfo{},
279287
want: true,
280288
wantErr: false,
281289
},
282290
{
283291
name: "Case 2: Non-existent component name",
284292
componentName: "test-name",
285293
getComponentName: "fake-component",
294+
envInfo: envinfo.EnvSpecificInfo{},
286295
want: false,
287296
wantErr: false,
288297
},
289298
{
290299
name: "Case 3: Error condition",
291300
componentName: "test-name",
292301
getComponentName: "test-name",
302+
envInfo: envinfo.EnvSpecificInfo{},
293303
want: false,
294304
wantErr: true,
295305
},
@@ -317,7 +327,7 @@ func TestDoesComponentExist(t *testing.T) {
317327

318328
// DoesComponentExist requires an already started component, so start it.
319329
componentAdapter := New(adapterCtx, *fkclient)
320-
err := componentAdapter.createOrUpdateComponent(false)
330+
err := componentAdapter.createOrUpdateComponent(false, tt.envInfo)
321331

322332
// Checks for unexpected error cases
323333
if err != nil {

pkg/devfile/adapters/kubernetes/utils/utils.go

+37
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
adaptersCommon "github.com/openshift/odo/pkg/devfile/adapters/common"
99
devfileParser "github.com/openshift/odo/pkg/devfile/parser"
1010
"github.com/openshift/odo/pkg/devfile/parser/data/common"
11+
"github.com/openshift/odo/pkg/envinfo"
1112
"github.com/openshift/odo/pkg/kclient"
1213
"github.com/openshift/odo/pkg/util"
1314

@@ -270,3 +271,39 @@ func overrideContainerArgs(container *corev1.Container) {
270271
container.Command = append(container.Command, adaptersCommon.SupervisordBinaryPath)
271272
container.Args = append(container.Args, "-c", adaptersCommon.SupervisordConfFile)
272273
}
274+
275+
// UpdateContainerWithEnvFrom populates the runtime container with relevant
276+
// values for "EnvFrom" so that component can be linked with Operator backed
277+
// service
278+
func UpdateContainerWithEnvFrom(containers []corev1.Container, devfile devfileParser.DevfileObj, devfileRunCmd string, ei envinfo.EnvSpecificInfo) ([]corev1.Container, error) {
279+
runCommand, err := adaptersCommon.GetRunCommand(devfile.Data, devfileRunCmd)
280+
if err != nil {
281+
return nil, err
282+
}
283+
284+
for i := range containers {
285+
c := &containers[i]
286+
if c.Name == runCommand.Exec.Component {
287+
c.EnvFrom = generateEnvFromSource(ei)
288+
}
289+
}
290+
291+
return containers, nil
292+
}
293+
294+
func generateEnvFromSource(ei envinfo.EnvSpecificInfo) []corev1.EnvFromSource {
295+
296+
envFrom := []corev1.EnvFromSource{}
297+
298+
for _, link := range ei.GetLink() {
299+
envFrom = append(envFrom, corev1.EnvFromSource{
300+
SecretRef: &corev1.SecretEnvSource{
301+
LocalObjectReference: corev1.LocalObjectReference{
302+
Name: link.Name,
303+
},
304+
},
305+
})
306+
}
307+
308+
return envFrom
309+
}

0 commit comments

Comments
 (0)