Skip to content

Commit 4642ff1

Browse files
stuggiopenshift-merge-bot[bot]
authored andcommitted
Update nova-operator to gophercloud v2
Migrate from gophercloud v1.14.1 to v2.8.0: - Update go.mod dependency and import paths - Add context parameters to API calls (List, Delete) - Handle DeleteResult return type from services.Delete() - Add Nova API version discovery endpoint in test fixture Gophercloud v2 requires context for all API operations and performs version discovery via GET / before other API calls. Updated test fixture to support this new behavior. Retained local Service struct in test fixture for test isolation and to avoid JSON marshalling complications with gophercloud v2's Service type. Jira: OSPRH-18162 Depends-On: openstack-k8s-operators/lib-common#645 Depends-On: openstack-k8s-operators/keystone-operator#635 AssistedBy: cloude-4-sonnet Signed-off-by: Martin Schuppert <[email protected]>
1 parent a61d2a7 commit 4642ff1

File tree

6 files changed

+58
-24
lines changed

6 files changed

+58
-24
lines changed

controllers/common.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ import (
4242
novav1 "github.com/openstack-k8s-operators/nova-operator/api/v1beta1"
4343
"github.com/openstack-k8s-operators/nova-operator/pkg/nova"
4444

45-
gophercloud "github.com/gophercloud/gophercloud"
46-
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/services"
45+
gophercloud "github.com/gophercloud/gophercloud/v2"
46+
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/services"
4747
networkv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
4848
topologyv1 "github.com/openstack-k8s-operators/infra-operator/apis/topology/v1beta1"
4949
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
@@ -201,6 +201,7 @@ func ensureTopology(
201201
}
202202

203203
func cleanNovaServiceFromNovaDb(
204+
ctx context.Context,
204205
computeClient *gophercloud.ServiceClient,
205206
serviceName string,
206207
l logr.Logger,
@@ -211,7 +212,7 @@ func cleanNovaServiceFromNovaDb(
211212
Binary: serviceName,
212213
}
213214

214-
allPages, err := services.List(computeClient, opts).AllPages()
215+
allPages, err := services.List(computeClient, opts).AllPages(ctx)
215216
if err != nil {
216217
return err
217218
}
@@ -242,7 +243,7 @@ func cleanNovaServiceFromNovaDb(
242243
// which means if replicaCount is 1, only nova-scheduler-0 is valid case
243244
// so delete >= 1
244245
if hostIndex >= int(replicaCount) {
245-
rsp := services.Delete(computeClient, service.ID)
246+
rsp := services.Delete(ctx, computeClient, service.ID)
246247
if rsp.Err != nil {
247248
l.Error(rsp.Err, "Failed to delete service", "service", service, "response", rsp)
248249
return rsp.Err
@@ -694,7 +695,7 @@ func getNovaClient(
694695
Region: cfg.Region,
695696
Availability: gophercloud.AvailabilityInternal,
696697
}
697-
computeClient, err := openstack.GetNovaOpenStackClient(l, cfg, endpointOpts)
698+
computeClient, err := openstack.GetNovaOpenStackClient(ctx, l, cfg, endpointOpts)
698699
if err != nil {
699700
return nil, err
700701
}

controllers/novaconductor_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ func (r *NovaConductorReconciler) cleanServiceFromNovaDb(
696696
replicaCount := instance.Spec.Replicas
697697
cellName := instance.Spec.CellName
698698

699-
return cleanNovaServiceFromNovaDb(computeClient, "nova-conductor", l, *replicaCount, cellName)
699+
return cleanNovaServiceFromNovaDb(ctx, computeClient, "nova-conductor", l, *replicaCount, cellName)
700700
}
701701

702702
func (r *NovaConductorReconciler) findObjectsForSrc(ctx context.Context, src client.Object) []reconcile.Request {

controllers/novascheduler_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,5 +814,5 @@ func (r *NovaSchedulerReconciler) cleanServiceFromNovaDb(
814814
}
815815
replicaCount := instance.Spec.Replicas
816816

817-
return cleanNovaServiceFromNovaDb(computeClient, "nova-scheduler", l, *replicaCount, "")
817+
return cleanNovaServiceFromNovaDb(ctx, computeClient, "nova-scheduler", l, *replicaCount, "")
818818
}

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ require (
66
github.com/go-logr/logr v1.4.3
77
github.com/google/go-cmp v0.7.0
88
github.com/google/uuid v1.6.0
9-
github.com/gophercloud/gophercloud v1.14.1
9+
github.com/gophercloud/gophercloud/v2 v2.8.0
1010
github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.7
1111
github.com/onsi/ginkgo/v2 v2.26.0
1212
github.com/onsi/gomega v1.38.2
1313
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251007170607-63860ee1375c
14-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251007150354-bb6ae13a35cf
14+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251021163720-bb51cea0d967
1515
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251007102731-b786c86bffe7
16-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251007102731-b786c86bffe7
16+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251021145236-2b84ec9fd9bb
1717
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20251007102731-b786c86bffe7
1818
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20251007103734-372c660c067b
1919
github.com/openstack-k8s-operators/nova-operator/api v0.0.0-20221209164002-f9e6b9363961

go.sum

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J
5656
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
5757
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5858
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
59-
github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw=
60-
github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
59+
github.com/gophercloud/gophercloud/v2 v2.8.0 h1:of2+8tT6+FbEYHfYC8GBu8TXJNsXYSNm9KuvpX7Neqo=
60+
github.com/gophercloud/gophercloud/v2 v2.8.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk=
6161
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
6262
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
6363
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -100,12 +100,12 @@ github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e h1:E1OdwSpqWuDPCedyU
100100
github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
101101
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251007170607-63860ee1375c h1:7Qv0lv6QXwouUPryiZeiVbAIeCv8qYFH3sf80w+V0DE=
102102
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251007170607-63860ee1375c/go.mod h1:Zkxq8zl7w7NRYGxfobFKHu/+MNA+65Lc6ZqtZ8yTogw=
103-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251007150354-bb6ae13a35cf h1:t3fxcJvKqG54QCbwmiPy5BbN/6bIHiJZArrlxeGyU1c=
104-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251007150354-bb6ae13a35cf/go.mod h1:braI3juap0JIy6XOvu0AHqVGkfn2/dbw5BBRv84oSAw=
103+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251021163720-bb51cea0d967 h1:3M5wpX25sGAxdj3zkN0Cr9+PL7b8+QaCb0ivbGseCI0=
104+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251021163720-bb51cea0d967/go.mod h1:0aizgUSdLK6TgZ1ATE6s/Cca/V+CLyMS2Mznyoq1Gjo=
105105
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251007102731-b786c86bffe7 h1:mlz/n5Fc5Ypbx5odAvKqlhZBNKEo9BdNtCwTo0mHusk=
106106
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251007102731-b786c86bffe7/go.mod h1:GRTwOi5ZI6aJrTune36iWP5zNNjVLZNsV9Kb7IK3UJ0=
107-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251007102731-b786c86bffe7 h1:D6eO1fSePPDJt+M3df7iYkstOxxTIu6wnGL7P2mXD5Y=
108-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251007102731-b786c86bffe7/go.mod h1:G2eI9yH+UZ2eP594b6kmt5rRvNnYA4R+WS/sFfVOGtc=
107+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251021145236-2b84ec9fd9bb h1:wToXqX7AS1JV3Kna7RcJfkRart8rSGun2biKNfyY6Zg=
108+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251021145236-2b84ec9fd9bb/go.mod h1:yf13jWb60XV26eA7A8o86ZCXNWBLNK9dPkTSWFaTPCw=
109109
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20250929092825-4c2402451077 h1:9tpPDBV2RLXMDgt13ec8XR2OatFriItseqg+Oyvx9GA=
110110
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20250929092825-4c2402451077/go.mod h1:JPQHkExlxeT6MU3DNJgXXJJG0NMQHlZwxxfbYRaP3eg=
111111
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20251007102731-b786c86bffe7 h1:rBO9he2MMEl3a6QZppH2UwAOVLkJJ3JwArsNN3Gvy0w=
@@ -166,7 +166,6 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
166166
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
167167
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
168168
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
169-
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
170169
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
171170
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
172171
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -177,7 +176,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
177176
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
178177
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
179178
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
180-
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
181179
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
182180
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
183181
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
@@ -190,17 +188,12 @@ golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
190188
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
191189
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
192190
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
193-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
194-
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
195-
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
196191
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
197192
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
198-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
199193
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
200194
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
201195
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
202196
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
203-
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
204197
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
205198
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
206199
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
@@ -226,7 +219,6 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSP
226219
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
227220
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
228221
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
229-
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
230222
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
231223
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
232224
k8s.io/api v0.31.13 h1:sco9Cq2pY4Ysv9qZiWzcR97MmA/35nwYQ/VCTzOcWmc=

test/functional/api_fixture.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ import (
3535
// NOTE(gibi): When we are on golang 1.22 and gophercloud v2 is released we can
3636
// use the "github.com/gophercloud/gophercloud/openstack/compute/v2/services"
3737
// structs directly.
38+
// NOTE(mschuppert): using the local Service struct for test isolation avoids the
39+
// JSON marshalling complications with gophercloud v2's Service type that has
40+
// json:"-" on the ID field. It would required a custom type for the response.
41+
// keeping it for now.
3842
type Service struct {
3943
// The binary name of the service.
4044
Binary string `json:"binary"`
@@ -202,9 +206,46 @@ func (f *NovaAPIFixture) registerHandler(handler api.Handler) {
202206
}
203207

204208
func (f *NovaAPIFixture) registerNormalHandlers() {
209+
f.registerHandler(api.Handler{Pattern: "/", Func: f.HandleVersion})
205210
f.registerHandler(api.Handler{Pattern: "/os-services/", Func: f.ServicesHandler})
206211
}
207212

213+
// HandleVersion responds with a valid Nova API version response
214+
func (f *NovaAPIFixture) HandleVersion(w http.ResponseWriter, r *http.Request) {
215+
f.LogRequest(r)
216+
// The /compute/ URL matches to every request if no handle registered with a more
217+
// specific URL pattern
218+
if r.RequestURI != f.URLBase+"/" {
219+
f.UnexpectedRequest(w, r)
220+
return
221+
}
222+
223+
switch r.Method {
224+
case "GET":
225+
w.Header().Add("Content-Type", "application/json")
226+
w.WriteHeader(200)
227+
_, _ = fmt.Fprintf(w, // Ignore write error in test
228+
`
229+
{
230+
"versions": [{
231+
"id": "v2.1",
232+
"status": "CURRENT",
233+
"version": "2.95",
234+
"min_version": "2.1",
235+
"updated": "2013-07-23T11:33:21Z",
236+
"links": [{
237+
"rel": "self",
238+
"href": "%s/"
239+
}]
240+
}]
241+
}
242+
`, f.Endpoint())
243+
default:
244+
f.UnexpectedRequest(w, r)
245+
return
246+
}
247+
}
248+
208249
// ServicesHandler handles requests to the Nova services API endpoint
209250
func (f *NovaAPIFixture) ServicesHandler(w http.ResponseWriter, r *http.Request) {
210251
f.LogRequest(r)

0 commit comments

Comments
 (0)