@@ -14,10 +14,13 @@ See the License for the specific language governing permissions and
14
14
limitations under the License.
15
15
*/
16
16
17
- package compute
17
+ package clients
18
18
19
19
import (
20
+ "fmt"
21
+
20
22
"github.com/gophercloud/gophercloud"
23
+ "github.com/gophercloud/gophercloud/openstack"
21
24
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
22
25
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
23
26
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
@@ -26,18 +29,27 @@ import (
26
29
"github.com/gophercloud/utils/openstack/compute/v2/flavors"
27
30
28
31
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
32
+ "sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
29
33
)
30
34
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"
33
45
34
46
// ServerExt is the base gophercloud Server with extensions used by InstanceStatus.
35
47
type ServerExt struct {
36
48
servers.Server
37
49
availabilityzones.ServerAvailabilityZoneExt
38
50
}
39
51
40
- type Client interface {
52
+ type ComputeClient interface {
41
53
ListAvailabilityZones () ([]availabilityzones.AvailabilityZone , error )
42
54
43
55
ListImages (listOpts images.ListOptsBuilder ) ([]images.Image , error )
@@ -57,13 +69,40 @@ type Client interface {
57
69
GetVolume (volumeID string ) (* volumes.Volume , error )
58
70
}
59
71
60
- type serviceClient struct {
72
+ type computeClient struct {
61
73
compute * gophercloud.ServiceClient
62
74
images * gophercloud.ServiceClient
63
75
volume * gophercloud.ServiceClient
64
76
}
65
77
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 ) {
67
106
mc := metrics .NewMetricPrometheusContext ("availability_zone" , "list" )
68
107
allPages , err := availabilityzones .List (s .compute ).AllPages ()
69
108
if mc .ObserveRequest (err ) != nil {
@@ -72,7 +111,7 @@ func (s serviceClient) ListAvailabilityZones() ([]availabilityzones.Availability
72
111
return availabilityzones .ExtractAvailabilityZones (allPages )
73
112
}
74
113
75
- func (s serviceClient ) ListImages (listOpts images.ListOptsBuilder ) ([]images.Image , error ) {
114
+ func (s computeClient ) ListImages (listOpts images.ListOptsBuilder ) ([]images.Image , error ) {
76
115
mc := metrics .NewMetricPrometheusContext ("image" , "list" )
77
116
pages , err := images .List (s .images , listOpts ).AllPages ()
78
117
if mc .ObserveRequest (err ) != nil {
@@ -81,13 +120,13 @@ func (s serviceClient) ListImages(listOpts images.ListOptsBuilder) ([]images.Ima
81
120
return images .ExtractImages (pages )
82
121
}
83
122
84
- func (s serviceClient ) GetFlavorIDFromName (flavor string ) (string , error ) {
123
+ func (s computeClient ) GetFlavorIDFromName (flavor string ) (string , error ) {
85
124
mc := metrics .NewMetricPrometheusContext ("flavor" , "get" )
86
125
flavorID , err := flavors .IDFromName (s .compute , flavor )
87
126
return flavorID , mc .ObserveRequest (err )
88
127
}
89
128
90
- func (s serviceClient ) CreateServer (createOpts servers.CreateOptsBuilder ) (* ServerExt , error ) {
129
+ func (s computeClient ) CreateServer (createOpts servers.CreateOptsBuilder ) (* ServerExt , error ) {
91
130
var server ServerExt
92
131
mc := metrics .NewMetricPrometheusContext ("server" , "create" )
93
132
err := servers .Create (s .compute , createOpts ).ExtractInto (& server )
@@ -97,13 +136,13 @@ func (s serviceClient) CreateServer(createOpts servers.CreateOptsBuilder) (*Serv
97
136
return & server , nil
98
137
}
99
138
100
- func (s serviceClient ) DeleteServer (serverID string ) error {
139
+ func (s computeClient ) DeleteServer (serverID string ) error {
101
140
mc := metrics .NewMetricPrometheusContext ("server" , "delete" )
102
141
err := servers .Delete (s .compute , serverID ).ExtractErr ()
103
142
return mc .ObserveRequestIgnoreNotFound (err )
104
143
}
105
144
106
- func (s serviceClient ) GetServer (serverID string ) (* ServerExt , error ) {
145
+ func (s computeClient ) GetServer (serverID string ) (* ServerExt , error ) {
107
146
var server ServerExt
108
147
mc := metrics .NewMetricPrometheusContext ("server" , "get" )
109
148
err := servers .Get (s .compute , serverID ).ExtractInto (& server )
@@ -113,7 +152,7 @@ func (s serviceClient) GetServer(serverID string) (*ServerExt, error) {
113
152
return & server , nil
114
153
}
115
154
116
- func (s serviceClient ) ListServers (listOpts servers.ListOptsBuilder ) ([]ServerExt , error ) {
155
+ func (s computeClient ) ListServers (listOpts servers.ListOptsBuilder ) ([]ServerExt , error ) {
117
156
var serverList []ServerExt
118
157
mc := metrics .NewMetricPrometheusContext ("server" , "list" )
119
158
allPages , err := servers .List (s .compute , listOpts ).AllPages ()
@@ -124,7 +163,7 @@ func (s serviceClient) ListServers(listOpts servers.ListOptsBuilder) ([]ServerEx
124
163
return serverList , err
125
164
}
126
165
127
- func (s serviceClient ) ListAttachedInterfaces (serverID string ) ([]attachinterfaces.Interface , error ) {
166
+ func (s computeClient ) ListAttachedInterfaces (serverID string ) ([]attachinterfaces.Interface , error ) {
128
167
mc := metrics .NewMetricPrometheusContext ("server_os_interface" , "list" )
129
168
interfaces , err := attachinterfaces .List (s .compute , serverID ).AllPages ()
130
169
if mc .ObserveRequest (err ) != nil {
@@ -133,13 +172,13 @@ func (s serviceClient) ListAttachedInterfaces(serverID string) ([]attachinterfac
133
172
return attachinterfaces .ExtractInterfaces (interfaces )
134
173
}
135
174
136
- func (s serviceClient ) DeleteAttachedInterface (serverID , portID string ) error {
175
+ func (s computeClient ) DeleteAttachedInterface (serverID , portID string ) error {
137
176
mc := metrics .NewMetricPrometheusContext ("server_os_interface" , "delete" )
138
177
err := attachinterfaces .Delete (s .compute , serverID , portID ).ExtractErr ()
139
178
return mc .ObserveRequestIgnoreNotFoundorConflict (err )
140
179
}
141
180
142
- func (s serviceClient ) ListVolumes (opts volumes.ListOptsBuilder ) ([]volumes.Volume , error ) {
181
+ func (s computeClient ) ListVolumes (opts volumes.ListOptsBuilder ) ([]volumes.Volume , error ) {
143
182
mc := metrics .NewMetricPrometheusContext ("volume" , "list" )
144
183
pages , err := volumes .List (s .volume , opts ).AllPages ()
145
184
if mc .ObserveRequest (err ) != nil {
@@ -148,19 +187,19 @@ func (s serviceClient) ListVolumes(opts volumes.ListOptsBuilder) ([]volumes.Volu
148
187
return volumes .ExtractVolumes (pages )
149
188
}
150
189
151
- func (s serviceClient ) CreateVolume (opts volumes.CreateOptsBuilder ) (* volumes.Volume , error ) {
190
+ func (s computeClient ) CreateVolume (opts volumes.CreateOptsBuilder ) (* volumes.Volume , error ) {
152
191
mc := metrics .NewMetricPrometheusContext ("volume" , "create" )
153
192
volume , err := volumes .Create (s .volume , opts ).Extract ()
154
193
return volume , mc .ObserveRequest (err )
155
194
}
156
195
157
- func (s serviceClient ) DeleteVolume (volumeID string , opts volumes.DeleteOptsBuilder ) error {
196
+ func (s computeClient ) DeleteVolume (volumeID string , opts volumes.DeleteOptsBuilder ) error {
158
197
mc := metrics .NewMetricPrometheusContext ("volume" , "delete" )
159
198
err := volumes .Delete (s .volume , volumeID , opts ).ExtractErr ()
160
199
return mc .ObserveRequestIgnoreNotFound (err )
161
200
}
162
201
163
- func (s serviceClient ) GetVolume (volumeID string ) (* volumes.Volume , error ) {
202
+ func (s computeClient ) GetVolume (volumeID string ) (* volumes.Volume , error ) {
164
203
mc := metrics .NewMetricPrometheusContext ("volume" , "get" )
165
204
volume , err := volumes .Get (s .volume , volumeID ).Extract ()
166
205
return volume , mc .ObserveRequestIgnoreNotFound (err )
0 commit comments