Skip to content

Commit 506931f

Browse files
authored
Merge pull request #1119 from mercedes-benz/mgrote/service-interface-load-balancer
✨Service interface load balancer
2 parents 8ae2515 + af897fc commit 506931f

File tree

14 files changed

+718
-76
lines changed

14 files changed

+718
-76
lines changed

.golangci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ linters-settings:
8585
alias: infrav1alpha4
8686
- pkg: sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1
8787
alias: infrav1
88+
- pkg: sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors
89+
alias: capoerrors
8890
# CAPI
8991
- pkg: sigs.k8s.io/cluster-api/api/v1alpha3
9092
alias: clusterv1alpha3

api/v1alpha3/zz_generated.conversion.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha3/zz_generated.deepcopy.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/zz_generated.conversion.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/zz_generated.deepcopy.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hack/boilerplate/boilerplate.generatego.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2021 The Kubernetes Authors.
2+
Copyright 2022 The Kubernetes Authors.
33

44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.

pkg/cloud/services/compute/client_mock.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
/*
2+
Copyright 2022 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package loadbalancer
18+
19+
import (
20+
"fmt"
21+
22+
"github.com/gophercloud/gophercloud"
23+
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
24+
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
25+
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
26+
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
27+
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/providers"
28+
29+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
30+
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
31+
)
32+
33+
type LbClient interface {
34+
CreateLoadBalancer(opts loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error)
35+
ListLoadBalancers(opts loadbalancers.ListOptsBuilder) ([]loadbalancers.LoadBalancer, error)
36+
GetLoadBalancer(id string) (*loadbalancers.LoadBalancer, error)
37+
DeleteLoadBalancer(id string, opts loadbalancers.DeleteOptsBuilder) error
38+
CreateListener(opts listeners.CreateOptsBuilder) (*listeners.Listener, error)
39+
ListListeners(opts listeners.ListOptsBuilder) ([]listeners.Listener, error)
40+
GetListener(id string) (*listeners.Listener, error)
41+
DeleteListener(id string) error
42+
CreatePool(opts pools.CreateOptsBuilder) (*pools.Pool, error)
43+
ListPools(opts pools.ListOptsBuilder) ([]pools.Pool, error)
44+
GetPool(id string) (*pools.Pool, error)
45+
DeletePool(id string) error
46+
CreatePoolMember(poolID string, opts pools.CreateMemberOptsBuilder) (*pools.Member, error)
47+
ListPoolMember(poolID string, opts pools.ListMembersOptsBuilder) ([]pools.Member, error)
48+
DeletePoolMember(poolID string, lbMemberID string) error
49+
CreateMonitor(opts monitors.CreateOptsBuilder) (*monitors.Monitor, error)
50+
ListMonitors(opts monitors.ListOptsBuilder) ([]monitors.Monitor, error)
51+
DeleteMonitor(id string) error
52+
ListLoadBalancerProviders() ([]providers.Provider, error)
53+
}
54+
55+
type lbClient struct {
56+
serviceClient *gophercloud.ServiceClient
57+
}
58+
59+
func (l lbClient) CreateLoadBalancer(opts loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error) {
60+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
61+
lb, err := loadbalancers.Create(l.serviceClient, opts).Extract()
62+
if mc.ObserveRequest(err) != nil {
63+
return nil, err
64+
}
65+
return lb, nil
66+
}
67+
68+
func (l lbClient) ListLoadBalancers(opts loadbalancers.ListOptsBuilder) ([]loadbalancers.LoadBalancer, error) {
69+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "list")
70+
allPages, err := loadbalancers.List(l.serviceClient, opts).AllPages()
71+
if mc.ObserveRequest(err) != nil {
72+
return nil, err
73+
}
74+
return loadbalancers.ExtractLoadBalancers(allPages)
75+
}
76+
77+
func (l lbClient) GetLoadBalancer(id string) (*loadbalancers.LoadBalancer, error) {
78+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "get")
79+
lb, err := loadbalancers.Get(l.serviceClient, id).Extract()
80+
if mc.ObserveRequest(err) != nil {
81+
return nil, err
82+
}
83+
return lb, nil
84+
}
85+
86+
func (l lbClient) DeleteLoadBalancer(id string, opts loadbalancers.DeleteOptsBuilder) error {
87+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "delete")
88+
err := loadbalancers.Delete(l.serviceClient, id, opts).ExtractErr()
89+
if mc.ObserveRequestIgnoreNotFound(err) != nil && !capoerrors.IsNotFound(err) {
90+
return err
91+
}
92+
return nil
93+
}
94+
95+
func (l lbClient) CreateListener(opts listeners.CreateOptsBuilder) (*listeners.Listener, error) {
96+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "create")
97+
listener, err := listeners.Create(l.serviceClient, opts).Extract()
98+
if mc.ObserveRequest(err) != nil {
99+
return nil, err
100+
}
101+
return listener, nil
102+
}
103+
104+
func (l lbClient) ListListeners(opts listeners.ListOptsBuilder) ([]listeners.Listener, error) {
105+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "list")
106+
allPages, err := listeners.List(l.serviceClient, opts).AllPages()
107+
if mc.ObserveRequest(err) != nil {
108+
return nil, err
109+
}
110+
return listeners.ExtractListeners(allPages)
111+
}
112+
113+
func (l lbClient) GetListener(id string) (*listeners.Listener, error) {
114+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "get")
115+
listener, err := listeners.Get(l.serviceClient, id).Extract()
116+
if mc.ObserveRequest(err) != nil {
117+
return nil, err
118+
}
119+
return listener, nil
120+
}
121+
122+
func (l lbClient) DeleteListener(id string) error {
123+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "delete")
124+
err := listeners.Delete(l.serviceClient, id).ExtractErr()
125+
if mc.ObserveRequestIgnoreNotFound(err) != nil && !capoerrors.IsNotFound(err) {
126+
return fmt.Errorf("error deleting lbaas listener %s: %v", id, err)
127+
}
128+
return nil
129+
}
130+
131+
func (l lbClient) CreatePool(opts pools.CreateOptsBuilder) (*pools.Pool, error) {
132+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "create")
133+
pool, err := pools.Create(l.serviceClient, opts).Extract()
134+
if mc.ObserveRequest(err) != nil {
135+
return nil, err
136+
}
137+
return pool, nil
138+
}
139+
140+
func (l lbClient) ListPools(opts pools.ListOptsBuilder) ([]pools.Pool, error) {
141+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "list")
142+
allPages, err := pools.List(l.serviceClient, opts).AllPages()
143+
if mc.ObserveRequest(err) != nil {
144+
return nil, err
145+
}
146+
return pools.ExtractPools(allPages)
147+
}
148+
149+
func (l lbClient) GetPool(id string) (*pools.Pool, error) {
150+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "get")
151+
pool, err := pools.Get(l.serviceClient, id).Extract()
152+
if mc.ObserveRequest(err) != nil {
153+
return nil, err
154+
}
155+
return pool, nil
156+
}
157+
158+
func (l lbClient) DeletePool(id string) error {
159+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "delete")
160+
err := pools.Delete(l.serviceClient, id).ExtractErr()
161+
if mc.ObserveRequestIgnoreNotFound(err) != nil && !capoerrors.IsNotFound(err) {
162+
return fmt.Errorf("error deleting lbaas pool %s: %v", id, err)
163+
}
164+
return nil
165+
}
166+
167+
func (l lbClient) CreatePoolMember(poolID string, lbMemberOpts pools.CreateMemberOptsBuilder) (*pools.Member, error) {
168+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "create")
169+
member, err := pools.CreateMember(l.serviceClient, poolID, lbMemberOpts).Extract()
170+
if mc.ObserveRequest(err) != nil {
171+
return nil, fmt.Errorf("error create lbmember: %s", err)
172+
}
173+
return member, nil
174+
}
175+
176+
func (l lbClient) ListPoolMember(poolID string, opts pools.ListMembersOptsBuilder) ([]pools.Member, error) {
177+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "list")
178+
allPages, err := pools.ListMembers(l.serviceClient, poolID, opts).AllPages()
179+
if mc.ObserveRequest(err) != nil {
180+
return nil, err
181+
}
182+
return pools.ExtractMembers(allPages)
183+
}
184+
185+
func (l lbClient) DeletePoolMember(poolID string, lbMemberID string) error {
186+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
187+
err := pools.DeleteMember(l.serviceClient, poolID, lbMemberID).ExtractErr()
188+
if mc.ObserveRequest(err) != nil {
189+
return fmt.Errorf("error deleting lbmember: %s", err)
190+
}
191+
return nil
192+
}
193+
194+
func (l lbClient) CreateMonitor(opts monitors.CreateOptsBuilder) (*monitors.Monitor, error) {
195+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "create")
196+
monitor, err := monitors.Create(l.serviceClient, opts).Extract()
197+
if mc.ObserveRequest(err) != nil {
198+
return nil, err
199+
}
200+
return monitor, nil
201+
}
202+
203+
func (l lbClient) ListMonitors(opts monitors.ListOptsBuilder) ([]monitors.Monitor, error) {
204+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "list")
205+
allPages, err := monitors.List(l.serviceClient, opts).AllPages()
206+
if mc.ObserveRequest(err) != nil {
207+
return nil, err
208+
}
209+
return monitors.ExtractMonitors(allPages)
210+
}
211+
212+
func (l lbClient) DeleteMonitor(id string) error {
213+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "delete")
214+
err := monitors.Delete(l.serviceClient, id).ExtractErr()
215+
if mc.ObserveRequestIgnoreNotFound(err) != nil && !capoerrors.IsNotFound(err) {
216+
return fmt.Errorf("error deleting lbaas monitor %s: %v", id, err)
217+
}
218+
return nil
219+
}
220+
221+
func (l lbClient) ListLoadBalancerProviders() ([]providers.Provider, error) {
222+
allPages, err := providers.List(l.serviceClient, providers.ListOpts{}).AllPages()
223+
if err != nil {
224+
return nil, fmt.Errorf("listing providers: %v", err)
225+
}
226+
providersList, err := providers.ExtractProviders(allPages)
227+
if err != nil {
228+
return nil, fmt.Errorf("extracting loadbalancer providers pages: %v", err)
229+
}
230+
return providersList, nil
231+
}

0 commit comments

Comments
 (0)