Upgrade to Gophercloud v2

Essentially:

* Add a context argument to Gophercloud functions
* Refactor scheduler hints for server creation
This commit is contained in:
Pierre Prinetti 2024-10-22 13:47:36 +02:00
parent f3cb5adcdc
commit 1005dda58e
No known key found for this signature in database
GPG Key ID: F8360C8220AA1958
280 changed files with 6229 additions and 4504 deletions

View File

@ -21,7 +21,7 @@ import (
"net/http"
"net/http/httptest"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/v2"
)
type MockOpenstackServer struct {

View File

@ -20,8 +20,8 @@ import (
"net/http/httptest"
"sync"
cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
cinderv3 "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -21,7 +21,7 @@ import (
"fmt"
"net/http"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones"
)
type availabilityZoneListResponse struct {

View File

@ -25,7 +25,7 @@ import (
"strings"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
)
type volumeListResponse struct {

View File

@ -20,13 +20,13 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -23,7 +23,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"k8s.io/kops/upup/pkg/fi"
)

View File

@ -22,7 +22,7 @@ import (
"net/http"
"regexp"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"k8s.io/kops/pkg/pki"
)

View File

@ -23,7 +23,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
)
type serverGroupListResponse struct {

View File

@ -24,12 +24,12 @@ import (
"regexp"
"strings"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/kops/upup/pkg/fi"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
)
type serverGetResponse struct {
@ -210,7 +210,7 @@ func (m *MockClient) createServer(w http.ResponseWriter, r *http.Request) {
return
}
w.WriteHeader(http.StatusCreated)
w.WriteHeader(http.StatusAccepted)
server := servers.Server{
ID: uuid.New().String(),
@ -225,7 +225,7 @@ func (m *MockClient) createServer(w http.ResponseWriter, r *http.Request) {
server.SecurityGroups = securityGroups
portID := create.Server.Networks[0].Port
ports.Update(m.networkClient, portID, ports.UpdateOpts{
ports.Update(r.Context(), m.networkClient, portID, ports.UpdateOpts{
DeviceID: fi.PtrTo(server.ID),
})

View File

@ -20,8 +20,8 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -23,8 +23,8 @@ import (
"strings"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
zones "github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
zones "github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
)
type zoneListResponse struct {

View File

@ -20,7 +20,7 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -23,7 +23,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
)
type imageListResponse struct {

View File

@ -20,9 +20,9 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -24,7 +24,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
)
type listenerListResponse struct {

View File

@ -24,9 +24,9 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
)
type loadbalancerListResponse struct {

View File

@ -24,7 +24,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
)
type poolListResponse struct {

View File

@ -20,13 +20,13 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/kops/cloudmock/openstack"
)

View File

@ -23,7 +23,7 @@ import (
"net/url"
"regexp"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
)
type floatingIPListResponse struct {

View File

@ -27,7 +27,7 @@ import (
"k8s.io/kops/upup/pkg/fi"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
)
type portListResponse struct {

View File

@ -24,10 +24,10 @@ import (
"regexp"
"strings"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
)
type routerListResponse struct {

View File

@ -25,7 +25,7 @@ import (
"strconv"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
)
type ruleListResponse struct {

View File

@ -24,7 +24,7 @@ import (
"regexp"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
)
type groupListResponse struct {

View File

@ -26,7 +26,7 @@ import (
"strings"
"github.com/google/uuid"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
)
type subnetListResponse struct {

View File

@ -17,13 +17,14 @@ limitations under the License.
package designate
import (
"context"
"crypto/tls"
"fmt"
"io"
"net/http"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
"k8s.io/klog/v2"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
"k8s.io/kops/util/pkg/vfs"
@ -70,7 +71,7 @@ func newDesignate(_ io.Reader) (*Interface, error) {
klog.V(2).Info("authenticating to keystone")
err = openstack.Authenticate(provider, ao)
err = openstack.Authenticate(context.TODO(), provider, ao)
if err != nil {
return nil, fmt.Errorf("error building openstack authenticated client: %v", err)
}

View File

@ -17,7 +17,7 @@ limitations under the License.
package designate
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/v2"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
)

View File

@ -20,7 +20,7 @@ import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
)
@ -64,7 +64,7 @@ func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
if err != nil {
return err
}
err = recordsets.Delete(c.zone.zones.iface.sc, zoneID, rrID).ExtractErr()
err = recordsets.Delete(ctx, c.zone.zones.iface.sc, zoneID, rrID).ExtractErr()
if err != nil {
return err
}
@ -77,7 +77,7 @@ func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
Type: string(addition.Type()),
Records: addition.Rrdatas(),
}
_, err := recordsets.Create(c.zone.zones.iface.sc, zoneID, opts).Extract()
_, err := recordsets.Create(ctx, c.zone.zones.iface.sc, zoneID, opts).Extract()
if err != nil {
return err
}
@ -93,7 +93,7 @@ func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
TTL: &ttl,
Records: upsert.Rrdatas(),
}
_, err = recordsets.Update(c.zone.zones.iface.sc, zoneID, rrID, uopts).Extract()
_, err = recordsets.Update(ctx, c.zone.zones.iface.sc, zoneID, rrID, uopts).Extract()
if err != nil {
copts := recordsets.CreateOpts{
Name: upsert.Name(),
@ -101,7 +101,7 @@ func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
Type: string(upsert.Type()),
Records: upsert.Rrdatas(),
}
_, err := recordsets.Create(c.zone.zones.iface.sc, zoneID, copts).Extract()
_, err := recordsets.Create(ctx, c.zone.zones.iface.sc, zoneID, copts).Extract()
if err != nil {
return err
}
@ -124,7 +124,7 @@ func (c *ResourceRecordChangeset) nameToID(name string) (string, error) {
opts := recordsets.ListOpts{
Name: name,
}
allPages, err := recordsets.ListByZone(c.zone.zones.iface.sc, c.zone.impl.ID, opts).AllPages()
allPages, err := recordsets.ListByZone(c.zone.zones.iface.sc, c.zone.impl.ID, opts).AllPages(context.TODO())
if err != nil {
return "", err
}

View File

@ -20,7 +20,7 @@ import (
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
"k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
)
var _ dnsprovider.ResourceRecordSet = ResourceRecordSet{}

View File

@ -17,8 +17,10 @@ limitations under the License.
package designate
import (
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/pagination"
"context"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/pagination"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
"k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype"
)
@ -31,7 +33,7 @@ type ResourceRecordSets struct {
func (rrsets ResourceRecordSets) List() ([]dnsprovider.ResourceRecordSet, error) {
var list []dnsprovider.ResourceRecordSet
err := recordsets.ListByZone(rrsets.zone.zones.iface.sc, rrsets.zone.impl.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
err := recordsets.ListByZone(rrsets.zone.zones.iface.sc, rrsets.zone.impl.ID, nil).EachPage(context.TODO(), func(ctx context.Context, page pagination.Page) (bool, error) {
rrs, err := recordsets.ExtractRecordSets(page)
if err != nil {
return false, err
@ -54,7 +56,7 @@ func (rrsets ResourceRecordSets) Get(name string) ([]dnsprovider.ResourceRecordS
}
var list []dnsprovider.ResourceRecordSet
err := recordsets.ListByZone(rrsets.zone.zones.iface.sc, rrsets.zone.impl.ID, opts).EachPage(func(page pagination.Page) (bool, error) {
err := recordsets.ListByZone(rrsets.zone.zones.iface.sc, rrsets.zone.impl.ID, opts).EachPage(context.TODO(), func(ctx context.Context, page pagination.Page) (bool, error) {
rrs, err := recordsets.ExtractRecordSets(page)
if err != nil {
return false, err

View File

@ -19,7 +19,7 @@ package designate
import (
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
)
var _ dnsprovider.Zone = &Zone{}

View File

@ -17,7 +17,9 @@ limitations under the License.
package designate
import (
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"context"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
)
@ -31,7 +33,7 @@ type Zones struct {
func (kzs Zones) List() ([]dnsprovider.Zone, error) {
var zoneList []dnsprovider.Zone
allPages, err := zones.List(kzs.iface.sc, nil).AllPages()
allPages, err := zones.List(kzs.iface.sc, nil).AllPages(context.TODO())
if err != nil {
return zoneList, err
}
@ -51,7 +53,7 @@ func (kzs Zones) List() ([]dnsprovider.Zone, error) {
func (kzs Zones) Add(zone dnsprovider.Zone) (dnsprovider.Zone, error) {
opts := &zones.CreateOpts{Name: zone.Name()}
z, err := zones.Create(kzs.iface.sc, opts).Extract()
z, err := zones.Create(context.TODO(), kzs.iface.sc, opts).Extract()
if err != nil {
return nil, err
}
@ -62,7 +64,7 @@ func (kzs Zones) Add(zone dnsprovider.Zone) (dnsprovider.Zone, error) {
}
func (kzs Zones) Remove(zone dnsprovider.Zone) error {
_, err := zones.Delete(kzs.iface.sc, zone.ID()).Extract()
_, err := zones.Delete(context.TODO(), kzs.iface.sc, zone.ID()).Extract()
return err
}

2
go.mod
View File

@ -47,7 +47,7 @@ require (
github.com/google/go-tpm v0.9.1
github.com/google/go-tpm-tools v0.4.4
github.com/google/uuid v1.6.0
github.com/gophercloud/gophercloud v1.14.1
github.com/gophercloud/gophercloud/v2 v2.2.0
github.com/hetznercloud/hcloud-go v1.59.1
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7
github.com/pelletier/go-toml v1.9.5

8
go.sum
View File

@ -367,8 +367,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gT
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw=
github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/gophercloud/v2 v2.2.0 h1:STqqnSXuhcg1OPBOZ14z6JDm8fKIN13H2bJg6bBuHp8=
github.com/gophercloud/gophercloud/v2 v2.2.0/go.mod h1:f2hMRC7Kakbv5vM7wSGHrIPZh6JZR60GVHryJlF/K44=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
@ -698,7 +698,6 @@ golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
@ -728,7 +727,6 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
@ -759,7 +757,6 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -780,7 +777,6 @@ golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=

View File

@ -21,9 +21,9 @@ import (
"testing"
"time"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1"
v1meta "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -161,7 +161,7 @@ func makeGroupOS(t *testing.T, groups map[string]*cloudinstances.CloudInstanceGr
Port: port.ID,
},
},
}, "")
}, nil, "")
if err != nil {
t.Fatalf("Failed to make group: %v", err)
}

View File

@ -27,8 +27,8 @@ import (
"k8s.io/kops/pkg/wellknownports"
"k8s.io/utils/net"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
)
const (

View File

@ -22,7 +22,7 @@ import (
"sort"
"strings"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/model"

View File

@ -23,9 +23,9 @@ import (
"strings"
"time"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
corev1 "k8s.io/api/core/v1"
expirationcache "k8s.io/client-go/tools/cache"
"k8s.io/klog/v2"
@ -71,7 +71,7 @@ func New(CacheNodeidentityInfo bool) (nodeidentity.Identifier, error) {
// node-controller should be able to renew it tokens against OpenStack API
env.AllowReauth = true
err = openstack.Authenticate(provider, env)
err = openstack.Authenticate(context.TODO(), provider, env)
if err != nil {
return nil, err
}
@ -118,7 +118,7 @@ func (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*
}
}
server, err := servers.Get(i.novaClient, instanceID).Extract()
server, err := servers.Get(ctx, i.novaClient, instanceID).Extract()
if err != nil {
return nil, err
}

View File

@ -22,7 +22,7 @@ import (
"k8s.io/kops/pkg/dns"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
)

View File

@ -17,8 +17,8 @@ limitations under the License.
package openstack
import (
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -17,7 +17,7 @@ limitations under the License.
package openstack
import (
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -20,9 +20,9 @@ import (
"fmt"
"strings"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"

View File

@ -19,9 +19,9 @@ package openstack
import (
"strings"
osrouter "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
osrouter "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"

View File

@ -17,8 +17,8 @@ limitations under the License.
package openstack
import (
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -20,7 +20,7 @@ import (
"fmt"
"strings"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -19,7 +19,7 @@ package openstack
import (
"strings"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -17,7 +17,7 @@ limitations under the License.
package openstack
import (
cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
cinder "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
"k8s.io/kops/pkg/resources"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -33,12 +33,12 @@ import (
elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
"github.com/aws/aws-sdk-go-v2/service/iam"
route53types "github.com/aws/aws-sdk-go-v2/service/route53/types"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/external"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/klog/v2"
kopsroot "k8s.io/kops"
"k8s.io/kops/cloudmock/aws/mockautoscaling"
@ -339,23 +339,23 @@ func SetupMockOpenstack() *openstack.MockCloud {
c.CreateSubnet(extSubnet)
c.SetExternalSubnet(fi.PtrTo(extSubnetName))
c.SetLBFloatingSubnet(fi.PtrTo(extSubnetName))
images.Create(c.MockImageClient.ServiceClient(), images.CreateOpts{
images.Create(context.TODO(), c.MockImageClient.ServiceClient(), images.CreateOpts{
Name: "Ubuntu-20.04",
MinDisk: 12,
})
flavors.Create(c.MockNovaClient.ServiceClient(), flavors.CreateOpts{
flavors.Create(context.TODO(), c.MockNovaClient.ServiceClient(), flavors.CreateOpts{
Name: "n1-standard-2",
RAM: 8192,
VCPUs: 8,
Disk: fi.PtrTo(16),
})
flavors.Create(c.MockNovaClient.ServiceClient(), flavors.CreateOpts{
flavors.Create(context.TODO(), c.MockNovaClient.ServiceClient(), flavors.CreateOpts{
Name: "n1-standard-1",
RAM: 8192,
VCPUs: 4,
Disk: fi.PtrTo(16),
})
zones.Create(c.MockDNSClient.ServiceClient(), zones.CreateOpts{
zones.Create(context.TODO(), c.MockDNSClient.ServiceClient(), zones.CreateOpts{
Name: "minimal-openstack.k8s.local",
})
return c

View File

@ -17,11 +17,12 @@ limitations under the License.
package gce
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/pagination"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/pagination"
"k8s.io/klog/v2"
"k8s.io/kops/protokube/pkg/gossip"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
@ -40,7 +41,7 @@ func (p *SeedProvider) GetSeeds() ([]string, error) {
err := servers.List(p.computeClient, servers.ListOpts{
TenantID: p.projectID,
}).EachPage(func(page pagination.Page) (bool, error) {
}).EachPage(context.TODO(), func(ctx context.Context, page pagination.Page) (bool, error) {
var s []servers.Server
err := servers.ExtractServersInto(page, &s)
if err != nil {

View File

@ -164,7 +164,7 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
github.com/gophercloud/gophercloud v1.14.1 // indirect
github.com/gophercloud/gophercloud/v2 v2.2.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect

View File

@ -587,8 +587,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw=
github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/gophercloud/v2 v2.2.0 h1:STqqnSXuhcg1OPBOZ14z6JDm8fKIN13H2bJg6bBuHp8=
github.com/gophercloud/gophercloud/v2 v2.2.0/go.mod h1:f2hMRC7Kakbv5vM7wSGHrIPZh6JZR60GVHryJlF/K44=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
@ -1094,7 +1094,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud"
az "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
"github.com/gophercloud/gophercloud/v2"
az "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -31,7 +32,7 @@ func (c *openstackCloud) ListAvailabilityZones(serviceClient *gophercloud.Servic
func listAvailabilityZones(c OpenstackCloud, serviceClient *gophercloud.ServiceClient) (azList []az.AvailabilityZone, err error) {
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
azPage, err := az.List(serviceClient).AllPages()
azPage, err := az.List(serviceClient).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list storage availability zones: %v", err)
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package openstack
import (
"context"
"crypto/tls"
"fmt"
"net/http"
@ -25,30 +26,30 @@ import (
"time"
"github.com/blang/semver/v4"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
az "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/apiversions"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
cinder "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
az "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/volumeattach"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/apiversions"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
@ -117,7 +118,7 @@ type OpenstackCloud interface {
ListInstances(servers.ListOptsBuilder) ([]servers.Server, error)
// CreateInstance will create an openstack server provided create opts
CreateInstance(servers.CreateOptsBuilder, string) (*servers.Server, error)
CreateInstance(servers.CreateOptsBuilder, servers.SchedulerHintOptsBuilder, string) (*servers.Server, error)
// DeleteInstanceWithID will delete instance
DeleteInstanceWithID(instanceID string) error
@ -361,7 +362,7 @@ func NewOpenstackCloud(cluster *kops.Cluster, uagent string) (OpenstackCloud, er
klog.V(2).Info("authenticating to keystone")
err = openstack.Authenticate(provider, authOption)
err = openstack.Authenticate(context.TODO(), provider, authOption)
if err != nil {
return nil, fmt.Errorf("error building openstack authenticated client: %v", err)
}
@ -404,7 +405,7 @@ func buildClients(provider *gophercloud.ProviderClient, tags map[string]string,
// 2.47 is the minimum version where the compute API /server/details returns flavor names
novaClient.Microversion = "2.47"
glanceClient, err := openstack.NewImageServiceV2(provider, gophercloud.EndpointOpts{
glanceClient, err := openstack.NewImageV2(provider, gophercloud.EndpointOpts{
Type: "image",
Region: region,
})
@ -714,7 +715,7 @@ func useLoadBalancerVIPACL(c OpenstackCloud) (bool, error) {
if c.LoadBalancerClient() == nil {
return false, nil
}
allPages, err := apiversions.List(c.LoadBalancerClient()).AllPages()
allPages, err := apiversions.List(c.LoadBalancerClient()).AllPages(context.TODO())
if err != nil {
return false, err
}
@ -829,7 +830,7 @@ func getIPIngressStatus(c OpenstackCloud, cluster *kops.Cluster) (ingresses []fi
}
func isNotFound(err error) bool {
if _, ok := err.(gophercloud.ErrDefault404); ok {
if gophercloud.ResponseCodeIs(err, http.StatusNotFound) {
return true
}

View File

@ -25,10 +25,10 @@ import (
"sort"
"testing"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
l3floatingips "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
l3floatingips "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi"

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -34,7 +35,7 @@ func listDNSZones(c OpenstackCloud, opt zones.ListOptsBuilder) ([]zones.Zone, er
var zs []zones.Zone
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := zones.List(c.DNSClient(), opt).AllPages()
allPages, err := zones.List(c.DNSClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list dns zones: %s", err)
}
@ -56,7 +57,7 @@ func listDNSZones(c OpenstackCloud, opt zones.ListOptsBuilder) ([]zones.Zone, er
func deleteDNSRecordset(c OpenstackCloud, zoneID string, rrsetID string) error {
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
err := recordsets.Delete(c.DNSClient(), zoneID, rrsetID).ExtractErr()
err := recordsets.Delete(context.TODO(), c.DNSClient(), zoneID, rrsetID).ExtractErr()
if err != nil {
return false, fmt.Errorf("failed to delete dns recordset: %s", err)
}
@ -85,7 +86,7 @@ func listDNSRecordsets(c OpenstackCloud, zoneID string, opt recordsets.ListOptsB
var rrs []recordsets.RecordSet
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := recordsets.ListByZone(c.DNSClient(), zoneID, opt).AllPages()
allPages, err := recordsets.ListByZone(c.DNSClient(), zoneID, opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list dns recordsets: %s", err)
}

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -30,7 +31,7 @@ func (c *openstackCloud) GetL3FloatingIP(id string) (fip *l3floatingip.FloatingI
func getL3FloatingIP(c OpenstackCloud, id string) (fip *l3floatingip.FloatingIP, err error) {
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
fip, err = l3floatingip.Get(c.NetworkingClient(), id).Extract()
fip, err = l3floatingip.Get(context.TODO(), c.NetworkingClient(), id).Extract()
if err != nil {
return false, fmt.Errorf("GetFloatingIP: fetching floating IP (%s) failed: %v", id, err)
}
@ -51,7 +52,7 @@ func (c *openstackCloud) CreateL3FloatingIP(opts l3floatingip.CreateOpts) (fip *
func createL3FloatingIP(c OpenstackCloud, opts l3floatingip.CreateOpts) (fip *l3floatingip.FloatingIP, err error) {
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
fip, err = l3floatingip.Create(c.NetworkingClient(), opts).Extract()
fip, err = l3floatingip.Create(context.TODO(), c.NetworkingClient(), opts).Extract()
if err != nil {
return false, fmt.Errorf("CreateL3FloatingIP: create L3 floating IP failed: %v", err)
}
@ -72,7 +73,7 @@ func (c *openstackCloud) ListL3FloatingIPs(opts l3floatingip.ListOpts) (fips []l
func listL3FloatingIPs(c OpenstackCloud, opts l3floatingip.ListOpts) (fips []l3floatingip.FloatingIP, err error) {
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
page, err := l3floatingip.List(c.NetworkingClient(), opts).AllPages()
page, err := l3floatingip.List(c.NetworkingClient(), opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list L3 floating ip: %v", err)
}
@ -97,7 +98,7 @@ func (c *openstackCloud) DeleteFloatingIP(id string) (err error) {
func deleteFloatingIP(c OpenstackCloud, id string) (err error) {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err = l3floatingip.Delete(c.ComputeClient(), id).ExtractErr()
err = l3floatingip.Delete(context.TODO(), c.ComputeClient(), id).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("failed to delete floating ip %s: %v", id, err)
}
@ -118,7 +119,7 @@ func (c *openstackCloud) DeleteL3FloatingIP(id string) (err error) {
func deleteL3FloatingIP(c OpenstackCloud, id string) (err error) {
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
err = l3floatingip.Delete(c.NetworkingClient(), id).ExtractErr()
err = l3floatingip.Delete(context.TODO(), c.NetworkingClient(), id).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("failed to delete L3 floating ip %s: %v", id, err)
}

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
)
func (c *openstackCloud) GetImage(name string) (*images.Image, error) {
@ -29,7 +30,7 @@ func (c *openstackCloud) GetImage(name string) (*images.Image, error) {
func getImage(c OpenstackCloud, name string) (*images.Image, error) {
opts := images.ListOpts{Name: name}
pager := images.List(c.ImageClient(), opts)
page, err := pager.AllPages()
page, err := pager.AllPages(context.TODO())
if err != nil {
return nil, fmt.Errorf("failed to list images: %v", err)
}

View File

@ -19,16 +19,17 @@ package openstack
import (
"context"
"fmt"
"net/http"
"time"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/go-viper/mapstructure/v2"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"golang.org/x/sync/errgroup"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
@ -60,12 +61,12 @@ var floatingBackoff = wait.Backoff{
Steps: 20,
}
func (c *openstackCloud) CreateInstance(opt servers.CreateOptsBuilder, portID string) (*servers.Server, error) {
return createInstance(c, opt, portID)
func (c *openstackCloud) CreateInstance(opt servers.CreateOptsBuilder, schedulerHints servers.SchedulerHintOptsBuilder, portID string) (*servers.Server, error) {
return createInstance(c, opt, schedulerHints, portID)
}
func IsPortInUse(err error) bool {
if _, ok := err.(gophercloud.ErrDefault409); ok {
if gophercloud.ResponseCodeIs(err, http.StatusConflict) {
return true
}
return false
@ -79,8 +80,9 @@ func waitForStatusActive(c OpenstackCloud, serverID string, timeout *time.Durati
if timeout == nil {
timeout = fi.PtrTo(defaultActiveTimeout)
}
return gophercloud.WaitFor(int(timeout.Seconds()), func() (bool, error) {
ctx, cancel := context.WithTimeout(context.TODO(), time.Duration(timeout.Seconds())*time.Second)
defer cancel()
return gophercloud.WaitFor(ctx, func(_ context.Context) (bool, error) {
server, err := c.GetInstance(serverID)
if err != nil {
return false, err
@ -98,12 +100,12 @@ func waitForStatusActive(c OpenstackCloud, serverID string, timeout *time.Durati
})
}
func createInstance(c OpenstackCloud, opt servers.CreateOptsBuilder, portID string) (*servers.Server, error) {
func createInstance(c OpenstackCloud, opt servers.CreateOptsBuilder, schedulerHints servers.SchedulerHintOptsBuilder, portID string) (*servers.Server, error) {
var server *servers.Server
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := servers.Create(c.ComputeClient(), opt).Extract()
v, err := servers.Create(context.TODO(), c.ComputeClient(), opt, schedulerHints).Extract()
if err != nil {
if IsPortInUse(err) && portID != "" {
port, err := c.GetPort(portID)
@ -196,7 +198,7 @@ func (c *openstackCloud) DeleteInstanceWithID(instanceID string) error {
func deleteInstanceWithID(c OpenstackCloud, instanceID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := servers.Delete(c.ComputeClient(), instanceID).ExtractErr()
err := servers.Delete(context.TODO(), c.ComputeClient(), instanceID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting instance: %s", err)
}
@ -325,7 +327,7 @@ func getInstance(c OpenstackCloud, id string) (*servers.Server, error) {
var server *servers.Server
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
instance, err := servers.Get(c.ComputeClient(), id).Extract()
instance, err := servers.Get(context.TODO(), c.ComputeClient(), id).Extract()
if err != nil {
return false, err
}
@ -349,7 +351,7 @@ func listInstances(c OpenstackCloud, opt servers.ListOptsBuilder) ([]servers.Ser
var instances []servers.Server
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := servers.List(c.ComputeClient(), opt).AllPages()
allPages, err := servers.List(c.ComputeClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing servers %v: %v", opt, err)
}
@ -377,7 +379,7 @@ func (c *openstackCloud) GetFlavor(name string) (*flavors.Flavor, error) {
func getFlavor(c OpenstackCloud, name string) (*flavors.Flavor, error) {
opts := flavors.ListOpts{}
pager := flavors.ListDetail(c.ComputeClient(), opts)
page, err := pager.AllPages()
page, err := pager.AllPages(context.TODO())
if err != nil {
return nil, fmt.Errorf("failed to list flavors: %v", err)
}

View File

@ -17,12 +17,13 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"testing"
"time"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/kops/upup/pkg/fi"
)
@ -84,6 +85,6 @@ func Test_WaitForStatusActiveResultsInTimeout(t *testing.T) {
actualErr := waitForStatusActive(c, serverID, fi.PtrTo(time.Second))
expectedErr := fmt.Errorf("A timeout occurred")
expectedErr := context.DeadlineExceeded
assertTestResults(t, nil, expectedErr, actualErr)
}

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -31,7 +32,7 @@ func (c *openstackCloud) GetKeypair(name string) (*keypairs.KeyPair, error) {
func getKeypair(c OpenstackCloud, name string) (*keypairs.KeyPair, error) {
var k *keypairs.KeyPair
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
rs, err := keypairs.Get(c.ComputeClient(), name, nil).Extract()
rs, err := keypairs.Get(context.TODO(), c.ComputeClient(), name, nil).Extract()
if err != nil {
if isNotFound(err) {
return true, nil
@ -58,7 +59,7 @@ func createKeypair(c OpenstackCloud, opt keypairs.CreateOptsBuilder) (*keypairs.
var k *keypairs.KeyPair
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := keypairs.Create(c.ComputeClient(), opt).Extract()
v, err := keypairs.Create(context.TODO(), c.ComputeClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating keypair: %v", err)
}
@ -80,7 +81,7 @@ func (c *openstackCloud) DeleteKeyPair(name string) error {
func deleteKeyPair(c OpenstackCloud, name string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := keypairs.Delete(c.ComputeClient(), name, nil).ExtractErr()
err := keypairs.Delete(context.TODO(), c.ComputeClient(), name, nil).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting keypair: %v", err)
}
@ -105,7 +106,7 @@ func (c *openstackCloud) ListKeypairs() ([]keypairs.KeyPair, error) {
func listKeypairs(c OpenstackCloud) ([]keypairs.KeyPair, error) {
var k []keypairs.KeyPair
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := keypairs.List(c.ComputeClient(), nil).AllPages()
allPages, err := keypairs.List(c.ComputeClient(), nil).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing keypairs: %v", err)
}

View File

@ -17,15 +17,17 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"net/http"
"time"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
"k8s.io/kops/util/pkg/vfs"
@ -49,7 +51,7 @@ func createPoolMonitor(c OpenstackCloud, opts monitors.CreateOpts) (poolMonitor
}
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
poolMonitor, err = monitors.Create(c.LoadBalancerClient(), opts).Extract()
poolMonitor, err = monitors.Create(context.TODO(), c.LoadBalancerClient(), opts).Extract()
if err != nil {
return false, fmt.Errorf("failed to create pool monitor: %v", err)
}
@ -73,7 +75,7 @@ func listMonitors(c OpenstackCloud, opts monitors.ListOpts) (monitorList []monit
return monitorList, fmt.Errorf("loadbalancer support not available in this deployment")
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := monitors.List(c.LoadBalancerClient(), opts).AllPages()
allPages, err := monitors.List(c.LoadBalancerClient(), opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list monitors: %s", err)
}
@ -101,7 +103,7 @@ func deleteMonitor(c OpenstackCloud, monitorID string) error {
return fmt.Errorf("loadbalancer support not available in this deployment")
}
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := monitors.Delete(c.LoadBalancerClient(), monitorID).ExtractErr()
err := monitors.Delete(context.TODO(), c.LoadBalancerClient(), monitorID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting pool: %v", err)
}
@ -129,7 +131,7 @@ func deletePool(c OpenstackCloud, poolID string) error {
}
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := v2pools.Delete(c.LoadBalancerClient(), poolID).ExtractErr()
err := v2pools.Delete(context.TODO(), c.LoadBalancerClient(), poolID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting pool: %v", err)
}
@ -157,7 +159,7 @@ func deleteListener(c OpenstackCloud, listenerID string) error {
}
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := listeners.Delete(c.LoadBalancerClient(), listenerID).ExtractErr()
err := listeners.Delete(context.TODO(), c.LoadBalancerClient(), listenerID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting listener: %v", err)
}
@ -185,7 +187,7 @@ func deleteLB(c OpenstackCloud, lbID string, opts loadbalancers.DeleteOpts) erro
}
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := loadbalancers.Delete(c.LoadBalancerClient(), lbID, opts).ExtractErr()
err := loadbalancers.Delete(context.TODO(), c.LoadBalancerClient(), lbID, opts).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting loadbalancer: %v", err)
}
@ -214,7 +216,7 @@ func createLB(c OpenstackCloud, opt loadbalancers.CreateOptsBuilder) (*loadbalan
var i *loadbalancers.LoadBalancer
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := loadbalancers.Create(c.LoadBalancerClient(), opt).Extract()
v, err := loadbalancers.Create(context.TODO(), c.LoadBalancerClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating loadbalancer: %v", err)
}
@ -240,7 +242,7 @@ func getLB(c OpenstackCloud, loadbalancerID string) (lb *loadbalancers.LoadBalan
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
lb, err = loadbalancers.Get(c.LoadBalancerClient(), loadbalancerID).Extract()
lb, err = loadbalancers.Get(context.TODO(), c.LoadBalancerClient(), loadbalancerID).Extract()
if err != nil {
return false, err
}
@ -267,7 +269,7 @@ func listLBs(c OpenstackCloud, opt loadbalancers.ListOptsBuilder) (lbs []loadbal
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := loadbalancers.List(c.LoadBalancerClient(), opt).AllPages()
allPages, err := loadbalancers.List(c.LoadBalancerClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list loadbalancers: %s", err)
}
@ -296,7 +298,7 @@ func getLBStats(c OpenstackCloud, loadbalancerID string) (stats *loadbalancers.S
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
stats, err = loadbalancers.GetStats(c.LoadBalancerClient(), loadbalancerID).Extract()
stats, err = loadbalancers.GetStats(context.TODO(), c.LoadBalancerClient(), loadbalancerID).Extract()
if err != nil {
return false, fmt.Errorf("Error getting load balancer stats %v", err)
}
@ -321,7 +323,7 @@ func getPool(c OpenstackCloud, poolID string) (pool *v2pools.Pool, err error) {
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
pool, err = v2pools.Get(c.LoadBalancerClient(), poolID).Extract()
pool, err = v2pools.Get(context.TODO(), c.LoadBalancerClient(), poolID).Extract()
if err != nil {
return false, err
}
@ -346,7 +348,7 @@ func getPoolMember(c OpenstackCloud, poolID string, memberID string) (member *v2
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
member, err = v2pools.GetMember(c.LoadBalancerClient(), poolID, memberID).Extract()
member, err = v2pools.GetMember(context.TODO(), c.LoadBalancerClient(), poolID, memberID).Extract()
if err != nil {
return false, err
}
@ -371,16 +373,15 @@ func updateMemberInPool(c OpenstackCloud, poolID string, memberID string, opts v
}
done, err := vfs.RetryWithBackoff(memberBackoff, func() (bool, error) {
association, err = v2pools.UpdateMember(c.LoadBalancerClient(), poolID, memberID, opts).Extract()
association, err = v2pools.UpdateMember(context.TODO(), c.LoadBalancerClient(), poolID, memberID, opts).Extract()
if err != nil {
// member not found anymore
if isNotFound(err) {
return true, nil
}
// pool is currently in immutable state, try to retry
errCode, ok := err.(gophercloud.ErrDefault409)
if ok {
klog.Infof("got error %v retrying...", errCode)
if gophercloud.ResponseCodeIs(err, http.StatusConflict) {
klog.Infof("got error %v retrying...", http.StatusConflict)
return false, nil
}
return false, fmt.Errorf("failed to update pool membership: %v", err)
@ -406,10 +407,10 @@ func associateToPool(c OpenstackCloud, server *servers.Server, poolID string, op
}
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
association, err = v2pools.GetMember(c.LoadBalancerClient(), poolID, server.ID).Extract()
association, err = v2pools.GetMember(context.TODO(), c.LoadBalancerClient(), poolID, server.ID).Extract()
if err != nil || association == nil {
// Pool association does not exist. Create it
association, err = v2pools.CreateMember(c.LoadBalancerClient(), poolID, opts).Extract()
association, err = v2pools.CreateMember(context.TODO(), c.LoadBalancerClient(), poolID, opts).Extract()
if err != nil {
return false, fmt.Errorf("failed to create pool association: %v", err)
}
@ -437,7 +438,7 @@ func createPool(c OpenstackCloud, opts v2pools.CreateOpts) (pool *v2pools.Pool,
}
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
pool, err = v2pools.Create(c.LoadBalancerClient(), opts).Extract()
pool, err = v2pools.Create(context.TODO(), c.LoadBalancerClient(), opts).Extract()
if err != nil {
return false, fmt.Errorf("failed to create pool: %v", err)
}
@ -462,7 +463,7 @@ func listPoolMembers(c OpenstackCloud, poolID string, opts v2pools.ListMembersOp
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
memberPage, err := v2pools.ListMembers(c.LoadBalancerClient(), poolID, opts).AllPages()
memberPage, err := v2pools.ListMembers(c.LoadBalancerClient(), poolID, opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list members: %v", err)
}
@ -491,7 +492,7 @@ func listPools(c OpenstackCloud, opts v2pools.ListOpts) (poolList []v2pools.Pool
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
poolPage, err := v2pools.List(c.LoadBalancerClient(), opts).AllPages()
poolPage, err := v2pools.List(c.LoadBalancerClient(), opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list pools: %v", err)
}
@ -520,7 +521,7 @@ func listListeners(c OpenstackCloud, opts listeners.ListOpts) (listenerList []li
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
listenerPage, err := listeners.List(c.LoadBalancerClient(), opts).AllPages()
listenerPage, err := listeners.List(c.LoadBalancerClient(), opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("failed to list listeners: %v", err)
}
@ -549,7 +550,7 @@ func createListener(c OpenstackCloud, opts listeners.CreateOpts) (listener *list
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
listener, err = listeners.Create(c.LoadBalancerClient(), opts).Extract()
listener, err = listeners.Create(context.TODO(), c.LoadBalancerClient(), opts).Extract()
if err != nil {
return false, fmt.Errorf("unabled to create listener: %v", err)
}

View File

@ -19,29 +19,29 @@ package openstack
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud"
cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
az "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2"
cinder "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
az "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/volumeattach"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
v1 "k8s.io/api/core/v1"
"k8s.io/kops/cloudmock/openstack/mockblockstorage"
"k8s.io/kops/cloudmock/openstack/mockcompute"
@ -173,8 +173,8 @@ func (c *MockCloud) AttachVolume(serverID string, opts volumeattach.CreateOpts)
return attachVolume(c, serverID, opts)
}
func (c *MockCloud) CreateInstance(opt servers.CreateOptsBuilder, portID string) (*servers.Server, error) {
return createInstance(c, opt, portID)
func (c *MockCloud) CreateInstance(opt servers.CreateOptsBuilder, schedulerHints servers.SchedulerHintOptsBuilder, portID string) (*servers.Server, error) {
return createInstance(c, opt, schedulerHints, portID)
}
func (c *MockCloud) CreateKeypair(opt keypairs.CreateOptsBuilder) (*keypairs.KeyPair, error) {

View File

@ -17,12 +17,13 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/attributestags"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/pagination"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/attributestags"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/external"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/pagination"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -33,7 +34,7 @@ func (c *openstackCloud) AppendTag(resource string, id string, tag string) error
func appendTag(c OpenstackCloud, resource string, id string, tag string) error {
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
err := attributestags.Add(c.NetworkingClient(), resource, id, tag).ExtractErr()
err := attributestags.Add(context.TODO(), c.NetworkingClient(), resource, id, tag).ExtractErr()
if err != nil {
return false, fmt.Errorf("error appending tag %s: %v", tag, err)
}
@ -54,7 +55,7 @@ func (c *openstackCloud) DeleteTag(resource string, id string, tag string) error
func deleteTag(c OpenstackCloud, resource string, id string, tag string) error {
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
err := attributestags.Delete(c.NetworkingClient(), resource, id, tag).ExtractErr()
err := attributestags.Delete(context.TODO(), c.NetworkingClient(), resource, id, tag).ExtractErr()
if err != nil {
return false, fmt.Errorf("error deleting tag %s: %v", tag, err)
}
@ -105,7 +106,7 @@ func (c *openstackCloud) GetNetwork(id string) (*networks.Network, error) {
func getNetwork(c OpenstackCloud, id string) (*networks.Network, error) {
var network *networks.Network
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
r, err := networks.Get(c.NetworkingClient(), id).Extract()
r, err := networks.Get(context.TODO(), c.NetworkingClient(), id).Extract()
if err != nil {
return false, fmt.Errorf("error retrieving network with id %s: %v", id, err)
}
@ -129,7 +130,7 @@ func listNetworks(c OpenstackCloud, opt networks.ListOptsBuilder) ([]networks.Ne
var ns []networks.Network
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := networks.List(c.NetworkingClient(), opt).AllPages()
allPages, err := networks.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing networks: %v", err)
}
@ -161,7 +162,7 @@ func getExternalNetwork(c OpenstackCloud, networkName string) (net *networks.Net
}
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
err = networks.List(c.NetworkingClient(), networks.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
err = networks.List(c.NetworkingClient(), networks.ListOpts{}).EachPage(context.TODO(), func(ctx context.Context, page pagination.Page) (bool, error) {
var externalNetwork []NetworkWithExternalExt
err := networks.ExtractNetworksInto(page, &externalNetwork)
if err != nil {
@ -198,7 +199,7 @@ func createNetwork(c OpenstackCloud, opt networks.CreateOptsBuilder) (*networks.
var n *networks.Network
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
r, err := networks.Create(c.NetworkingClient(), opt).Extract()
r, err := networks.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating network: %v", err)
}
@ -220,7 +221,7 @@ func (c *openstackCloud) DeleteNetwork(networkID string) error {
func deleteNetwork(c OpenstackCloud, networkID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := networks.Delete(c.NetworkingClient(), networkID).ExtractErr()
err := networks.Delete(context.TODO(), c.NetworkingClient(), networkID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting network: %v", err)
}

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -32,7 +33,7 @@ func createPort(c OpenstackCloud, opt ports.CreateOptsBuilder) (*ports.Port, err
var p *ports.Port
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
port, err := ports.Create(c.NetworkingClient(), opt).Extract()
port, err := ports.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating port: %v", err)
}
@ -56,7 +57,7 @@ func updatePort(c OpenstackCloud, id string, opt ports.UpdateOptsBuilder) (*port
var p *ports.Port
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
port, err := ports.Update(c.NetworkingClient(), id, opt).Extract()
port, err := ports.Update(context.TODO(), c.NetworkingClient(), id, opt).Extract()
if err != nil {
return false, err
}
@ -80,7 +81,7 @@ func getPort(c OpenstackCloud, id string) (*ports.Port, error) {
var p *ports.Port
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
port, err := ports.Get(c.NetworkingClient(), id).Extract()
port, err := ports.Get(context.TODO(), c.NetworkingClient(), id).Extract()
if err != nil {
return false, err
}
@ -104,7 +105,7 @@ func listPorts(c OpenstackCloud, opt ports.ListOptsBuilder) ([]ports.Port, error
var p []ports.Port
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := ports.List(c.NetworkingClient(), opt).AllPages()
allPages, err := ports.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing ports: %v", err)
}
@ -131,7 +132,7 @@ func (c *openstackCloud) DeletePort(portID string) error {
func deletePort(c OpenstackCloud, portID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := ports.Delete(c.NetworkingClient(), portID).ExtractErr()
err := ports.Delete(context.TODO(), c.NetworkingClient(), portID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting port: %v", err)
}

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -32,7 +33,7 @@ func listRouters(c OpenstackCloud, opt routers.ListOpts) ([]routers.Router, erro
var rs []routers.Router
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := routers.List(c.NetworkingClient(), opt).AllPages()
allPages, err := routers.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing routers: %v", err)
}
@ -61,7 +62,7 @@ func createRouter(c OpenstackCloud, opt routers.CreateOptsBuilder) (*routers.Rou
var r *routers.Router
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := routers.Create(c.NetworkingClient(), opt).Extract()
v, err := routers.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating router: %v", err)
}
@ -85,7 +86,7 @@ func createRouterInterface(c OpenstackCloud, routerID string, opt routers.AddInt
var i *routers.InterfaceInfo
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := routers.AddInterface(c.NetworkingClient(), routerID, opt).Extract()
v, err := routers.AddInterface(context.TODO(), c.NetworkingClient(), routerID, opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating router interface: %v", err)
}
@ -107,7 +108,7 @@ func (c *openstackCloud) DeleteRouterInterface(routerID string, opt routers.Remo
func deleteRouterInterface(c OpenstackCloud, routerID string, opt routers.RemoveInterfaceOptsBuilder) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
_, err := routers.RemoveInterface(c.NetworkingClient(), routerID, opt).Extract()
_, err := routers.RemoveInterface(context.TODO(), c.NetworkingClient(), routerID, opt).Extract()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting router interface: %v", err)
}
@ -131,7 +132,7 @@ func (c *openstackCloud) DeleteRouter(routerID string) error {
func deleteRouter(c OpenstackCloud, routerID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := routers.Delete(c.NetworkingClient(), routerID).ExtractErr()
err := routers.Delete(context.TODO(), c.NetworkingClient(), routerID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting router: %v", err)
}

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/util/pkg/vfs"
)
@ -33,7 +34,7 @@ func listSecurityGroups(c OpenstackCloud, opt sg.ListOpts) ([]sg.SecGroup, error
var groups []sg.SecGroup
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := sg.List(c.NetworkingClient(), opt).AllPages()
allPages, err := sg.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing security groups %v: %v", opt, err)
}
@ -62,7 +63,7 @@ func createSecurityGroup(c OpenstackCloud, opt sg.CreateOptsBuilder) (*sg.SecGro
var group *sg.SecGroup
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
g, err := sg.Create(c.NetworkingClient(), opt).Extract()
g, err := sg.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating security group %v: %v", opt, err)
}
@ -86,7 +87,7 @@ func listSecurityGroupRules(c OpenstackCloud, opt sgr.ListOpts) ([]sgr.SecGroupR
var rules []sgr.SecGroupRule
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := sgr.List(c.NetworkingClient(), opt).AllPages()
allPages, err := sgr.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing security group rules %v: %v", opt, err)
}
@ -115,7 +116,7 @@ func createSecurityGroupRule(c OpenstackCloud, opt sgr.CreateOptsBuilder) (*sgr.
var rule *sgr.SecGroupRule
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
r, err := sgr.Create(c.NetworkingClient(), opt).Extract()
r, err := sgr.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating security group rule %v: %v", opt, err)
}
@ -137,7 +138,7 @@ func (c *openstackCloud) DeleteSecurityGroup(sgID string) error {
func deleteSecurityGroup(c OpenstackCloud, sgID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := sg.Delete(c.NetworkingClient(), sgID).ExtractErr()
err := sg.Delete(context.TODO(), c.NetworkingClient(), sgID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting security group: %v", err)
}
@ -161,7 +162,7 @@ func (c *openstackCloud) DeleteSecurityGroupRule(ruleID string) error {
func deleteSecurityGroupRule(c OpenstackCloud, ruleID string) error {
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
err := sgr.Delete(c.NetworkingClient(), ruleID).ExtractErr()
err := sgr.Delete(context.TODO(), c.NetworkingClient(), ruleID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting security group rule: %v", err)
}

View File

@ -17,11 +17,12 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
@ -39,7 +40,7 @@ func createServerGroup(c OpenstackCloud, opt servergroups.CreateOptsBuilder) (*s
var i *servergroups.ServerGroup
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := servergroups.Create(c.ComputeClient(), opt).Extract()
v, err := servergroups.Create(context.TODO(), c.ComputeClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating server group: %v", err)
}
@ -63,7 +64,7 @@ func listServerGroups(c OpenstackCloud, opts servergroups.ListOptsBuilder) ([]se
var sgs []servergroups.ServerGroup
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := servergroups.List(c.ComputeClient(), opts).AllPages()
allPages, err := servergroups.List(c.ComputeClient(), opts).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing server groups: %v", err)
}
@ -141,7 +142,7 @@ func (c *openstackCloud) DeleteServerGroup(groupID string) error {
func deleteServerGroup(c OpenstackCloud, groupID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := servergroups.Delete(c.ComputeClient(), groupID).ExtractErr()
err := servergroups.Delete(context.TODO(), c.ComputeClient(), groupID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting server group: %v", err)
}

View File

@ -33,7 +33,7 @@ import (
"fmt"
"strings"
cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
cinderv3 "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/protokube/pkg/etcd"

View File

@ -17,9 +17,10 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/util/pkg/vfs"
@ -33,7 +34,7 @@ func listSubnets(c OpenstackCloud, opt subnets.ListOptsBuilder) ([]subnets.Subne
var s []subnets.Subnet
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := subnets.List(c.NetworkingClient(), opt).AllPages()
allPages, err := subnets.List(c.NetworkingClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing subnets: %v", err)
}
@ -61,7 +62,7 @@ func (c *openstackCloud) GetSubnet(subnetID string) (*subnets.Subnet, error) {
func getSubnet(c OpenstackCloud, subnetID string) (*subnets.Subnet, error) {
var subnet *subnets.Subnet
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
sub, err := subnets.Get(c.NetworkingClient(), subnetID).Extract()
sub, err := subnets.Get(context.TODO(), c.NetworkingClient(), subnetID).Extract()
if err != nil {
return false, fmt.Errorf("error retrieving subnet: %v", err)
}
@ -85,7 +86,7 @@ func createSubnet(c OpenstackCloud, opt subnets.CreateOptsBuilder) (*subnets.Sub
var s *subnets.Subnet
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := subnets.Create(c.NetworkingClient(), opt).Extract()
v, err := subnets.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
if err != nil {
return false, fmt.Errorf("error creating subnet: %v", err)
}
@ -107,7 +108,7 @@ func (c *openstackCloud) DeleteSubnet(subnetID string) error {
func deleteSubnet(c OpenstackCloud, subnetID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := subnets.Delete(c.NetworkingClient(), subnetID).ExtractErr()
err := subnets.Delete(context.TODO(), c.NetworkingClient(), subnetID).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting subnet: %v", err)
}

View File

@ -17,11 +17,12 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
"sort"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/kops/pkg/apis/kops"
)
@ -58,7 +59,7 @@ func (c *openstackCloud) DefaultInstanceType(cluster *kops.Cluster, ig *kops.Ins
func defaultInstanceType(c OpenstackCloud, cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error) {
flavorPage, err := flavors.ListDetail(c.ComputeClient(), flavors.ListOpts{
MinRAM: 1024,
}).AllPages()
}).AllPages(context.TODO())
if err != nil {
return "", fmt.Errorf("Could not list flavors: %v", err)
}

View File

@ -26,9 +26,9 @@ import (
"strings"
"github.com/go-viper/mapstructure/v2"
"github.com/gophercloud/gophercloud"
gos "github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2"
gos "github.com/gophercloud/gophercloud/v2/openstack"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
@ -72,7 +72,7 @@ func NewOpenstackVerifier(opt *OpenStackVerifierOptions) (bootstrap.Verifier, er
// node-controller should be able to renew it tokens against OpenStack API
env.AllowReauth = true
err = gos.Authenticate(provider, env)
err = gos.Authenticate(context.TODO(), provider, env)
if err != nil {
return nil, err
}
@ -126,7 +126,7 @@ func (o openstackVerifier) VerifyToken(ctx context.Context, rawRequest *http.Req
}
serverID := strings.TrimPrefix(token, OpenstackAuthenticationTokenPrefix)
instance, err := servers.Get(o.novaClient, serverID).Extract()
instance, err := servers.Get(ctx, o.novaClient, serverID).Extract()
if err != nil {
return nil, fmt.Errorf("failed to get info for server %q: %w", token, err)
}

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstack
import (
"context"
"fmt"
cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
cinder "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/volumeattach"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
"k8s.io/kops/util/pkg/vfs"
@ -34,7 +35,7 @@ func listVolumes(c OpenstackCloud, opt cinder.ListOptsBuilder) ([]cinder.Volume,
var volumes []cinder.Volume
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
allPages, err := cinder.List(c.BlockStorageClient(), opt).AllPages()
allPages, err := cinder.List(c.BlockStorageClient(), opt).AllPages(context.TODO())
if err != nil {
return false, fmt.Errorf("error listing volumes %v: %v", opt, err)
}
@ -63,7 +64,7 @@ func createVolume(c OpenstackCloud, opt cinder.CreateOptsBuilder) (*cinder.Volum
var volume *cinder.Volume
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
v, err := cinder.Create(c.BlockStorageClient(), opt).Extract()
v, err := cinder.Create(context.TODO(), c.BlockStorageClient(), opt, nil).Extract()
if err != nil {
return false, fmt.Errorf("error creating volume %v: %v", opt, err)
}
@ -85,7 +86,7 @@ func (c *openstackCloud) AttachVolume(serverID string, opts volumeattach.CreateO
func attachVolume(c OpenstackCloud, serverID string, opts volumeattach.CreateOpts) (attachment *volumeattach.VolumeAttachment, err error) {
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
volumeAttachment, err := volumeattach.Create(c.ComputeClient(), serverID, opts).Extract()
volumeAttachment, err := volumeattach.Create(context.TODO(), c.ComputeClient(), serverID, opts).Extract()
if err != nil {
return false, fmt.Errorf("error attaching volume %s to server %s: %v", opts.VolumeID, serverID, err)
}
@ -116,7 +117,7 @@ func setVolumeTags(c OpenstackCloud, id string, tags map[string]string) error {
opt := cinder.UpdateOpts{Metadata: tags}
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
_, err := cinder.Update(c.BlockStorageClient(), id, opt).Extract()
_, err := cinder.Update(context.TODO(), c.BlockStorageClient(), id, opt).Extract()
if err != nil {
return false, fmt.Errorf("error setting tags to cinder volume %q: %v", id, err)
}
@ -137,7 +138,7 @@ func (c *openstackCloud) DeleteVolume(volumeID string) error {
func deleteVolume(c OpenstackCloud, volumeID string) error {
done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {
err := cinder.Delete(c.BlockStorageClient(), volumeID, cinder.DeleteOpts{}).ExtractErr()
err := cinder.Delete(context.TODO(), c.BlockStorageClient(), volumeID, cinder.DeleteOpts{}).ExtractErr()
if err != nil && !isNotFound(err) {
return false, fmt.Errorf("error deleting volume: %v", err)
}

View File

@ -17,13 +17,14 @@ limitations under the License.
package openstacktasks
import (
"context"
"fmt"
"strings"
"time"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/wellknownservices"
@ -298,7 +299,7 @@ func (f *FloatingIP) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, chan
return nil
}
if changes.Name != nil {
_, err := l3floatingip.Update(cloud.NetworkingClient(), fi.ValueOf(a.ID), l3floatingip.UpdateOpts{
_, err := l3floatingip.Update(context.TODO(), cloud.NetworkingClient(), fi.ValueOf(a.ID), l3floatingip.UpdateOpts{
Description: e.Name,
}).Extract()
if err != nil {

View File

@ -17,18 +17,17 @@ limitations under the License.
package openstacktasks
import (
"context"
"fmt"
"strconv"
"strings"
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
l3floatingip "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/attachinterfaces"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/truncate"
"k8s.io/kops/pkg/wellknownservices"
@ -366,24 +365,18 @@ func (_ *Instance) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, change
if e.AvailabilityZone != nil {
opt.AvailabilityZone = fi.ValueOf(e.AvailabilityZone)
}
if opt, err = includeBootVolumeOptions(t, e, opt); err != nil {
return err
}
keyext := keypairs.CreateOptsExt{
CreateOptsBuilder: opt,
KeyName: openstackKeyPairName(fi.ValueOf(e.SSHKey)),
}
sgext := schedulerhints.CreateOptsExt{
CreateOptsBuilder: keyext,
SchedulerHints: &schedulerhints.SchedulerHints{
Group: *e.ServerGroup.ID,
},
}
schedulerHints := servers.SchedulerHintOpts{Group: *e.ServerGroup.ID}
opts, err := includeBootVolumeOptions(t, e, sgext)
if err != nil {
return err
}
v, err := t.Cloud.CreateInstance(opts, fi.ValueOf(e.Port.ID))
v, err := t.Cloud.CreateInstance(keyext, schedulerHints, fi.ValueOf(e.Port.ID))
if err != nil {
return fmt.Errorf("Error creating instance: %v", err)
}
@ -401,7 +394,7 @@ func (_ *Instance) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, change
return nil
}
if changes.Port != nil {
_, err := attachinterfaces.Create(cloud.ComputeClient(), fi.ValueOf(e.ID), attachinterfaces.CreateOpts{
_, err := attachinterfaces.Create(context.TODO(), cloud.ComputeClient(), fi.ValueOf(e.ID), attachinterfaces.CreateOpts{
PortID: fi.ValueOf(changes.Port.ID),
}).Extract()
if err != nil {
@ -420,7 +413,7 @@ func (_ *Instance) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, change
func associateFloatingIP(t *openstack.OpenstackAPITarget, e *Instance) error {
client := t.Cloud.NetworkingClient()
_, err := l3floatingip.Update(client, fi.ValueOf(e.FloatingIP.ID), l3floatingip.UpdateOpts{
_, err := l3floatingip.Update(context.TODO(), client, fi.ValueOf(e.FloatingIP.ID), l3floatingip.UpdateOpts{
PortID: e.Port.ID,
}).Extract()
if err != nil {
@ -429,38 +422,36 @@ func associateFloatingIP(t *openstack.OpenstackAPITarget, e *Instance) error {
return nil
}
func includeBootVolumeOptions(t *openstack.OpenstackAPITarget, e *Instance, opts servers.CreateOptsBuilder) (servers.CreateOptsBuilder, error) {
func includeBootVolumeOptions(t *openstack.OpenstackAPITarget, e *Instance, opts servers.CreateOpts) (servers.CreateOpts, error) {
if !bootFromVolume(e.Metadata) {
return opts, nil
}
i, err := t.Cloud.GetImage(fi.ValueOf(e.Image))
if err != nil {
return nil, fmt.Errorf("Error getting image information: %v", err)
return servers.CreateOpts{}, fmt.Errorf("Error getting image information: %v", err)
}
bfv := bootfromvolume.CreateOptsExt{
CreateOptsBuilder: opts,
BlockDevice: []bootfromvolume.BlockDevice{{
BootIndex: 0,
DeleteOnTermination: true,
DestinationType: "volume",
SourceType: "image",
UUID: i.ID,
VolumeSize: i.MinDiskGigabytes,
}},
blockDevice := servers.BlockDevice{
BootIndex: 0,
DeleteOnTermination: true,
DestinationType: "volume",
SourceType: "image",
UUID: i.ID,
VolumeSize: i.MinDiskGigabytes,
}
if s, ok := e.Metadata[openstack.BOOT_VOLUME_SIZE]; ok {
i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return nil, fmt.Errorf("Invalid value for %v: %v", openstack.BOOT_VOLUME_SIZE, err)
return servers.CreateOpts{}, fmt.Errorf("Invalid value for %v: %v", openstack.BOOT_VOLUME_SIZE, err)
}
bfv.BlockDevice[0].VolumeSize = int(i)
blockDevice.VolumeSize = int(i)
}
return bfv, nil
opts.BlockDevice = []servers.BlockDevice{blockDevice}
return opts, nil
}
func bootFromVolume(m map[string]string) bool {

View File

@ -21,7 +21,7 @@ import (
"reflect"
"testing"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/kops/pkg/truncate"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
)

View File

@ -17,14 +17,15 @@ limitations under the License.
package openstacktasks
import (
"context"
"fmt"
"time"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
@ -66,7 +67,7 @@ func waitLoadbalancerActiveProvisioningStatus(client *gophercloud.ServiceClient,
var provisioningStatus string
err := wait.ExponentialBackoff(backoff, func() (bool, error) {
loadbalancer, err := loadbalancers.Get(client, loadbalancerID).Extract()
loadbalancer, err := loadbalancers.Get(context.TODO(), client, loadbalancerID).Extract()
if err != nil {
return false, err
}
@ -109,7 +110,7 @@ func (s *LB) CompareWithID() *string {
func NewLBTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle fi.Lifecycle, lb *loadbalancers.LoadBalancer, find *LB) (*LB, error) {
osCloud := cloud
sub, err := subnets.Get(osCloud.NetworkingClient(), lb.VipSubnetID).Extract()
sub, err := subnets.Get(context.TODO(), osCloud.NetworkingClient(), lb.VipSubnetID).Extract()
if err != nil {
return nil, err
}
@ -155,7 +156,7 @@ func (s *LB) Find(context *fi.CloudupContext) (*LB, error) {
cloud := context.T.Cloud.(openstack.OpenstackCloud)
lbPage, err := loadbalancers.List(cloud.LoadBalancerClient(), loadbalancers.ListOpts{
Name: fi.ValueOf(s.Name),
}).AllPages()
}).AllPages(context.Context())
if err != nil {
return nil, fmt.Errorf("Failed to retrieve loadbalancers for name %s: %v", fi.ValueOf(s.Name), err)
}
@ -228,7 +229,7 @@ func (_ *LB) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *LB)
opts := ports.UpdateOpts{
SecurityGroups: &[]string{fi.ValueOf(e.SecurityGroup.ID)},
}
_, err = ports.Update(t.Cloud.NetworkingClient(), lb.VipPortID, opts).Extract()
_, err = ports.Update(context.TODO(), t.Cloud.NetworkingClient(), lb.VipPortID, opts).Extract()
if err != nil {
return fmt.Errorf("Failed to update security group for port %s: %v", lb.VipPortID, err)
}
@ -247,7 +248,7 @@ func (_ *LB) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *LB)
opts := ports.UpdateOpts{
SecurityGroups: &[]string{fi.ValueOf(e.SecurityGroup.ID)},
}
_, err = ports.Update(t.Cloud.NetworkingClient(), fi.ValueOf(a.PortID), opts).Extract()
_, err = ports.Update(context.TODO(), t.Cloud.NetworkingClient(), fi.ValueOf(a.PortID), opts).Extract()
if err != nil {
return fmt.Errorf("Failed to update security group for port %s: %v", fi.ValueOf(a.PortID), err)
}

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstacktasks
import (
"context"
"fmt"
"sort"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/listeners"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
@ -172,7 +173,7 @@ func (_ *LBListener) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, chan
opts := listeners.UpdateOpts{
AllowedCIDRs: &changes.AllowedCIDRs,
}
_, err := listeners.Update(t.Cloud.LoadBalancerClient(), fi.ValueOf(a.ID), opts).Extract()
_, err := listeners.Update(context.TODO(), t.Cloud.LoadBalancerClient(), fi.ValueOf(a.ID), opts).Extract()
if err != nil {
return fmt.Errorf("error updating LB listener: %v", err)
}

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -19,10 +19,10 @@ package openstacktasks
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud"
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
"github.com/gophercloud/gophercloud/v2"
v2pools "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/pools"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
"k8s.io/kops/util/pkg/vfs"

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -21,8 +21,8 @@ import (
"sort"
"strings"
secgroup "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
secgroup "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/wellknownservices"
"k8s.io/kops/upup/pkg/fi"

View File

@ -22,8 +22,8 @@ import (
"sort"
"testing"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi"

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -19,8 +19,8 @@ package openstacktasks
import (
"fmt"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -21,8 +21,8 @@ import (
"strconv"
"strings"
sg "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
sg "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
sgr "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
sgr "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
sgr "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
@ -232,7 +232,7 @@ func (o *SecurityGroupRule) FindDeletions(c *fi.CloudupContext) ([]fi.CloudupDel
return nil, nil
}
cloud := c.T.Cloud.(openstack.OpenstackCloud)
rule, err := sgr.Get(cloud.NetworkingClient(), fi.ValueOf(o.ID)).Extract()
rule, err := sgr.Get(c.Context(), cloud.NetworkingClient(), fi.ValueOf(o.ID)).Extract()
if err != nil {
return nil, err
}

View File

@ -20,8 +20,8 @@ import (
"fmt"
"strings"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servergroups"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -20,7 +20,7 @@ import (
"fmt"
"strings"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/pki"

View File

@ -17,10 +17,11 @@ limitations under the License.
package openstacktasks
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
@ -190,7 +191,7 @@ func (*Subnet) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *S
}
opt.DNSNameservers = &dnsNameSrv
}
result := subnets.Update(client, fi.ValueOf(a.ID), opt)
result := subnets.Update(context.TODO(), client, fi.ValueOf(a.ID), opt)
klog.Infof("Updated %v", opt)
if result.Err != nil {
return fmt.Errorf("error updating subnet %v: %v", a.ID, result.Err)

View File

@ -19,7 +19,7 @@ package openstacktasks
import (
"fmt"
cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
cinderv3 "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"

View File

@ -30,7 +30,7 @@ import (
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
awsconfig "github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/v2"
"google.golang.org/api/option"
storage "google.golang.org/api/storage/v1"
"k8s.io/apimachinery/pkg/util/wait"

View File

@ -32,11 +32,11 @@ import (
"time"
"github.com/go-ini/ini"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
swiftcontainer "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers"
swiftobject "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
"github.com/gophercloud/gophercloud/pagination"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
swiftcontainer "github.com/gophercloud/gophercloud/v2/openstack/objectstorage/v1/containers"
swiftobject "github.com/gophercloud/gophercloud/v2/openstack/objectstorage/v1/objects"
"github.com/gophercloud/gophercloud/v2/pagination"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/util/homedir"
"k8s.io/klog/v2"
@ -70,7 +70,7 @@ func NewSwiftClient(ctx context.Context) (*gophercloud.ServiceClient, error) {
klog.V(2).Info("authenticating to keystone")
err = openstack.Authenticate(pc, authOption)
err = openstack.Authenticate(ctx, pc, authOption)
if err != nil {
return nil, fmt.Errorf("error building openstack authenticated client: %v", err)
}
@ -288,7 +288,7 @@ func (p *SwiftPath) Remove(ctx context.Context) error {
return false, err
}
opt := swiftobject.DeleteOpts{}
if _, err := swiftobject.Delete(client, p.bucket, p.key, opt).Extract(); err != nil {
if _, err := swiftobject.Delete(ctx, client, p.bucket, p.key, opt).Extract(); err != nil {
if isSwiftNotFound(err) {
return true, os.ErrNotExist
}
@ -337,7 +337,7 @@ func (p *SwiftPath) RemoveAll(ctx context.Context) error {
if err != nil {
return false, err
}
if _, err := swiftobject.BulkDelete(client, p.bucket, objectsToDelete).Extract(); err != nil {
if _, err := swiftobject.BulkDelete(ctx, client, p.bucket, objectsToDelete).Extract(); err != nil {
if isSwiftNotFound(err) {
return true, os.ErrNotExist
}
@ -386,7 +386,7 @@ func (p *SwiftPath) WriteFile(ctx context.Context, data io.ReadSeeker, acl ACL)
}
createOpts := swiftobject.CreateOpts{Content: data}
if _, err := swiftobject.Create(client, p.bucket, p.key, createOpts).Extract(); err != nil {
if _, err := swiftobject.Create(ctx, client, p.bucket, p.key, createOpts).Extract(); err != nil {
return false, fmt.Errorf("error writing %s: %v", p, err)
}
@ -421,7 +421,7 @@ func (p *SwiftPath) CreateFile(ctx context.Context, data io.ReadSeeker, acl ACL)
if _, err := RetryWithBackoff(swiftReadBackoff, func() (bool, error) {
klog.V(4).Infof("Getting file %q", p)
_, err := swiftobject.Get(client, p.bucket, p.key, swiftobject.GetOpts{}).Extract()
_, err := swiftobject.Get(ctx, client, p.bucket, p.key, swiftobject.GetOpts{}).Extract()
if err == nil {
return true, nil
} else if isSwiftNotFound(err) {
@ -452,12 +452,12 @@ func (p *SwiftPath) createBucket() error {
return false, err
}
if _, err := swiftcontainer.Get(client, p.bucket, swiftcontainer.GetOpts{}).Extract(); err == nil {
if _, err := swiftcontainer.Get(ctx, client, p.bucket, swiftcontainer.GetOpts{}).Extract(); err == nil {
return true, nil
}
if isSwiftNotFound(err) {
createOpts := swiftcontainer.CreateOpts{}
_, err = swiftcontainer.Create(client, p.bucket, createOpts).Extract()
_, err = swiftcontainer.Create(ctx, client, p.bucket, createOpts).Extract()
return err == nil, err
}
return false, err
@ -510,7 +510,7 @@ func (p *SwiftPath) WriteTo(out io.Writer) (int64, error) {
}
opt := swiftobject.DownloadOpts{}
result := swiftobject.Download(client, p.bucket, p.key, opt)
result := swiftobject.Download(ctx, client, p.bucket, p.key, opt)
if result.Err != nil {
if isSwiftNotFound(result.Err) {
return 0, os.ErrNotExist
@ -534,7 +534,7 @@ func (p *SwiftPath) readPath(opt swiftobject.ListOpts) ([]Path, error) {
var paths []Path
pager := swiftobject.List(client, p.bucket, opt)
if err := pager.EachPage(func(page pagination.Page) (bool, error) {
if err := pager.EachPage(ctx, func(ctx context.Context, page pagination.Page) (bool, error) {
objects, err1 := swiftobject.ExtractInfo(page)
if err1 != nil {
return false, err1
@ -576,7 +576,6 @@ func (p *SwiftPath) ReadDir() ([]Path, error) {
prefix += "/"
}
opt := swiftobject.ListOpts{
Full: true,
Path: prefix,
}
return p.readPath(opt)
@ -589,7 +588,6 @@ func (p *SwiftPath) ReadTree(ctx context.Context) ([]Path, error) {
prefix += "/"
}
opt := swiftobject.ListOpts{
Full: true,
Prefix: prefix,
}
return p.readPath(opt)
@ -622,9 +620,5 @@ func (p *SwiftPath) Hash(a hashing.HashAlgorithm) (*hashing.Hash, error) {
}
func isSwiftNotFound(err error) bool {
if err == nil {
return false
}
_, ok := err.(gophercloud.ErrDefault404)
return ok
return gophercloud.ResponseCodeIs(err, http.StatusNotFound)
}

View File

@ -1,172 +0,0 @@
# Gophercloud: an OpenStack SDK for Go
[![Coverage Status](https://coveralls.io/repos/github/gophercloud/gophercloud/badge.svg?branch=v1)](https://coveralls.io/github/gophercloud/gophercloud?branch=v1)
Gophercloud is an OpenStack Go SDK.
## Useful links
* [Reference documentation](http://godoc.org/github.com/gophercloud/gophercloud)
* [Effective Go](https://golang.org/doc/effective_go.html)
## How to install
Reference a Gophercloud package in your code:
```go
import "github.com/gophercloud/gophercloud"
```
Then update your `go.mod`:
```shell
go mod tidy
```
## Getting started
### Credentials
Because you'll be hitting an API, you will need to retrieve your OpenStack
credentials and either store them in a `clouds.yaml` file, as environment
variables, or in your local Go files. The first method is recommended because
it decouples credential information from source code, allowing you to push the
latter to your version control system without any security risk.
You will need to retrieve the following:
* A valid Keystone identity URL
* Credentials. These can be a username/password combo, a set of Application
Credentials, a pre-generated token, or any other supported authentication
mechanism.
For users who have the OpenStack dashboard installed, there's a shortcut. If
you visit the `project/api_access` path in Horizon and click on the
"Download OpenStack RC File" button at the top right hand corner, you can
download either a `clouds.yaml` file or an `openrc` bash file that exports all
of your access details to environment variables. To use the `clouds.yaml` file,
place it at `~/.config/openstack/clouds.yaml`. To use the `openrc` file, run
`source openrc` and you will be prompted for your password.
### Authentication
Once you have access to your credentials, you can begin plugging them into
Gophercloud. The next step is authentication, which is handled by a base
"Provider" struct. There are number of ways to construct such a struct.
**With `gophercloud/utils`**
The [github.com/gophercloud/utils](https://github.com/gophercloud/utils)
library provides the `clientconfig` package to simplify authentication. It
provides additional functionality, such as the ability to read `clouds.yaml`
files. To generate a "Provider" struct using the `clientconfig` package:
```go
import (
"github.com/gophercloud/utils/openstack/clientconfig"
)
// You can also skip configuring this and instead set 'OS_CLOUD' in your
// environment
opts := new(clientconfig.ClientOpts)
opts.Cloud = "devstack-admin"
provider, err := clientconfig.AuthenticatedClient(opts)
```
A provider client is a top-level client that all of your OpenStack service
clients derive from. The provider contains all of the authentication details
that allow your Go code to access the API - such as the base URL and token ID.
Once we have a base Provider, we inject it as a dependency into each OpenStack
service. For example, in order to work with the Compute API, we need a Compute
service client. This can be created like so:
```go
client, err := clientconfig.NewServiceClient("compute", opts)
```
**Without `gophercloud/utils`**
> *Note*
> gophercloud doesn't provide support for `clouds.yaml` file so you need to
> implement this functionality yourself if you don't wish to use
> `gophercloud/utils`.
You can also generate a "Provider" struct without using the `clientconfig`
package from `gophercloud/utils`. To do this, you can either pass in your
credentials explicitly or tell Gophercloud to use environment variables:
```go
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
)
// Option 1: Pass in the values yourself
opts := gophercloud.AuthOptions{
IdentityEndpoint: "https://openstack.example.com:5000/v2.0",
Username: "{username}",
Password: "{password}",
}
// Option 2: Use a utility function to retrieve all your environment variables
opts, err := openstack.AuthOptionsFromEnv()
```
Once you have the `opts` variable, you can pass it in and get back a
`ProviderClient` struct:
```go
provider, err := openstack.AuthenticatedClient(opts)
```
As above, you can then use this provider client to generate a service client
for a particular OpenStack service:
```go
client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
Region: os.Getenv("OS_REGION_NAME"),
})
```
### Provision a server
We can use the Compute service client generated above for any Compute API
operation we want. In our case, we want to provision a new server. To do this,
we invoke the `Create` method and pass in the flavor ID (hardware
specification) and image ID (operating system) we're interested in:
```go
import "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
server, err := servers.Create(client, servers.CreateOpts{
Name: "My new server!",
FlavorRef: "flavor_id",
ImageRef: "image_id",
}).Extract()
```
The above code sample creates a new server with the parameters, and embodies the
new resource in the `server` variable (a
[`servers.Server`](http://godoc.org/github.com/gophercloud/gophercloud) struct).
## Advanced Usage
Have a look at the [FAQ](./docs/FAQ.md) for some tips on customizing the way Gophercloud works.
## Backwards-Compatibility Guarantees
Gophercloud versioning follows [semver](https://semver.org/spec/v2.0.0.html).
Before `v1.0.0`, there were no guarantees. Starting with v1, there will be no breaking changes within a major release.
See the [Release instructions](./RELEASE.md).
## Contributing
See the [contributing guide](./.github/CONTRIBUTING.md).
## Help and feedback
If you're struggling with something or have spotted a potential bug, feel free
to submit an issue to our [bug tracker](https://github.com/gophercloud/gophercloud/issues).

View File

@ -1,148 +0,0 @@
/*
Package gophercloud provides a multi-vendor interface to OpenStack-compatible
clouds. The library has a three-level hierarchy: providers, services, and
resources.
# Authenticating with Providers
Provider structs represent the cloud providers that offer and manage a
collection of services. You will generally want to create one Provider
client per OpenStack cloud.
It is now recommended to use the `clientconfig` package found at
https://github.com/gophercloud/utils/tree/master/openstack/clientconfig
for all authentication purposes.
The below documentation is still relevant. clientconfig simply implements
the below and presents it in an easier and more flexible way.
Use your OpenStack credentials to create a Provider client. The
IdentityEndpoint is typically refered to as "auth_url" or "OS_AUTH_URL" in
information provided by the cloud operator. Additionally, the cloud may refer to
TenantID or TenantName as project_id and project_name. Credentials are
specified like so:
opts := gophercloud.AuthOptions{
IdentityEndpoint: "https://openstack.example.com:5000/v2.0",
Username: "{username}",
Password: "{password}",
TenantID: "{tenant_id}",
}
provider, err := openstack.AuthenticatedClient(opts)
You can authenticate with a token by doing:
opts := gophercloud.AuthOptions{
IdentityEndpoint: "https://openstack.example.com:5000/v2.0",
TokenID: "{token_id}",
TenantID: "{tenant_id}",
}
provider, err := openstack.AuthenticatedClient(opts)
You may also use the openstack.AuthOptionsFromEnv() helper function. This
function reads in standard environment variables frequently found in an
OpenStack `openrc` file. Again note that Gophercloud currently uses "tenant"
instead of "project".
opts, err := openstack.AuthOptionsFromEnv()
provider, err := openstack.AuthenticatedClient(opts)
# Service Clients
Service structs are specific to a provider and handle all of the logic and
operations for a particular OpenStack service. Examples of services include:
Compute, Object Storage, Block Storage. In order to define one, you need to
pass in the parent provider, like so:
opts := gophercloud.EndpointOpts{Region: "RegionOne"}
client, err := openstack.NewComputeV2(provider, opts)
# Resources
Resource structs are the domain models that services make use of in order
to work with and represent the state of API resources:
server, err := servers.Get(client, "{serverId}").Extract()
Intermediate Result structs are returned for API operations, which allow
generic access to the HTTP headers, response body, and any errors associated
with the network transaction. To turn a result into a usable resource struct,
you must call the Extract method which is chained to the response, or an
Extract function from an applicable extension:
result := servers.Get(client, "{serverId}")
// Attempt to extract the disk configuration from the OS-DCF disk config
// extension:
config, err := diskconfig.ExtractGet(result)
All requests that enumerate a collection return a Pager struct that is used to
iterate through the results one page at a time. Use the EachPage method on that
Pager to handle each successive Page in a closure, then use the appropriate
extraction method from that request's package to interpret that Page as a slice
of results:
err := servers.List(client, nil).EachPage(func (page pagination.Page) (bool, error) {
s, err := servers.ExtractServers(page)
if err != nil {
return false, err
}
// Handle the []servers.Server slice.
// Return "false" or an error to prematurely stop fetching new pages.
return true, nil
})
If you want to obtain the entire collection of pages without doing any
intermediary processing on each page, you can use the AllPages method:
allPages, err := servers.List(client, nil).AllPages()
allServers, err := servers.ExtractServers(allPages)
This top-level package contains utility functions and data types that are used
throughout the provider and service packages. Of particular note for end users
are the AuthOptions and EndpointOpts structs.
An example retry backoff function, which respects the 429 HTTP response code and a "Retry-After" header:
endpoint := "http://localhost:5000"
provider, err := openstack.NewClient(endpoint)
if err != nil {
panic(err)
}
provider.MaxBackoffRetries = 3 // max three retries
provider.RetryBackoffFunc = func(ctx context.Context, respErr *ErrUnexpectedResponseCode, e error, retries uint) error {
retryAfter := respErr.ResponseHeader.Get("Retry-After")
if retryAfter == "" {
return e
}
var sleep time.Duration
// Parse delay seconds or HTTP date
if v, err := strconv.ParseUint(retryAfter, 10, 32); err == nil {
sleep = time.Duration(v) * time.Second
} else if v, err := time.Parse(http.TimeFormat, retryAfter); err == nil {
sleep = time.Until(v)
} else {
return e
}
if ctx != nil {
select {
case <-time.After(sleep):
case <-ctx.Done():
return e
}
} else {
time.Sleep(sleep)
}
return nil
}
*/
package gophercloud

View File

@ -1,23 +0,0 @@
/*
Package volumes provides information and interaction with volumes in the
OpenStack Block Storage service. A volume is a detachable block storage
device, akin to a USB hard drive. It can only be attached to one instance at
a time.
Example to create a Volume from a Backup
backupID := "20c792f0-bb03-434f-b653-06ef238e337e"
options := volumes.CreateOpts{
Name: "vol-001",
BackupID: &backupID,
}
client.Microversion = "3.47"
volume, err := volumes.Create(client, options).Extract()
if err != nil {
panic(err)
}
fmt.Println(volume)
*/
package volumes

View File

@ -1,208 +0,0 @@
package volumes
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
// CreateOptsBuilder allows extensions to add additional parameters to the
// Create request.
type CreateOptsBuilder interface {
ToVolumeCreateMap() (map[string]interface{}, error)
}
// CreateOpts contains options for creating a Volume. This object is passed to
// the volumes.Create function. For more information about these parameters,
// see the Volume object.
type CreateOpts struct {
// The size of the volume, in GB
Size int `json:"size,omitempty"`
// The availability zone
AvailabilityZone string `json:"availability_zone,omitempty"`
// ConsistencyGroupID is the ID of a consistency group
ConsistencyGroupID string `json:"consistencygroup_id,omitempty"`
// The volume description
Description string `json:"description,omitempty"`
// One or more metadata key and value pairs to associate with the volume
Metadata map[string]string `json:"metadata,omitempty"`
// The volume name
Name string `json:"name,omitempty"`
// the ID of the existing volume snapshot
SnapshotID string `json:"snapshot_id,omitempty"`
// SourceReplica is a UUID of an existing volume to replicate with
SourceReplica string `json:"source_replica,omitempty"`
// the ID of the existing volume
SourceVolID string `json:"source_volid,omitempty"`
// The ID of the image from which you want to create the volume.
// Required to create a bootable volume.
ImageID string `json:"imageRef,omitempty"`
// Specifies the backup ID, from which you want to create the volume.
// Create a volume from a backup is supported since 3.47 microversion
BackupID string `json:"backup_id,omitempty"`
// The associated volume type
VolumeType string `json:"volume_type,omitempty"`
// Multiattach denotes if the volume is multi-attach capable.
Multiattach bool `json:"multiattach,omitempty"`
}
// ToVolumeCreateMap assembles a request body based on the contents of a
// CreateOpts.
func (opts CreateOpts) ToVolumeCreateMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "volume")
}
// Create will create a new Volume based on the values in CreateOpts. To extract
// the Volume object from the response, call the Extract method on the
// CreateResult.
func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
b, err := opts.ToVolumeCreateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// DeleteOptsBuilder allows extensions to add additional parameters to the
// Delete request.
type DeleteOptsBuilder interface {
ToVolumeDeleteQuery() (string, error)
}
// DeleteOpts contains options for deleting a Volume. This object is passed to
// the volumes.Delete function.
type DeleteOpts struct {
// Delete all snapshots of this volume as well.
Cascade bool `q:"cascade"`
}
// ToLoadBalancerDeleteQuery formats a DeleteOpts into a query string.
func (opts DeleteOpts) ToVolumeDeleteQuery() (string, error) {
q, err := gophercloud.BuildQueryString(opts)
return q.String(), err
}
// Delete will delete the existing Volume with the provided ID.
func Delete(client *gophercloud.ServiceClient, id string, opts DeleteOptsBuilder) (r DeleteResult) {
url := deleteURL(client, id)
if opts != nil {
query, err := opts.ToVolumeDeleteQuery()
if err != nil {
r.Err = err
return
}
url += query
}
resp, err := client.Delete(url, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// Get retrieves the Volume with the provided ID. To extract the Volume object
// from the response, call the Extract method on the GetResult.
func Get(client *gophercloud.ServiceClient, id string) (r GetResult) {
resp, err := client.Get(getURL(client, id), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ListOptsBuilder allows extensions to add additional parameters to the List
// request.
type ListOptsBuilder interface {
ToVolumeListQuery() (string, error)
}
// ListOpts holds options for listing Volumes. It is passed to the volumes.List
// function.
type ListOpts struct {
// AllTenants will retrieve volumes of all tenants/projects.
AllTenants bool `q:"all_tenants"`
// Metadata will filter results based on specified metadata.
Metadata map[string]string `q:"metadata"`
// Name will filter by the specified volume name.
Name string `q:"name"`
// Status will filter by the specified status.
Status string `q:"status"`
// TenantID will filter by a specific tenant/project ID.
// Setting AllTenants is required for this.
TenantID string `q:"project_id"`
// Comma-separated list of sort keys and optional sort directions in the
// form of <key>[:<direction>].
Sort string `q:"sort"`
// Requests a page size of items.
Limit int `q:"limit"`
// Used in conjunction with limit to return a slice of items.
Offset int `q:"offset"`
// The ID of the last-seen item.
Marker string `q:"marker"`
}
// ToVolumeListQuery formats a ListOpts into a query string.
func (opts ListOpts) ToVolumeListQuery() (string, error) {
q, err := gophercloud.BuildQueryString(opts)
return q.String(), err
}
// List returns Volumes optionally limited by the conditions provided in ListOpts.
func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
url := listURL(client)
if opts != nil {
query, err := opts.ToVolumeListQuery()
if err != nil {
return pagination.Pager{Err: err}
}
url += query
}
return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
return VolumePage{pagination.LinkedPageBase{PageResult: r}}
})
}
// UpdateOptsBuilder allows extensions to add additional parameters to the
// Update request.
type UpdateOptsBuilder interface {
ToVolumeUpdateMap() (map[string]interface{}, error)
}
// UpdateOpts contain options for updating an existing Volume. This object is passed
// to the volumes.Update function. For more information about the parameters, see
// the Volume object.
type UpdateOpts struct {
Name *string `json:"name,omitempty"`
Description *string `json:"description,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
// ToVolumeUpdateMap assembles a request body based on the contents of an
// UpdateOpts.
func (opts UpdateOpts) ToVolumeUpdateMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "volume")
}
// Update will update the Volume with provided information. To extract the updated
// Volume from the response, call the Extract method on the UpdateResult.
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
b, err := opts.ToVolumeUpdateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Put(updateURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

View File

@ -1,179 +0,0 @@
package volumes
import (
"encoding/json"
"time"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
// Attachment represents a Volume Attachment record
type Attachment struct {
AttachedAt time.Time `json:"-"`
AttachmentID string `json:"attachment_id"`
Device string `json:"device"`
HostName string `json:"host_name"`
ID string `json:"id"`
ServerID string `json:"server_id"`
VolumeID string `json:"volume_id"`
}
// UnmarshalJSON is our unmarshalling helper
func (r *Attachment) UnmarshalJSON(b []byte) error {
type tmp Attachment
var s struct {
tmp
AttachedAt gophercloud.JSONRFC3339MilliNoZ `json:"attached_at"`
}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*r = Attachment(s.tmp)
r.AttachedAt = time.Time(s.AttachedAt)
return err
}
// Volume contains all the information associated with an OpenStack Volume.
type Volume struct {
// Unique identifier for the volume.
ID string `json:"id"`
// Current status of the volume.
Status string `json:"status"`
// Size of the volume in GB.
Size int `json:"size"`
// AvailabilityZone is which availability zone the volume is in.
AvailabilityZone string `json:"availability_zone"`
// The date when this volume was created.
CreatedAt time.Time `json:"-"`
// The date when this volume was last updated
UpdatedAt time.Time `json:"-"`
// Instances onto which the volume is attached.
Attachments []Attachment `json:"attachments"`
// Human-readable display name for the volume.
Name string `json:"name"`
// Human-readable description for the volume.
Description string `json:"description"`
// The type of volume to create, either SATA or SSD.
VolumeType string `json:"volume_type"`
// The ID of the snapshot from which the volume was created
SnapshotID string `json:"snapshot_id"`
// The ID of another block storage volume from which the current volume was created
SourceVolID string `json:"source_volid"`
// The backup ID, from which the volume was restored
// This field is supported since 3.47 microversion
BackupID *string `json:"backup_id"`
// Arbitrary key-value pairs defined by the user.
Metadata map[string]string `json:"metadata"`
// UserID is the id of the user who created the volume.
UserID string `json:"user_id"`
// Indicates whether this is a bootable volume.
Bootable string `json:"bootable"`
// Encrypted denotes if the volume is encrypted.
Encrypted bool `json:"encrypted"`
// ReplicationStatus is the status of replication.
ReplicationStatus string `json:"replication_status"`
// ConsistencyGroupID is the consistency group ID.
ConsistencyGroupID string `json:"consistencygroup_id"`
// Multiattach denotes if the volume is multi-attach capable.
Multiattach bool `json:"multiattach"`
// Image metadata entries, only included for volumes that were created from an image, or from a snapshot of a volume originally created from an image.
VolumeImageMetadata map[string]string `json:"volume_image_metadata"`
}
// UnmarshalJSON another unmarshalling function
func (r *Volume) UnmarshalJSON(b []byte) error {
type tmp Volume
var s struct {
tmp
CreatedAt gophercloud.JSONRFC3339MilliNoZ `json:"created_at"`
UpdatedAt gophercloud.JSONRFC3339MilliNoZ `json:"updated_at"`
}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*r = Volume(s.tmp)
r.CreatedAt = time.Time(s.CreatedAt)
r.UpdatedAt = time.Time(s.UpdatedAt)
return err
}
// VolumePage is a pagination.pager that is returned from a call to the List function.
type VolumePage struct {
pagination.LinkedPageBase
}
// IsEmpty returns true if a ListResult contains no Volumes.
func (r VolumePage) IsEmpty() (bool, error) {
if r.StatusCode == 204 {
return true, nil
}
volumes, err := ExtractVolumes(r)
return len(volumes) == 0, err
}
func (page VolumePage) NextPageURL() (string, error) {
var s struct {
Links []gophercloud.Link `json:"volumes_links"`
}
err := page.ExtractInto(&s)
if err != nil {
return "", err
}
return gophercloud.ExtractNextURL(s.Links)
}
// ExtractVolumes extracts and returns Volumes. It is used while iterating over a volumes.List call.
func ExtractVolumes(r pagination.Page) ([]Volume, error) {
var s []Volume
err := ExtractVolumesInto(r, &s)
return s, err
}
type commonResult struct {
gophercloud.Result
}
// Extract will get the Volume object out of the commonResult object.
func (r commonResult) Extract() (*Volume, error) {
var s Volume
err := r.ExtractInto(&s)
return &s, err
}
// ExtractInto converts our response data into a volume struct
func (r commonResult) ExtractInto(v interface{}) error {
return r.Result.ExtractIntoStructPtr(v, "volume")
}
// ExtractVolumesInto similar to ExtractInto but operates on a `list` of volumes
func ExtractVolumesInto(r pagination.Page, v interface{}) error {
return r.(VolumePage).Result.ExtractIntoSlicePtr(v, "volumes")
}
// CreateResult contains the response body and error from a Create request.
type CreateResult struct {
commonResult
}
// GetResult contains the response body and error from a Get request.
type GetResult struct {
commonResult
}
// UpdateResult contains the response body and error from an Update request.
type UpdateResult struct {
commonResult
}
// DeleteResult contains the response body and error from a Delete request.
type DeleteResult struct {
gophercloud.ErrResult
}

View File

@ -1,22 +0,0 @@
package volumes
import (
"github.com/gophercloud/gophercloud"
)
// WaitForStatus will continually poll the resource, checking for a particular
// status. It will do this for the amount of seconds defined.
func WaitForStatus(c *gophercloud.ServiceClient, id, status string, secs int) error {
return gophercloud.WaitFor(secs, func() (bool, error) {
current, err := Get(c, id).Extract()
if err != nil {
return false, err
}
if current.Status == status {
return true, nil
}
return false, nil
})
}

View File

@ -1,152 +0,0 @@
/*
Package bootfromvolume extends a server create request with the ability to
specify block device options. This can be used to boot a server from a block
storage volume as well as specify multiple ephemeral disks upon creation.
It is recommended to refer to the Block Device Mapping documentation to see
all possible ways to configure a server's block devices at creation time:
https://docs.openstack.org/nova/latest/user/block-device-mapping.html
Note that this package implements `block_device_mapping_v2`.
# Example of Creating a Server From an Image
This example will boot a server from an image and use a standard ephemeral
disk as the server's root disk. This is virtually no different than creating
a server without using block device mappings.
blockDevices := []bootfromvolume.BlockDevice{
bootfromvolume.BlockDevice{
BootIndex: 0,
DeleteOnTermination: true,
DestinationType: bootfromvolume.DestinationLocal,
SourceType: bootfromvolume.SourceImage,
UUID: "image-uuid",
},
}
serverCreateOpts := servers.CreateOpts{
Name: "server_name",
FlavorRef: "flavor-uuid",
ImageRef: "image-uuid",
}
createOpts := bootfromvolume.CreateOptsExt{
CreateOptsBuilder: serverCreateOpts,
BlockDevice: blockDevices,
}
server, err := bootfromvolume.Create(client, createOpts).Extract()
if err != nil {
panic(err)
}
# Example of Creating a Server From a New Volume
This example will create a block storage volume based on the given Image. The
server will use this volume as its root disk.
blockDevices := []bootfromvolume.BlockDevice{
bootfromvolume.BlockDevice{
DeleteOnTermination: true,
DestinationType: bootfromvolume.DestinationVolume,
SourceType: bootfromvolume.SourceImage,
UUID: "image-uuid",
VolumeSize: 2,
},
}
serverCreateOpts := servers.CreateOpts{
Name: "server_name",
FlavorRef: "flavor-uuid",
}
createOpts := bootfromvolume.CreateOptsExt{
CreateOptsBuilder: serverCreateOpts,
BlockDevice: blockDevices,
}
server, err := bootfromvolume.Create(client, createOpts).Extract()
if err != nil {
panic(err)
}
# Example of Creating a Server From an Existing Volume
This example will create a server with an existing volume as its root disk.
blockDevices := []bootfromvolume.BlockDevice{
bootfromvolume.BlockDevice{
DeleteOnTermination: true,
DestinationType: bootfromvolume.DestinationVolume,
SourceType: bootfromvolume.SourceVolume,
UUID: "volume-uuid",
},
}
serverCreateOpts := servers.CreateOpts{
Name: "server_name",
FlavorRef: "flavor-uuid",
}
createOpts := bootfromvolume.CreateOptsExt{
CreateOptsBuilder: serverCreateOpts,
BlockDevice: blockDevices,
}
server, err := bootfromvolume.Create(client, createOpts).Extract()
if err != nil {
panic(err)
}
# Example of Creating a Server with Multiple Ephemeral Disks
This example will create a server with multiple ephemeral disks. The first
block device will be based off of an existing Image. Each additional
ephemeral disks must have an index of -1.
blockDevices := []bootfromvolume.BlockDevice{
bootfromvolume.BlockDevice{
BootIndex: 0,
DestinationType: bootfromvolume.DestinationLocal,
DeleteOnTermination: true,
SourceType: bootfromvolume.SourceImage,
UUID: "image-uuid",
VolumeSize: 5,
},
bootfromvolume.BlockDevice{
BootIndex: -1,
DestinationType: bootfromvolume.DestinationLocal,
DeleteOnTermination: true,
GuestFormat: "ext4",
SourceType: bootfromvolume.SourceBlank,
VolumeSize: 1,
},
bootfromvolume.BlockDevice{
BootIndex: -1,
DestinationType: bootfromvolume.DestinationLocal,
DeleteOnTermination: true,
GuestFormat: "ext4",
SourceType: bootfromvolume.SourceBlank,
VolumeSize: 1,
},
}
serverCreateOpts := servers.CreateOpts{
Name: "server_name",
FlavorRef: "flavor-uuid",
ImageRef: "image-uuid",
}
createOpts := bootfromvolume.CreateOptsExt{
CreateOptsBuilder: serverCreateOpts,
BlockDevice: blockDevices,
}
server, err := bootfromvolume.Create(client, createOpts).Extract()
if err != nil {
panic(err)
}
*/
package bootfromvolume

View File

@ -1,142 +0,0 @@
package bootfromvolume
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
)
type (
// DestinationType represents the type of medium being used as the
// destination of the bootable device.
DestinationType string
// SourceType represents the type of medium being used as the source of the
// bootable device.
SourceType string
)
const (
// DestinationLocal DestinationType is for using an ephemeral disk as the
// destination.
DestinationLocal DestinationType = "local"
// DestinationVolume DestinationType is for using a volume as the destination.
DestinationVolume DestinationType = "volume"
// SourceBlank SourceType is for a "blank" or empty source.
SourceBlank SourceType = "blank"
// SourceImage SourceType is for using images as the source of a block device.
SourceImage SourceType = "image"
// SourceSnapshot SourceType is for using a volume snapshot as the source of
// a block device.
SourceSnapshot SourceType = "snapshot"
// SourceVolume SourceType is for using a volume as the source of block
// device.
SourceVolume SourceType = "volume"
)
// BlockDevice is a structure with options for creating block devices in a
// server. The block device may be created from an image, snapshot, new volume,
// or existing volume. The destination may be a new volume, existing volume
// which will be attached to the instance, ephemeral disk, or boot device.
type BlockDevice struct {
// SourceType must be one of: "volume", "snapshot", "image", or "blank".
SourceType SourceType `json:"source_type" required:"true"`
// UUID is the unique identifier for the existing volume, snapshot, or
// image (see above).
UUID string `json:"uuid,omitempty"`
// BootIndex is the boot index. It defaults to 0.
BootIndex int `json:"boot_index"`
// DeleteOnTermination specifies whether or not to delete the attached volume
// when the server is deleted. Defaults to `false`.
DeleteOnTermination bool `json:"delete_on_termination"`
// DestinationType is the type that gets created. Possible values are "volume"
// and "local".
DestinationType DestinationType `json:"destination_type,omitempty"`
// GuestFormat specifies the format of the block device.
// Not specifying this will cause the device to be formatted to the default in Nova
// which is currently vfat.
// https://opendev.org/openstack/nova/src/commit/d0b459423dd81644e8d9382b6c87fabaa4f03ad4/nova/privsep/fs.py#L257
GuestFormat string `json:"guest_format,omitempty"`
// VolumeSize is the size of the volume to create (in gigabytes). This can be
// omitted for existing volumes.
VolumeSize int `json:"volume_size,omitempty"`
// DeviceType specifies the device type of the block devices.
// Examples of this are disk, cdrom, floppy, lun, etc.
DeviceType string `json:"device_type,omitempty"`
// DiskBus is the bus type of the block devices.
// Examples of this are ide, usb, virtio, scsi, etc.
DiskBus string `json:"disk_bus,omitempty"`
// VolumeType is the volume type of the block device.
// This requires Compute API microversion 2.67 or later.
VolumeType string `json:"volume_type,omitempty"`
// Tag is an arbitrary string that can be applied to a block device.
// Information about the device tags can be obtained from the metadata API
// and the config drive, allowing devices to be easily identified.
// This requires Compute API microversion 2.42 or later.
Tag string `json:"tag,omitempty"`
}
// CreateOptsExt is a structure that extends the server `CreateOpts` structure
// by allowing for a block device mapping.
type CreateOptsExt struct {
servers.CreateOptsBuilder
BlockDevice []BlockDevice `json:"block_device_mapping_v2,omitempty"`
}
// ToServerCreateMap adds the block device mapping option to the base server
// creation options.
func (opts CreateOptsExt) ToServerCreateMap() (map[string]interface{}, error) {
base, err := opts.CreateOptsBuilder.ToServerCreateMap()
if err != nil {
return nil, err
}
if len(opts.BlockDevice) == 0 {
err := gophercloud.ErrMissingInput{}
err.Argument = "bootfromvolume.CreateOptsExt.BlockDevice"
return nil, err
}
serverMap := base["server"].(map[string]interface{})
blockDevice := make([]map[string]interface{}, len(opts.BlockDevice))
for i, bd := range opts.BlockDevice {
b, err := gophercloud.BuildRequestBody(bd, "")
if err != nil {
return nil, err
}
blockDevice[i] = b
}
serverMap["block_device_mapping_v2"] = blockDevice
return base, nil
}
// Create requests the creation of a server from the given block device mapping.
func Create(client *gophercloud.ServiceClient, opts servers.CreateOptsBuilder) (r servers.CreateResult) {
b, err := opts.ToServerCreateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200, 202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

Some files were not shown because too many files have changed in this diff Show More