From 025a255dd8358d915c346eb5f77f3add441af43b Mon Sep 17 00:00:00 2001 From: "Derek Lemon -T (delemon - AEROTEK INC at Cisco)" Date: Fri, 18 Jan 2019 13:42:21 -0700 Subject: [PATCH] Adding ability to retrieve openstack server by ID --- protokube/pkg/protokube/openstack_volume.go | 22 ++------------------- upup/pkg/fi/cloudup/openstack/cloud.go | 5 +++++ upup/pkg/fi/cloudup/openstack/instance.go | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/protokube/pkg/protokube/openstack_volume.go b/protokube/pkg/protokube/openstack_volume.go index 409408beb6..c0d1198c5f 100644 --- a/protokube/pkg/protokube/openstack_volume.go +++ b/protokube/pkg/protokube/openstack_volume.go @@ -17,7 +17,6 @@ limitations under the License. package protokube import ( - "bytes" "encoding/json" "fmt" "io/ioutil" @@ -29,7 +28,6 @@ import ( "github.com/golang/glog" cinderv2 "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach" - "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "k8s.io/kops/protokube/pkg/etcd" "k8s.io/kops/protokube/pkg/gossip" gossipos "k8s.io/kops/protokube/pkg/gossip/openstack" @@ -174,24 +172,8 @@ func (a *OpenstackVolumes) discoverTags() error { // Internal IP { - servers, err := a.cloud.ListInstances(servers.ListOpts{ - Host: a.instanceName, - TenantID: a.project, - }) - if err != nil || len(servers) < 1 { - return fmt.Errorf("error listing servers for name %s: %v", a.instanceName, err) - } - if len(servers) > 1 { - var buf bytes.Buffer - for i, server := range servers { - if i != 0 { - buf.WriteString(",") - } - buf.WriteString(server.ID) - } - return fmt.Errorf("recieved more than one server for name %s: %s", a.instanceName, buf.String()) - } - ip, err := openstack.GetServerFixedIP(&servers[0], a.clusterName) + server, err := a.cloud.GetInstance(strings.TrimSpace(a.meta.ServerID)) + ip, err := openstack.GetServerFixedIP(server, a.clusterName) if err != nil { return fmt.Errorf("error querying InternalIP from name: %v", err) } diff --git a/upup/pkg/fi/cloudup/openstack/cloud.go b/upup/pkg/fi/cloudup/openstack/cloud.go index 067a6b1089..1856357424 100644 --- a/upup/pkg/fi/cloudup/openstack/cloud.go +++ b/upup/pkg/fi/cloudup/openstack/cloud.go @@ -91,8 +91,13 @@ type OpenstackCloud interface { // Region returns the region which cloud will run on Region() string + // GetInstance will return a openstack server provided its ID + GetInstance(id string) (*servers.Server, error) + + // ListInstances will return a slice of openstack servers provided list opts ListInstances(servers.ListOptsBuilder) ([]servers.Server, error) + // CreateInstance will create an openstack server provided create opts CreateInstance(servers.CreateOptsBuilder) (*servers.Server, error) // SetVolumeTags will set the tags for the Cinder volume diff --git a/upup/pkg/fi/cloudup/openstack/instance.go b/upup/pkg/fi/cloudup/openstack/instance.go index 2f5c8dac47..c939e70d8f 100644 --- a/upup/pkg/fi/cloudup/openstack/instance.go +++ b/upup/pkg/fi/cloudup/openstack/instance.go @@ -49,6 +49,26 @@ func (c *openstackCloud) DeleteInstance(i *cloudinstances.CloudInstanceGroupMemb return fmt.Errorf("openstackCloud::DeleteInstance not implemented") } +func (c *openstackCloud) GetInstance(id string) (*servers.Server, error) { + var server *servers.Server + + done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) { + instance, err := servers.Get(c.novaClient, id).Extract() + if err != nil { + return false, err + } + server = instance + return true, nil + }) + if err != nil { + return server, err + } else if done { + return server, nil + } else { + return server, wait.ErrWaitTimeout + } +} + func (c *openstackCloud) ListInstances(opt servers.ListOptsBuilder) ([]servers.Server, error) { var instances []servers.Server