Skip to content

Commit

Permalink
Fix secret operations in Service Binding related requests (#812)
Browse files Browse the repository at this point in the history
* Fix fetching secrets in GET Service Bindings

* Fix secret creation in POST Service Binding

* Fix assertion in test
  • Loading branch information
szwedm authored and kyma-gopher-bot committed Aug 22, 2024
1 parent 91c50af commit 70d0b0b
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 22 deletions.
35 changes: 22 additions & 13 deletions internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ func (a *API) ListServiceBindings(writer http.ResponseWriter, request *http.Requ
a.handleError(writer, err)
return
}
if sbs == nil || len(sbs.Items) == 0 {
a.sendResponse(writer, nil, http.StatusNoContent)
return
}
sbSecrets := a.ServiceBindingsSecrets(sbs)
sbsVM, err := responses.ToServiceBindingsVM(sbs, sbSecrets)
if err != nil {
Expand All @@ -213,8 +217,8 @@ func (a *API) ListServiceBindings(writer http.ResponseWriter, request *http.Requ

func (a *API) CreateServiceBinding(writer http.ResponseWriter, request *http.Request) {
a.setupCors(writer, request)
var serviceBindingRequest requests.CreateServiceBinding
err := json.NewDecoder(request.Body).Decode(&serviceBindingRequest)
serviceBindingRequest := &requests.CreateServiceBinding{}
err := json.NewDecoder(request.Body).Decode(serviceBindingRequest)
if err != nil {
a.handleError(writer, err)
return
Expand All @@ -229,12 +233,17 @@ func (a *API) CreateServiceBinding(writer http.ResponseWriter, request *http.Req
a.handleError(writer, err)
return
}
createdServiceBinding, err := a.smClient.CreateServiceBinding(&sb)
createdServiceBinding, err := a.smClient.CreateServiceBinding(sb)
if err != nil {
a.handleError(writer, err)
return
}
secret, err := generateSecretFromSISBData(si, createdServiceBinding, &serviceBindingRequest)
secret, err := generateSecretFromSISBData(si, createdServiceBinding, serviceBindingRequest)
if err != nil {
a.handleError(writer, err)
return
}
sbVM, err := responses.ToServiceBindingVM(createdServiceBinding)
if err != nil {
a.handleError(writer, err)
return
Expand All @@ -245,11 +254,8 @@ func (a *API) CreateServiceBinding(writer http.ResponseWriter, request *http.Req
a.handleError(writer, err)
return
}
}
sbVM, err := responses.ToServiceBindingVM(createdServiceBinding)
if err != nil {
a.handleError(writer, err)
return
sbVM.SecretName = secret.Name
sbVM.SecretNamespace = secret.Namespace
}
response, err := json.Marshal(sbVM)
if err != nil {
Expand Down Expand Up @@ -418,14 +424,14 @@ func (a *API) handleError(writer http.ResponseWriter, errToHandle error, fallbac
}

func (a *API) ServiceBindingsSecrets(sbs *types.ServiceBindings) responses.ServiceBindingSecret {
serviceBindingsSecrets := make(responses.ServiceBindingSecret, 0)
serviceBindingsSecrets := make(responses.ServiceBindingSecret)
for _, sb := range sbs.Items {
secrets, err := a.secretsForGivenServiceBindingID(sb.ID)
if err != nil {
a.logger.Error("failed to get secrets for service binding", "service binding id", sb.ID, "error", err)
continue
}
if len(secrets.Items) > 0 {
if secrets != nil && len(secrets.Items) > 0 {
serviceBindingsSecrets[sb.ID] = &secrets.Items[0]
}
}
Expand Down Expand Up @@ -457,8 +463,11 @@ func generateSecretFromSISBData(si *types.ServiceInstance, sb *types.ServiceBind
clusterobject.ServiceInstanceIDLabel: si.ID,
clusterobject.ServiceInstanceNameLabel: si.Name,
}
if sb.Labels != nil && sb.Labels[types.ClusterIDLabel][0] != "" {
labels[clusterobject.ClusterIDLabel] = sb.Labels[types.ClusterIDLabel][0]
if sb.Labels != nil {
existingClusterIDLabels, exists := sb.Labels[types.ClusterIDLabel]
if exists && len(existingClusterIDLabels) > 0 {
labels[clusterobject.ClusterIDLabel] = existingClusterIDLabels[0]
}
}
creds, err := normalizeCredentials(sb.Credentials)
if err != nil {
Expand Down
8 changes: 4 additions & 4 deletions internal/api/requests/converters.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,21 @@ import (
"github.com/kyma-project/btp-manager/internal/service-manager/types"
)

func ToServiceBinding(request CreateServiceBinding, instance *types.ServiceInstance) (types.ServiceBinding, error) {
func ToServiceBinding(request *CreateServiceBinding, instance *types.ServiceInstance) (*types.ServiceBinding, error) {
clusterID, err := instance.ContextValueByFieldName(types.ContextClusterID)
if err != nil {
return types.ServiceBinding{}, err
return nil, err
}
namespace, err := instance.ContextValueByFieldName(types.ContextNamespace)
if err != nil {
return types.ServiceBinding{}, err
return nil, err
}
labels := map[string][]string{
types.K8sNameLabel: {request.Name},
types.NamespaceLabel: {namespace},
types.ClusterIDLabel: {clusterID},
}
sb := types.ServiceBinding{
sb := &types.ServiceBinding{
Common: types.Common{
Name: request.Name,
Labels: labels,
Expand Down
6 changes: 3 additions & 3 deletions internal/api/responses/converters.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import (
"encoding/json"

"github.com/kyma-project/btp-manager/internal/service-manager/types"
v1 "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
)

type ServiceBindingSecret map[string]*v1.Secret
type ServiceBindingSecret map[string]*corev1.Secret

func ToSecretVM(list v1.SecretList) Secrets {
func ToSecretVM(list corev1.SecretList) Secrets {
secrets := Secrets{
Items: []Secret{},
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cluster-object/secret_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ func (p *SecretManager) GetAllByLabels(ctx context.Context, labels map[string]st

if len(secrets.Items) == 0 {
p.logger.Warn(fmt.Sprintf("no secrets found with labels: %v", labels))
return nil, err
return secrets, err
}

return secrets, err
Expand Down
2 changes: 1 addition & 1 deletion internal/cluster-object/secret_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ func TestSecretManager(t *testing.T) {
// when
actualSecrets, err := secretManager.GetAllByLabels(context.TODO(), map[string]string{"foo": "bar"})
require.NoError(t, err)
assert.Nil(t, actualSecrets)
assert.Empty(t, actualSecrets.Items)

// when
actualSecrets, err = secretManager.GetAllByLabels(context.TODO(), map[string]string{"keep": "me"})
Expand Down

0 comments on commit 70d0b0b

Please sign in to comment.