Skip to content

Commit 9b3e1d1

Browse files
author
dimitraz
committed
Add watch and no-wait flag
1 parent 81b609b commit 9b3e1d1

File tree

2 files changed

+77
-39
lines changed

2 files changed

+77
-39
lines changed

pkg/cmd/integration.go

+76-38
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ import (
3030
"github.com/pkg/errors"
3131
"github.com/satori/go.uuid"
3232
"github.com/spf13/cobra"
33-
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
33+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3434
"k8s.io/apimachinery/pkg/runtime"
35+
"k8s.io/apimachinery/pkg/watch"
3536
"k8s.io/client-go/kubernetes"
3637
"k8s.io/client-go/pkg/api/v1"
3738
kalpha "k8s.io/client-go/pkg/apis/settings/v1alpha1"
@@ -53,7 +54,7 @@ func createBindingObject(consumer, provider, bindingName, instance string, param
5354
return nil, err
5455
}
5556
b := &v1beta1.ServiceBinding{
56-
ObjectMeta: meta_v1.ObjectMeta{
57+
ObjectMeta: metav1.ObjectMeta{
5758
Name: bindingName,
5859
Annotations: map[string]string{"consumer": consumer, "provider": provider},
5960
},
@@ -66,25 +67,25 @@ func createBindingObject(consumer, provider, bindingName, instance string, param
6667
return b, nil
6768
}
6869

69-
func podPreset(objectName, secretName, producerSvcName, consumerSvcName string) *kalpha.PodPreset {
70+
func podPreset(objectName, secretName, providerSvcName, consumerSvcName string) *kalpha.PodPreset {
7071
podPreset := kalpha.PodPreset{
71-
ObjectMeta: meta_v1.ObjectMeta{
72+
ObjectMeta: metav1.ObjectMeta{
7273
Name: objectName,
7374
Labels: map[string]string{
7475
"group": "mobile",
75-
"service": producerSvcName,
76+
"service": providerSvcName,
7677
},
7778
},
7879
Spec: kalpha.PodPresetSpec{
79-
Selector: meta_v1.LabelSelector{
80+
Selector: metav1.LabelSelector{
8081
MatchLabels: map[string]string{
8182
"run": consumerSvcName,
82-
producerSvcName: "enabled",
83+
providerSvcName: "enabled",
8384
},
8485
},
8586
Volumes: []v1.Volume{
8687
{
87-
Name: producerSvcName,
88+
Name: providerSvcName,
8889
VolumeSource: v1.VolumeSource{
8990
Secret: &v1.SecretVolumeSource{
9091
SecretName: secretName,
@@ -94,8 +95,8 @@ func podPreset(objectName, secretName, producerSvcName, consumerSvcName string)
9495
},
9596
VolumeMounts: []v1.VolumeMount{
9697
{
97-
Name: producerSvcName,
98-
MountPath: "/etc/secrets/" + producerSvcName,
98+
Name: providerSvcName,
99+
MountPath: "/etc/secrets/" + providerSvcName,
99100
},
100101
},
101102
},
@@ -112,7 +113,7 @@ mobile --namespace=myproject create integration <consuming_service_instance_id>
112113
oc plugin mobile create integration <consuming_service_instance_id> <providing_service_instance_id>
113114
`,
114115
RunE: func(cmd *cobra.Command, args []string) error {
115-
if len(args) < 2 {
116+
if len(args) != 2 {
116117
return cmd.Usage()
117118
}
118119
namespace, err := currentNamespace(cmd.Flags())
@@ -122,51 +123,88 @@ oc plugin mobile create integration <consuming_service_instance_id> <providing_s
122123

123124
consumerSvcInstName := args[0]
124125
providerSvcInstName := args[1]
125-
providerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(providerSvcInstName, meta_v1.GetOptions{})
126+
providerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(providerSvcInstName, metav1.GetOptions{})
126127
if err != nil {
127-
return err
128+
return errors.WithStack(err)
128129
}
129-
consumerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(consumerSvcInstName, meta_v1.GetOptions{})
130+
consumerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(consumerSvcInstName, metav1.GetOptions{})
130131
if err != nil {
131-
return err
132+
return errors.WithStack(err)
132133
}
133-
//todo remove the need for these by updating the apbs to read the secrets themselves (https://github.com/feedhenry/keycloak-apb/issues/37)
134+
// todo remove the need for these by updating the apbs to read the secrets themselves (https://github.com/feedhenry/keycloak-apb/issues/37)
134135
consumerSvc := getService(namespace, consumerSvcInst.Labels["serviceName"], bc.k8Client) // the consumer service
135136
providerSvc := getService(namespace, providerSvcInst.Labels["serviceName"], bc.k8Client) // the provider service
136137
bindParams := buildBindParams(providerSvc, consumerSvc)
137138
objectName := objectName(consumerSvcInstName, providerSvcInstName)
138139
binding, err := createBindingObject(consumerSvc.Name, providerSvc.Name, objectName, providerSvcInst.Name, bindParams, objectName)
139140
if err != nil {
140-
return err
141+
return errors.WithStack(err)
141142
}
142-
if _, err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).Create(binding); err != nil {
143-
return err
143+
sb, err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).Create(binding)
144+
if err != nil {
145+
return errors.WithStack(err)
144146
}
145147
preset := podPreset(objectName, objectName, providerSvc.Name, consumerSvc.Name)
146148
if _, err := bc.k8Client.SettingsV1alpha1().PodPresets(namespace).Create(preset); err != nil {
147149
return errors.Wrap(err, "failed to create pod preset for service ")
148150
}
149151
redeploy, err := cmd.PersistentFlags().GetBool("auto-redeploy")
150152
if err != nil {
151-
return err
153+
return errors.WithStack(err)
152154
}
153155
if !redeploy {
154156
fmt.Println("you will need to redeploy your service/pod to pick up the changes")
155157
return nil
156158
}
157-
//update the deployment with an annotation
158-
dep, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Get(consumerSvc.Name, meta_v1.GetOptions{})
159+
// update the deployment with an annotation
160+
dep, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Get(consumerSvc.Name, metav1.GetOptions{})
159161
if err != nil {
160162
return errors.Wrap(err, "failed to get deployment for service "+consumerSvcInstName)
161163
}
162164
dep.Spec.Template.Labels[providerSvc.Name] = "enabled"
163165
if _, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Update(dep); err != nil {
164-
return errors.Wrap(err, "failed up update deployment for "+consumerSvcInstName)
166+
return errors.Wrap(err, "failed to update deployment for service "+consumerSvcInstName)
167+
}
168+
169+
// exit immediately
170+
noWait, err := cmd.PersistentFlags().GetBool("no-wait")
171+
if err != nil {
172+
return errors.WithStack(err)
173+
}
174+
if noWait {
175+
return nil
176+
}
177+
178+
// else watch
179+
id := sb.Spec.ExternalID
180+
w, err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).Watch(metav1.ListOptions{LabelSelector: "id=" + id})
181+
if err != nil {
182+
return errors.WithStack(err)
183+
}
184+
for u := range w.ResultChan() {
185+
o := u.Object.(*v1beta1.ServiceBinding)
186+
switch u.Type {
187+
case watch.Error:
188+
w.Stop()
189+
return errors.New("unexpected error watching service binding " + err.Error())
190+
case watch.Modified:
191+
for _, c := range o.Status.Conditions {
192+
fmt.Println("status: " + c.Message)
193+
if c.Type == "Ready" && c.Status == "True" {
194+
w.Stop()
195+
}
196+
if c.Type == "Failed" {
197+
w.Stop()
198+
return errors.New("Failed to create integration: " + c.Message)
199+
}
200+
}
201+
}
165202
}
166203

167204
return nil
168205
},
169206
}
207+
cmd.PersistentFlags().Bool("no-wait", false, "--no-wait will cause the command to exit immediately after a successful response instead of waiting until the binding is complete")
170208
cmd.PersistentFlags().Bool("auto-redeploy", false, "--auto-redeploy=true will cause a backing deployment to be rolled out")
171209
return cmd
172210
}
@@ -184,7 +222,7 @@ mobile --namespace=myproject delete integration <consuming_service_instance_id>
184222
oc plugin mobile delete integration <consuming_service_instance_id> <providing_service_instance_id>
185223
`,
186224
RunE: func(cmd *cobra.Command, args []string) error {
187-
if len(args) < 2 {
225+
if len(args) != 2 {
188226
return cmd.Usage()
189227
}
190228
namespace, err := currentNamespace(cmd.Flags())
@@ -194,39 +232,39 @@ oc plugin mobile delete integration <consuming_service_instance_id> <providing_s
194232
consumerSvcInstName := args[0]
195233
providerSvcInstName := args[1]
196234

197-
consumerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(consumerSvcInstName, meta_v1.GetOptions{})
235+
consumerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(consumerSvcInstName, metav1.GetOptions{})
198236
if err != nil {
199-
return err
237+
return errors.WithStack(err)
200238
}
201-
providerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(providerSvcInstName, meta_v1.GetOptions{})
239+
providerSvcInst, err := bc.scClient.ServicecatalogV1beta1().ServiceInstances(namespace).Get(providerSvcInstName, metav1.GetOptions{})
202240
if err != nil {
203-
return err
241+
return errors.WithStack(err)
204242
}
205243
consumerSvcName := consumerSvcInst.Labels["serviceName"]
206244
providerSvcName := providerSvcInst.Labels["serviceName"]
207245
objectName := objectName(consumerSvcInstName, providerSvcInstName)
208-
if err := bc.k8Client.SettingsV1alpha1().PodPresets(namespace).Delete(objectName, meta_v1.NewDeleteOptions(0)); err != nil {
209-
return err
246+
if err := bc.k8Client.SettingsV1alpha1().PodPresets(namespace).Delete(objectName, metav1.NewDeleteOptions(0)); err != nil {
247+
return errors.WithStack(err)
210248
}
211-
if err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).Delete(objectName, meta_v1.NewDeleteOptions(0)); err != nil {
212-
return err
249+
if err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).Delete(objectName, metav1.NewDeleteOptions(0)); err != nil {
250+
return errors.WithStack(err)
213251
}
214252
redeploy, err := cmd.PersistentFlags().GetBool("auto-redeploy")
215253
if err != nil {
216-
return err
254+
return errors.WithStack(err)
217255
}
218256
if !redeploy {
219257
fmt.Println("you will need to redeploy your service to pick up the changes")
220258
return nil
221259
}
222260
//update the deployment with an annotation
223-
dep, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Get(consumerSvcName, meta_v1.GetOptions{})
261+
dep, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Get(consumerSvcName, metav1.GetOptions{})
224262
if err != nil {
225263
return errors.Wrap(err, "failed to get deployment for service "+consumerSvcInstName)
226264
}
227265
delete(dep.Spec.Template.Labels, providerSvcName)
228266
if _, err := bc.k8Client.AppsV1beta1().Deployments(namespace).Update(dep); err != nil {
229-
return errors.Wrap(err, "failed up update deployment for "+consumerSvcInstName)
267+
return errors.Wrap(err, "failed to update deployment for service "+consumerSvcInstName)
230268
}
231269
return nil
232270
},
@@ -256,13 +294,13 @@ func (bc *IntegrationCmd) ListIntegrationsCmd() *cobra.Command {
256294
if err != nil {
257295
return errors.Wrap(err, "failed to get namespace")
258296
}
259-
sbList, err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).List(meta_v1.ListOptions{})
297+
sbList, err := bc.scClient.ServicecatalogV1beta1().ServiceBindings(namespace).List(metav1.ListOptions{})
260298
if err != nil {
261-
return err
299+
return errors.WithStack(err)
262300
}
263301
outType := outputType(cmd.Flags())
264302
if err := bc.Out.Render("list"+cmd.Name(), outType, sbList); err != nil {
265-
return err
303+
return errors.WithStack(err)
266304
}
267305
return nil
268306
},

pkg/cmd/integration_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ func TestIntegrationCmd_DeleteIntegrationCmd(t *testing.T) {
243243
},
244244
ExpectError: true,
245245
ValidateErr: func(t *testing.T, err error) {
246-
expectedErr := "missing arguments."
246+
expectedErr := "missing arguments: integration <consuming_service_instance_id> <providing_service_instance_id>"
247247
if err.Error() != expectedErr {
248248
t.Fatalf("expected error to be '%s' but got '%v'", expectedErr, err)
249249
}

0 commit comments

Comments
 (0)