Skip to content

Commit ed3cecd

Browse files
committed
update TSB so that it can handle secrets, but it's still generically broken
1 parent dd5cd96 commit ed3cecd

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

pkg/templateservicebroker/servicebroker/bind.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/golang/glog"
1313

1414
authorizationv1 "k8s.io/api/authorization/v1"
15+
corev1 "k8s.io/api/core/v1"
1516
kerrors "k8s.io/apimachinery/pkg/api/errors"
1617
"k8s.io/apimachinery/pkg/api/meta"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -215,15 +216,26 @@ func (b *Broker) Bind(u user.Info, instanceID, bindingID string, breq *api.BindR
215216
return api.Forbidden(err)
216217
}
217218

218-
obj, err := b.dynamicClient.Resource(mapping.Resource).Namespace(object.Ref.Namespace).Get(object.Ref.Name, metav1.GetOptions{})
219+
unstructuredObj, err := b.dynamicClient.Resource(mapping.Resource).Namespace(object.Ref.Namespace).Get(object.Ref.Name, metav1.GetOptions{})
219220
if err != nil {
220221
return api.InternalServerError(err)
221222
}
222223

223-
if obj.GetUID() != object.Ref.UID {
224+
if unstructuredObj.GetUID() != object.Ref.UID {
224225
return api.InternalServerError(kerrors.NewNotFound(mapping.Resource.GroupResource(), object.Ref.Name))
225226
}
226227

228+
var obj runtime.Object = unstructuredObj
229+
// TODO figure out how to fix this code to work generically. Right now it relies upon being able to fully decode a secret
230+
if object.Ref.GroupVersionKind().GroupKind() == kapi.Kind("Secret") {
231+
secretObj := &corev1.Secret{}
232+
err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredObj.Object, secretObj)
233+
if err != nil {
234+
return api.InternalServerError(err)
235+
}
236+
obj = secretObj
237+
}
238+
227239
err = updateCredentialsForObject(credentials, obj)
228240
if err != nil {
229241
return api.InternalServerError(err)

pkg/templateservicebroker/servicebroker/bind_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
faketemplatev1 "github.com/openshift/client-go/template/clientset/versioned/typed/template/v1/fake"
1010
templateapi "github.com/openshift/origin/pkg/template/apis/template"
1111
"github.com/openshift/origin/pkg/templateservicebroker/openservicebroker/api"
12+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1213

1314
authorizationv1 "k8s.io/api/authorization/v1"
1415
"k8s.io/apimachinery/pkg/api/errors"
@@ -141,6 +142,49 @@ func TestEvaluateJSONPathExpression(t *testing.T) {
141142
}
142143
}
143144

145+
func TestBase64AndString(t *testing.T) {
146+
t.Skip("this test is demonstrating the generic failure of the export value code for base64. You can't generic identify the base64 fields.")
147+
data := []byte(`{
148+
"apiVersion": "v1",
149+
"data": {
150+
"password": "c2VjcmV0Y3JlZHN5bmMK",
151+
"username": "c2VjcmV0Y3JlZHN5bmMK"
152+
},
153+
"kind": "Secret",
154+
"metadata": {
155+
"labels": {
156+
"credential.sync.jenkins.openshift.io": "true"
157+
},
158+
"name": "secret-to-credential"
159+
},
160+
"type": "Opaque"
161+
}`)
162+
163+
uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, data)
164+
if err != nil {
165+
t.Fatal(err)
166+
}
167+
obj := uncastObj.(*unstructured.Unstructured)
168+
t.Logf("%T", obj.Object["data"].(map[string]interface{})["password"])
169+
170+
actualString, err := evaluateJSONPathExpression(obj.Object, "dummy", "{.data.password}", false)
171+
if err != nil {
172+
t.Fatal(err)
173+
}
174+
if e, a := "secretcredsync", actualString; e != a {
175+
t.Errorf("expected %q, got %q", e, a)
176+
}
177+
178+
actualStringAsBase64, err := evaluateJSONPathExpression(obj.Object, "dummy", "{.data.password}", true)
179+
if err != nil {
180+
t.Fatal(err)
181+
}
182+
if e, a := "c2VjcmV0Y3JlZHN5bmMK", actualStringAsBase64; e != a {
183+
t.Errorf("expected %q, got %q", e, a)
184+
}
185+
186+
}
187+
144188
func TestDuplicateCredentialKeys(t *testing.T) {
145189
credentials := map[string]interface{}{}
146190
err := updateCredentialsForObject(credentials, &kapi.Secret{

0 commit comments

Comments
 (0)