forked from kyma-project/kyma
/
deployment_resolver.go
101 lines (84 loc) · 3.91 KB
/
deployment_resolver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package k8s
import (
"context"
"github.com/golang/glog"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/domain/k8s/pretty"
scPretty "github.com/kyma-project/kyma/components/ui-api-layer/internal/domain/servicecatalog/pretty"
scaPretty "github.com/kyma-project/kyma/components/ui-api-layer/internal/domain/servicecatalogaddons/pretty"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/domain/shared"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/gqlerror"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/gqlschema"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/module"
"github.com/pkg/errors"
"k8s.io/api/apps/v1beta2"
api "k8s.io/api/apps/v1beta2"
)
//go:generate mockery -name=deploymentLister -output=automock -outpkg=automock -case=underscore
type deploymentLister interface {
List(namespace string) ([]*api.Deployment, error)
ListWithoutFunctions(namespace string) ([]*api.Deployment, error)
}
type deploymentResolver struct {
deploymentLister deploymentLister
deploymentConverter *deploymentConverter
scRetriever shared.ServiceCatalogRetriever
scaRetriever shared.ServiceCatalogAddonsRetriever
}
func newDeploymentResolver(deploymentLister deploymentLister, scRetriever shared.ServiceCatalogRetriever, scaRetriever shared.ServiceCatalogAddonsRetriever) *deploymentResolver {
return &deploymentResolver{
deploymentLister: deploymentLister,
scRetriever: scRetriever,
scaRetriever: scaRetriever,
}
}
func (r *deploymentResolver) DeploymentsQuery(ctx context.Context, namespace string, excludeFunctions *bool) ([]gqlschema.Deployment, error) {
var deployments []*v1beta2.Deployment
var err error
if excludeFunctions == nil || !*excludeFunctions {
deployments, err = r.deploymentLister.List(namespace)
} else {
deployments, err = r.deploymentLister.ListWithoutFunctions(namespace)
}
if err != nil {
glog.Error(errors.Wrapf(err, "while listing %s in namespace `%s`", pretty.Deployments, namespace))
return nil, gqlerror.New(err, pretty.Deployments, gqlerror.WithNamespace(namespace))
}
return r.deploymentConverter.ToGQLs(deployments), nil
}
func (r *deploymentResolver) DeploymentBoundServiceInstanceNamesField(ctx context.Context, deployment *gqlschema.Deployment) ([]string, error) {
if deployment == nil {
glog.Error(errors.New("%s cannot be empty in order to resolve ServiceInstanceNames for %s"), pretty.Deployment, pretty.Deployment)
return nil, gqlerror.NewInternal()
}
kind := "deployment"
if _, exists := deployment.Labels["function"]; exists {
kind = "function"
}
usages, err := r.scaRetriever.ServiceBindingUsage().ListForDeployment(deployment.Namespace, kind, deployment.Name)
if err != nil {
if module.IsDisabledModuleError(err) {
return nil, err
}
glog.Error(errors.Wrapf(err, "while listing %s for %s in namespace `%s`, name `%s` and kind `%s`", scaPretty.ServiceBindingUsages, pretty.Deployment, deployment.Namespace, deployment.Name, kind))
return nil, gqlerror.New(err, scaPretty.ServiceBindingUsages, gqlerror.WithNamespace(deployment.Namespace))
}
instanceNames := make(map[string]struct{})
for _, usage := range usages {
binding, err := r.scRetriever.ServiceBinding().Find(deployment.Namespace, usage.Spec.ServiceBindingRef.Name)
if err != nil {
if module.IsDisabledModuleError(err) {
return nil, err
}
glog.Error(errors.Wrapf(err, "while gathering %s for namespace `%s` with name `%s`", scPretty.ServiceBinding, deployment.Namespace, usage.Spec.ServiceBindingRef.Name))
return nil, gqlerror.New(err, scPretty.ServiceBinding, gqlerror.WithName(usage.Spec.ServiceBindingRef.Name), gqlerror.WithNamespace(deployment.Namespace))
}
if binding != nil {
instanceNames[binding.Spec.ServiceInstanceRef.Name] = struct{}{}
}
}
result := make([]string, 0, len(instanceNames))
for name := range instanceNames {
result = append(result, name)
}
return result, nil
}