This repository has been archived by the owner on Sep 15, 2022. It is now read-only.
/
cluster_broker_facade.go
125 lines (106 loc) · 3.86 KB
/
cluster_broker_facade.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package broker
import (
"fmt"
"context"
multierror "github.com/hashicorp/go-multierror"
"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type clusterBrokerSyncer interface {
Sync() error
}
// ClusterFacade is responsible for creation k8s objects for namespaced broker
type ClusterFacade struct {
client client.Client
workingNamespace string
serviceName string
log logrus.FieldLogger
clusterBrokerName string
clusterBrokerSyncer clusterBrokerSyncer
}
// NewClusterBrokersFacade returns facade
func NewClusterBrokersFacade(client client.Client, workingNamespace, serviceName, clusterBrokerName string, log logrus.FieldLogger) *ClusterFacade {
return &ClusterFacade{
client: client,
workingNamespace: workingNamespace,
clusterBrokerName: clusterBrokerName,
serviceName: serviceName,
log: log.WithField("service", "cluster-broker-facade"),
}
}
// Create creates ClusterServiceBroker. Errors don't stop execution of method. AlreadyExist errors are ignored.
func (f *ClusterFacade) Create() error {
f.log.Infof("- creating ClusterServiceBroker %s", f.clusterBrokerName)
var resultErr *multierror.Error
svcURL := fmt.Sprintf("http://%s.%s.svc.cluster.local", f.serviceName, f.workingNamespace)
_, err := f.createClusterServiceBroker(svcURL)
if err != nil {
resultErr = multierror.Append(resultErr, err)
f.log.Warnf("Creation of ClusterServiceBroker %s results in error: [%s]. AlreadyExist errors will be ignored.", f.clusterBrokerName, err)
}
resultErr = filterOutMultiError(resultErr, ignoreAlreadyExist)
if resultErr == nil {
return nil
}
return resultErr
}
// Delete removes ClusterServiceBroker. Errors don't stop execution of method. NotFound errors are ignored.
func (f *ClusterFacade) Delete() error {
csb := &v1beta1.ClusterServiceBroker{
ObjectMeta: metav1.ObjectMeta{
Name: f.clusterBrokerName,
},
}
f.log.Infof("- deleting ClusterServiceBroker %s", f.clusterBrokerName)
err := f.client.Delete(context.Background(), csb)
switch {
case k8serrors.IsNotFound(err):
return nil
case err != nil:
f.log.Warnf("Deletion of ClusterServiceBroker %s results in error: [%s].", f.clusterBrokerName, err)
}
return err
}
// Exist check if ClusterServiceBroker exists.
func (f *ClusterFacade) Exist() (bool, error) {
err := f.client.Get(context.Background(), types.NamespacedName{Name: f.clusterBrokerName}, &v1beta1.ClusterServiceBroker{})
switch {
case k8serrors.IsNotFound(err):
return false, nil
case err != nil:
return false, errors.Wrapf(err, "while checking if ClusterServiceBroker [%s] exists", f.clusterBrokerName)
}
return true, nil
}
// createServiceBroker returns just created or existing ClusterServiceBroker
func (f *ClusterFacade) createClusterServiceBroker(svcURL string) (*v1beta1.ClusterServiceBroker, error) {
url := fmt.Sprintf("%s/cluster", svcURL)
broker := &v1beta1.ClusterServiceBroker{
ObjectMeta: metav1.ObjectMeta{
Name: f.clusterBrokerName,
},
Spec: v1beta1.ClusterServiceBrokerSpec{
CommonServiceBrokerSpec: v1beta1.CommonServiceBrokerSpec{
URL: url,
RelistRequests: 1,
},
},
}
err := f.client.Create(context.Background(), broker)
if k8serrors.IsAlreadyExists(err) {
f.log.Infof("ClusterServiceBroker [%s] already exist. Attempt to get resource.", broker.Name)
createdBroker := &v1beta1.ClusterServiceBroker{}
err = f.client.Get(context.Background(), types.NamespacedName{Name: f.clusterBrokerName}, createdBroker)
return createdBroker, err
}
return broker, err
}
// SetNamespace sets service's working namespace
func (f *ClusterFacade) SetNamespace(namespace string) {
return
}