Skip to content

Commit 088b615

Browse files
committed
Split ComputeClient into compute, image, and volume
Implement lazy initialisation of each in compute service.
1 parent b40a63b commit 088b615

File tree

11 files changed

+643
-289
lines changed

11 files changed

+643
-289
lines changed

pkg/clients/compute.go

Lines changed: 49 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ import (
2121

2222
"github.com/gophercloud/gophercloud"
2323
"github.com/gophercloud/gophercloud/openstack"
24-
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
2524
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
2625
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
2726
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
28-
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
2927
"github.com/gophercloud/utils/openstack/compute/v2/flavors"
3028

3129
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
@@ -52,8 +50,6 @@ type ServerExt struct {
5250
type ComputeClient interface {
5351
ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error)
5452

55-
ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error)
56-
5753
GetFlavorIDFromName(flavor string) (string, error)
5854
CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error)
5955
DeleteServer(serverID string) error
@@ -62,18 +58,9 @@ type ComputeClient interface {
6258

6359
ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error)
6460
DeleteAttachedInterface(serverID, portID string) error
65-
66-
ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volume, error)
67-
CreateVolume(opts volumes.CreateOptsBuilder) (*volumes.Volume, error)
68-
DeleteVolume(volumeID string, opts volumes.DeleteOptsBuilder) error
69-
GetVolume(volumeID string) (*volumes.Volume, error)
7061
}
7162

72-
type computeClient struct {
73-
compute *gophercloud.ServiceClient
74-
images *gophercloud.ServiceClient
75-
volume *gophercloud.ServiceClient
76-
}
63+
type computeClient struct{ client *gophercloud.ServiceClient }
7764

7865
// NewComputeClient returns a new compute client.
7966
func NewComputeClient(scope *scope.Scope) (ComputeClient, error) {
@@ -85,122 +72,111 @@ func NewComputeClient(scope *scope.Scope) (ComputeClient, error) {
8572
}
8673
compute.Microversion = NovaMinimumMicroversion
8774

88-
images, err := openstack.NewImageServiceV2(scope.ProviderClient, gophercloud.EndpointOpts{
89-
Region: scope.ProviderClientOpts.RegionName,
90-
})
91-
if err != nil {
92-
return nil, fmt.Errorf("failed to create image service client: %v", err)
93-
}
94-
95-
volume, err := openstack.NewBlockStorageV3(scope.ProviderClient, gophercloud.EndpointOpts{
96-
Region: scope.ProviderClientOpts.RegionName,
97-
})
98-
if err != nil {
99-
return nil, fmt.Errorf("failed to create volume service client: %v", err)
100-
}
101-
102-
return &computeClient{compute, images, volume}, nil
75+
return &computeClient{compute}, nil
10376
}
10477

105-
func (s computeClient) ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
78+
func (c computeClient) ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
10679
mc := metrics.NewMetricPrometheusContext("availability_zone", "list")
107-
allPages, err := availabilityzones.List(s.compute).AllPages()
80+
allPages, err := availabilityzones.List(c.client).AllPages()
10881
if mc.ObserveRequest(err) != nil {
10982
return nil, err
11083
}
11184
return availabilityzones.ExtractAvailabilityZones(allPages)
11285
}
11386

114-
func (s computeClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error) {
115-
mc := metrics.NewMetricPrometheusContext("image", "list")
116-
pages, err := images.List(s.images, listOpts).AllPages()
117-
if mc.ObserveRequest(err) != nil {
118-
return nil, err
119-
}
120-
return images.ExtractImages(pages)
121-
}
122-
123-
func (s computeClient) GetFlavorIDFromName(flavor string) (string, error) {
87+
func (c computeClient) GetFlavorIDFromName(flavor string) (string, error) {
12488
mc := metrics.NewMetricPrometheusContext("flavor", "get")
125-
flavorID, err := flavors.IDFromName(s.compute, flavor)
89+
flavorID, err := flavors.IDFromName(c.client, flavor)
12690
return flavorID, mc.ObserveRequest(err)
12791
}
12892

129-
func (s computeClient) CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error) {
93+
func (c computeClient) CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error) {
13094
var server ServerExt
13195
mc := metrics.NewMetricPrometheusContext("server", "create")
132-
err := servers.Create(s.compute, createOpts).ExtractInto(&server)
96+
err := servers.Create(c.client, createOpts).ExtractInto(&server)
13397
if mc.ObserveRequest(err) != nil {
13498
return nil, err
13599
}
136100
return &server, nil
137101
}
138102

