Skip to content
This repository was archived by the owner on Mar 22, 2018. It is now read-only.

Commit b9a5444

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request #47593 from fgimenez/cloudprovider-openstack-byid
Automatic merge from submit-queue (batch tested with PRs 47948, 48631, 48693, 48549, 47593) OpenStack for cloud-controller-manager **What this PR does / why we need it**: This implements the `NodeAddressesByProviderID` and `InstanceTypeByProviderID` methods used by the cloud-controller-manager to the OpenStack provider. The instance type returned is the flavor name, for consistency `InstanceType` has been implemented too returning the same value. ```release-note NONE ``` This is part of #47257 cc @wlan0
2 parents f7d8b97 + f60052c commit b9a5444

2 files changed

Lines changed: 111 additions & 6 deletions

File tree

pkg/cloudprovider/providers/openstack/openstack_instances.go

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package openstack
1818

1919
import (
2020
"errors"
21+
"fmt"
22+
"net/url"
2123

2224
"github.com/golang/glog"
2325
"github.com/gophercloud/gophercloud"
@@ -107,7 +109,24 @@ func (i *Instances) NodeAddresses(name types.NodeName) ([]v1.NodeAddress, error)
107109
// This method will not be called from the node that is requesting this ID. i.e. metadata service
108110
// and other local methods cannot be used here
109111
func (i *Instances) NodeAddressesByProviderID(providerID string) ([]v1.NodeAddress, error) {
110-
return []v1.NodeAddress{}, errors.New("unimplemented")
112+
instanceID, err := instanceIDFromProviderID(providerID)
113+
114+
if err != nil {
115+
return []v1.NodeAddress{}, err
116+
}
117+
118+
server, err := servers.Get(i.compute, instanceID).Extract()
119+
120+
if err != nil {
121+
return []v1.NodeAddress{}, err
122+
}
123+
124+
addresses, err := nodeAddresses(server)
125+
if err != nil {
126+
return []v1.NodeAddress{}, err
127+
}
128+
129+
return addresses, nil
111130
}
112131

113132
// ExternalID returns the cloud provider ID of the specified instance (deprecated).
@@ -142,10 +161,56 @@ func (i *Instances) InstanceID(name types.NodeName) (string, error) {
142161
// This method will not be called from the node that is requesting this ID. i.e. metadata service
143162
// and other local methods cannot be used here
144163
func (i *Instances) InstanceTypeByProviderID(providerID string) (string, error) {
145-
return "", errors.New("unimplemented")
164+
instanceID, err := instanceIDFromProviderID(providerID)
165+
166+
if err != nil {
167+
return "", err
168+
}
169+
170+
server, err := servers.Get(i.compute, instanceID).Extract()
171+
172+
if err != nil {
173+
return "", err
174+
}
175+
176+
return srvInstanceType(server)
146177
}
147178

148179
// InstanceType returns the type of the specified instance.
149180
func (i *Instances) InstanceType(name types.NodeName) (string, error) {
150-
return "", nil
181+
srv, err := getServerByName(i.compute, name)
182+
183+
if err != nil {
184+
return "", err
185+
}
186+
187+
return srvInstanceType(srv)
188+
}
189+
190+
func srvInstanceType(srv *servers.Server) (string, error) {
191+
val, ok := srv.Flavor["name"]
192+
193+
if !ok {
194+
return "", fmt.Errorf("flavor name not present in server info")
195+
}
196+
197+
flavor, ok := val.(string)
198+
199+
if !ok {
200+
return "", fmt.Errorf("flavor name is not a string")
201+
}
202+
203+
return flavor, nil
204+
}
205+
206+
func instanceIDFromProviderID(providerID string) (instanceID string, err error) {
207+
parsedID, err := url.Parse(providerID)
208+
if err != nil {
209+
return "", err
210+
}
211+
if parsedID.Scheme != ProviderName {
212+
return "", fmt.Errorf("unrecognized provider %q", parsedID.Scheme)
213+
}
214+
215+
return parsedID.Host, nil
151216
}

pkg/cloudprovider/providers/openstack/openstack_test.go

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@ package openstack
1818

1919
import (
2020
"fmt"
21-
"github.com/gophercloud/gophercloud"
22-
"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions"
23-
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
2421
"os"
2522
"reflect"
2623
"sort"
2724
"strings"
2825
"testing"
2926
"time"
3027

28+
"github.com/gophercloud/gophercloud"
29+
"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions"
30+
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
3131
"k8s.io/api/core/v1"
32+
3233
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3334
"k8s.io/apimachinery/pkg/util/rand"
3435
"k8s.io/apimachinery/pkg/util/wait"
@@ -543,3 +544,42 @@ func TestCinderAutoDetectApiVersion(t *testing.T) {
543544
}
544545
}
545546
}
547+
548+
func TestInstanceIDFromProviderID(t *testing.T) {
549+
testCases := []struct {
550+
providerID string
551+
instanceID string
552+
fail bool
553+
}{
554+
{
555+
providerID: "openstack://7b9cf879-7146-417c-abfd-cb4272f0c935",
556+
instanceID: "7b9cf879-7146-417c-abfd-cb4272f0c935",
557+
fail: false,
558+
},
559+
{
560+
providerID: "7b9cf879-7146-417c-abfd-cb4272f0c935",
561+
instanceID: "",
562+
fail: true,
563+
},
564+
{
565+
providerID: "other-provider://7b9cf879-7146-417c-abfd-cb4272f0c935",
566+
instanceID: "",
567+
fail: true,
568+
},
569+
}
570+
571+
for _, test := range testCases {
572+
instanceID, err := instanceIDFromProviderID(test.providerID)
573+
if (err != nil) != test.fail {
574+
t.Errorf("%s yielded `err != nil` as %t. expected %t", test.providerID, (err != nil), test.fail)
575+
}
576+
577+
if test.fail {
578+
continue
579+
}
580+
581+
if instanceID != test.instanceID {
582+
t.Errorf("%s yielded %s. expected %s", test.providerID, instanceID, test.instanceID)
583+
}
584+
}
585+
}

0 commit comments

Comments
 (0)