mirror of https://github.com/kubernetes/kops.git
Upgrade to Gophercloud v2
Essentially: * Add a context argument to Gophercloud functions * Refactor scheduler hints for server creation
This commit is contained in:
parent
f3cb5adcdc
commit
1005dda58e
|
|
@ -21,7 +21,7 @@ import (
|
|||
"net/http"
|
||||
"net/http/httptest"
|
||||
|
||||
"github.com/gophercloud/gophercloud"
|
||||
"github.com/gophercloud/gophercloud/v2"
|
||||
)
|
||||
|
||||
type MockOpenstackServer struct {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
|
|
|||
|
|
@ -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
2
go.mod
|
|
@ -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
8
go.sum
|
|
@ -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=
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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=
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,172 +0,0 @@
|
|||
# Gophercloud: an OpenStack SDK for Go
|
||||
[](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).
|
||||
|
|
@ -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
|
||||
23
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go
generated
vendored
23
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go
generated
vendored
|
|
@ -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
|
||||
208
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go
generated
vendored
208
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go
generated
vendored
|
|
@ -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
|
||||
}
|
||||
179
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go
generated
vendored
179
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go
generated
vendored
|
|
@ -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
|
||||
}
|
||||
22
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go
generated
vendored
22
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go
generated
vendored
|
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
Loading…
Reference in New Issue