Skip to content

Commit b40a63b

Browse files
committed
Move clients into a separate package
1 parent 18226ed commit b40a63b

File tree

21 files changed

+292
-271
lines changed

21 files changed

+292
-271
lines changed

pkg/cloud/services/compute/client.go renamed to pkg/clients/compute.go

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package compute
17+
package clients
1818

1919
import (
20+
"fmt"
21+
2022
"github.com/gophercloud/gophercloud"
23+
"github.com/gophercloud/gophercloud/openstack"
2124
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
2225
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
2326
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
@@ -26,18 +29,27 @@ import (
2629
"github.com/gophercloud/utils/openstack/compute/v2/flavors"
2730

2831
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
32+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
2933
)
3034

31-
//go:generate mockgen -package=compute -self_package sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/compute -destination=client_mock.go sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/compute Client
32-
//go:generate /usr/bin/env bash -c "cat ../../../../hack/boilerplate/boilerplate.generatego.txt client_mock.go > _client_mock.go && mv _client_mock.go client_mock.go"
35+
/*
36+
NovaMinimumMicroversion is the minimum Nova microversion supported by CAPO
37+
2.53 corresponds to OpenStack Pike
38+
39+
For the canonical description of Nova microversions, see
40+
https://docs.openstack.org/nova/latest/reference/api-microversion-history.html
41+
42+
CAPO uses server tags, which were added in microversion 2.52.
43+
*/
44+
const NovaMinimumMicroversion = "2.53"
3345

3446
// ServerExt is the base gophercloud Server with extensions used by InstanceStatus.
3547
type ServerExt struct {
3648
servers.Server
3749
availabilityzones.ServerAvailabilityZoneExt
3850
}
3951

40-
type Client interface {
52+
type ComputeClient interface {
4153
ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error)
4254

4355
ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error)
@@ -57,13 +69,40 @@ type Client interface {
5769
GetVolume(volumeID string) (*volumes.Volume, error)
5870
}
5971

60-
type serviceClient struct {
72+
type computeClient struct {
6173
compute *gophercloud.ServiceClient
6274
images *gophercloud.ServiceClient
6375
volume *gophercloud.ServiceClient
6476
}
6577

66-
func (s serviceClient) ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
78+
// NewComputeClient returns a new compute client.
79+
func NewComputeClient(scope *scope.Scope) (ComputeClient, error) {
80+
compute, err := openstack.NewComputeV2(scope.ProviderClient, gophercloud.EndpointOpts{
81+
Region: scope.ProviderClientOpts.RegionName,
82+
})
83+
if err != nil {
84+
return nil, fmt.Errorf("failed to create compute service client: %v", err)
85+
}
86+
compute.Microversion = NovaMinimumMicroversion
87+
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
103+
}
104+
105+
func (s computeClient) ListAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
67106
mc := metrics.NewMetricPrometheusContext("availability_zone", "list")
68107
allPages, err := availabilityzones.List(s.compute).AllPages()
69108
if mc.ObserveRequest(err) != nil {
@@ -72,7 +111,7 @@ func (s serviceClient) ListAvailabilityZones() ([]availabilityzones.Availability
72111
return availabilityzones.ExtractAvailabilityZones(allPages)
73112
}
74113

75-
func (s serviceClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error) {
114+
func (s computeClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Image, error) {
76115
mc := metrics.NewMetricPrometheusContext("image", "list")
77116
pages, err := images.List(s.images, listOpts).AllPages()
78117
if mc.ObserveRequest(err) != nil {
@@ -81,13 +120,13 @@ func (s serviceClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Ima
81120
return images.ExtractImages(pages)
82121
}
83122

84-
func (s serviceClient) GetFlavorIDFromName(flavor string) (string, error) {
123+
func (s computeClient) GetFlavorIDFromName(flavor string) (string, error) {
85124
mc := metrics.NewMetricPrometheusContext("flavor", "get")
86125
flavorID, err := flavors.IDFromName(s.compute, flavor)
87126
return flavorID, mc.ObserveRequest(err)
88127
}
89128

90-
func (s serviceClient) CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error) {
129+
func (s computeClient) CreateServer(createOpts servers.CreateOptsBuilder) (*ServerExt, error) {
91130
var server ServerExt
92131
mc := metrics.NewMetricPrometheusContext("server", "create")
93132
err := servers.Create(s.compute, createOpts).ExtractInto(&server)
@@ -97,13 +136,13 @@ func (s serviceClient) CreateServer(createOpts servers.CreateOptsBuilder) (*Serv
97136
return &server, nil
98137
}
99138

100-
func (s serviceClient) DeleteServer(serverID string) error {
139+
func (s computeClient) DeleteServer(serverID string) error {
101140
mc := metrics.NewMetricPrometheusContext("server", "delete")
102141
err := servers.Delete(s.compute, serverID).ExtractErr()
103142
return mc.ObserveRequestIgnoreNotFound(err)
104143
}
105144

106-
func (s serviceClient) GetServer(serverID string) (*ServerExt, error) {
145+
func (s computeClient) GetServer(serverID string) (*ServerExt, error) {
107146
var server ServerExt
108147
mc := metrics.NewMetricPrometheusContext("server", "get")
109148
err := servers.Get(s.compute, serverID).ExtractInto(&server)
@@ -113,7 +152,7 @@ func (s serviceClient) GetServer(serverID string) (*ServerExt, error) {
113152
return &server, nil
114153
}
115154

116-
func (s serviceClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerExt, error) {
155+
func (s computeClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerExt, error) {
117156
var serverList []ServerExt
118157
mc := metrics.NewMetricPrometheusContext("server", "list")
119158
allPages, err := servers.List(s.compute, listOpts).AllPages()
@@ -124,7 +163,7 @@ func (s serviceClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerEx
124163
return serverList, err
125164
}
126165

127-
func (s serviceClient) ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error) {
166+
func (s computeClient) ListAttachedInterfaces(serverID string) ([]attachinterfaces.Interface, error) {
128167
mc := metrics.NewMetricPrometheusContext("server_os_interface", "list")
129168
interfaces, err := attachinterfaces.List(s.compute, serverID).AllPages()
130169
if mc.ObserveRequest(err) != nil {
@@ -133,13 +172,13 @@ func (s serviceClient) ListAttachedInterfaces(serverID string) ([]attachinterfac
133172
return attachinterfaces.ExtractInterfaces(interfaces)
134173
}
135174

136-
func (s serviceClient) DeleteAttachedInterface(serverID, portID string) error {
175+
func (s computeClient) DeleteAttachedInterface(serverID, portID string) error {
137176
mc := metrics.NewMetricPrometheusContext("server_os_interface", "delete")
138177
err := attachinterfaces.Delete(s.compute, serverID, portID).ExtractErr()
139178
return mc.ObserveRequestIgnoreNotFoundorConflict(err)
140179
}
141180

142-
func (s serviceClient) ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volume, error) {
181+
func (s computeClient) ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volume, error) {
143182
mc := metrics.NewMetricPrometheusContext("volume", "list")
144183
pages, err := volumes.List(s.volume, opts).AllPages()
145184
if mc.ObserveRequest(err) != nil {
@@ -148,19 +187,19 @@ func (s serviceClient) ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volu
148187
return volumes.ExtractVolumes(pages)
149188
}
150189

151-
func (s serviceClient) CreateVolume(opts volumes.CreateOptsBuilder) (*volumes.Volume, error) {
190+
func (s computeClient) CreateVolume(opts volumes.CreateOptsBuilder) (*volumes.Volume, error) {
152191
mc := metrics.NewMetricPrometheusContext("volume", "create")
153192
volume, err := volumes.Create(s.volume, opts).Extract()
154193
return volume, mc.ObserveRequest(err)
155194
}
156195

157-
func (s serviceClient) DeleteVolume(volumeID string, opts volumes.DeleteOptsBuilder) error {
196+
func (s computeClient) DeleteVolume(volumeID string, opts volumes.DeleteOptsBuilder) error {
158197
mc := metrics.NewMetricPrometheusContext("volume", "delete")
159198
err := volumes.Delete(s.volume, volumeID, opts).ExtractErr()
160199
return mc.ObserveRequestIgnoreNotFound(err)
161200
}
162201

163-
func (s serviceClient) GetVolume(volumeID string) (*volumes.Volume, error) {
202+
func (s computeClient) GetVolume(volumeID string) (*volumes.Volume, error) {
164203
mc := metrics.NewMetricPrometheusContext("volume", "get")
165204
volume, err := volumes.Get(s.volume, volumeID).Extract()
166205
return volume, mc.ObserveRequestIgnoreNotFound(err)

pkg/cloud/services/loadbalancer/client.go renamed to pkg/clients/loadbalancer.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package loadbalancer
17+
package clients
1818

1919
import (
2020
"fmt"
2121

2222
"github.com/gophercloud/gophercloud"
23+
"github.com/gophercloud/gophercloud/openstack"
2324
"github.com/gophercloud/gophercloud/openstack/compute/apiversions"
2425
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
2526
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
@@ -28,6 +29,7 @@ import (
2829
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/providers"
2930

3031
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
32+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
3133
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
3234
)
3335

@@ -59,6 +61,18 @@ type lbClient struct {
5961
serviceClient *gophercloud.ServiceClient
6062
}
6163

64+
// NewLbClient returns a new loadbalancer client.
65+
func NewLbClient(scope *scope.Scope) (LbClient, error) {
66+
loadbalancerClient, err := openstack.NewLoadBalancerV2(scope.ProviderClient, gophercloud.EndpointOpts{
67+
Region: scope.ProviderClientOpts.RegionName,
68+
})
69+
if err != nil {
70+
return nil, fmt.Errorf("failed to create load balancer service client: %v", err)
71+
}
72+
73+
return &lbClient{loadbalancerClient}, nil
74+
}
75+
6276
func (l lbClient) CreateLoadBalancer(opts loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error) {
6377
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
6478
lb, err := loadbalancers.Create(l.serviceClient, opts).Extract()

0 commit comments

Comments
 (0)