139-
func (s computeClient) DeleteServer(serverID string) error {
103+
func (c computeClient) DeleteServer(serverID string) error {
140104
mc := metrics.NewMetricPrometheusContext("server", "delete")
141-
err := servers.Delete(s.compute, serverID).ExtractErr()
105+
err := servers.Delete(c.client, serverID).ExtractErr()
142106
return mc.ObserveRequestIgnoreNotFound(err)
143107
}
144108

145-
func (s computeClient) GetServer(serverID string) (*ServerExt, error) {
109+
func (c computeClient) GetServer(serverID string) (*ServerExt, error) {
146110
var server ServerExt
147111
mc := metrics.NewMetricPrometheusContext("server", "get")
148-
err := servers.Get(s.compute, serverID).ExtractInto(&server)
112+
err := servers.Get(c.client, serverID).ExtractInto(&server)
149113
if mc.ObserveRequestIgnoreNotFound(err) != nil {
150114
return nil, err
151115
}
152116
return &server, nil
153117
}
154118

155-
func (s computeClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerExt, error) {
119+
func (c computeClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerExt, error) {
156120
var serverList []ServerExt
157121
mc := metrics.NewMetricPrometheusContext("server", "list")
158-
allPages, err := servers.List(s.compute, listOpts).AllPages()
122+
allPages, err := servers.List(c.client, listOpts).AllPages()
159123
if mc.ObserveRequest(err) != nil {
160124
return nil, err
161125
}
162126
err = servers.ExtractServersInto(allPages, &serverList)
163127
return serverList, err
164128
}
165129

166-
func (s computeClient) ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error) {
130+
func (c computeClient) ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error) {
167131
mc := metrics.NewMetricPrometheusContext("server_os_interface", "list")
168-
interfaces, err := attachinterfaces.List(s.compute, serverID).AllPages()
132+
interfaces, err := attachinterfaces.List(c.client, serverID).AllPages()
169133
if mc.ObserveRequest(err) != nil {
170134
return nil, err
171135
}
172136
return attachinterfaces.ExtractInterfaces(interfaces)
173137
}
174138

175-
func (s computeClient) DeleteAttachedInterface(serverID, portID string) error {
139+
func (c computeClient) DeleteAttachedInterface(serverID, portID string) error {
176140
mc := metrics.NewMetricPrometheusContext("server_os_interface", "delete")
177-
err := attachinterfaces.Delete(s.compute, serverID, portID).ExtractErr()
141+
err := attachinterfaces.Delete(c.client, serverID, portID).ExtractErr()
178142
return mc.ObserveRequestIgnoreNotFoundorConflict(err)
179143
}
180144

181-
func (s computeClient) ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volume, error) {
182-
mc := metrics.NewMetricPrometheusContext("volume", "list")
183-
pages, err := volumes.List(s.volume, opts).AllPages()
184-
if mc.ObserveRequest(err) != nil {
185-
return nil, err
186-
}
187-
return volumes.ExtractVolumes(pages)
145+
type computeErrorClient struct{ error }
146+
147+
// NewComputeErrorClient returns a ComputeClient in which every method returns the given error.
148+
func NewComputeErrorClient(e error) ComputeClient {
149+
return computeErrorClient{e}
188150
}
189151

190-
func (s computeClient) CreateVolume(opts volumes.CreateOptsBuilder) (*volumes.Volume, error) {
191-
mc := metrics.NewMetricPrometheusContext("volume", "create")
192-
volume, err := volumes.Create(s.volume, opts).Extract()
193-
return volume, mc.ObserveRequest(err)
152+
func (e computeErrorClient) ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
153+
return nil, e.error
194154
}
195155

196-
func (s computeClient) DeleteVolume(volumeID string, opts volumes.DeleteOptsBuilder) error {
197-
mc := metrics.NewMetricPrometheusContext("volume", "delete")
198-
err := volumes.Delete(s.volume, volumeID, opts).ExtractErr()
199-
return mc.ObserveRequestIgnoreNotFound(err)
156+
func (e computeErrorClient) GetFlavorIDFromName(flavor string) (string, error) {
157+
return "", e.error
158+
}
159+
160+
func (e computeErrorClient) CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error) {
161+
return nil, e.error
162+
}
163+
164+
func (e computeErrorClient) DeleteServer(serverID string) error {
165+
return e.error
166+
}
167+
168+
func (e computeErrorClient) GetServer(serverID string) (*ServerExt, error) {
169+
return nil, e.error
170+
}
171+
172+
func (e computeErrorClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerExt, error) {
173+
return nil, e.error
174+
}
175+
176+
func (e computeErrorClient) ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error) {
177+
return nil, e.error
200178
}
201179

202-
func (s computeClient) GetVolume(volumeID string) (*volumes.Volume, error) {
203-
mc := metrics.NewMetricPrometheusContext("volume", "get")
204-
volume, err := volumes.Get(s.volume, volumeID).Extract()
205-
return volume, mc.ObserveRequestIgnoreNotFound(err)
180+
func (e computeErrorClient) DeleteAttachedInterface(serverID, portID string) error {
181+
return e.error
206182
}

pkg/clients/image.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
Copyright 2021 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 clients
18+
19+
import (
20+
"fmt"
21+
22+
"github.com/gophercloud/gophercloud"
23+
"github.com/gophercloud/gophercloud/openstack"
24+
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
25+
26+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
27+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
28+
)
29+
30+
type ImageClient interface {
31+
ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error)
32+
}
33+
34+
type imageClient struct{ client *gophercloud.ServiceClient }
35+
36+
// NewImageClient returns a new glance client.
37+
func NewImageClient(scope *scope.Scope) (ImageClient, error) {
38+
images, err := openstack.NewImageServiceV2(scope.ProviderClient, gophercloud.EndpointOpts{
39+
Region: scope.ProviderClientOpts.RegionName,
40+
})
41+
if err != nil {
42+
return nil, fmt.Errorf("failed to create image service client: %v", err)
43+
}
44+
45+
return imageClient{images}, nil
46+
}
47+
48+
func (c imageClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error) {
49+
mc := metrics.NewMetricPrometheusContext("image", "list")
50+
pages, err := images.List(c.client, listOpts).AllPages()
51+
if mc.ObserveRequest(err) != nil {
52+
return nil, err
53+
}
54+
return images.ExtractImages(pages)
55+
}
56+
57+
type imageErrorClient struct{ error }
58+
59+
// NewImageErrorClient returns an ImageClient in which every method returns the given error.
60+
func NewImageErrorClient(e error) ImageClient {
61+
return imageErrorClient{e}
62+
}
63+
64+
func (e imageErrorClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error) {
65+
return nil, e.error
66+
}

pkg/clients/mock/compute.go

Lines changed: 0 additions & 76 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)