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

Commit f60052c

Browse files
author
Federico Gimenez
committed
OpenStack for cloud-controller-manager
1 parent ce61ed1 commit f60052c

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"
@@ -449,3 +450,42 @@ func TestCinderAutoDetectApiVersion(t *testing.T) {
449450
}
450451
}
451452
}
453+
454+
func TestInstanceIDFromProviderID(t *testing.T) {
455+
testCases := []struct {
456+
providerID string
457+
instanceID string
458+
fail bool
459+
}{
460+
{
461+
providerID: "openstack://7b9cf879-7146-417c-abfd-cb4272f0c935",
462+
instanceID: "7b9cf879-7146-417c-abfd-cb4272f0c935",
463+
fail: false,
464+
},
465+
{
466+
providerID: "7b9cf879-7146-417c-abfd-cb4272f0c935",
467+
instanceID: "",
468+
fail: true,
469+
},
470+
{
471+
providerID: "other-provider://7b9cf879-7146-417c-abfd-cb4272f0c935",
472+
instanceID: "",
473+
fail: true,
474+
},
475+
}
476+
477+
for _, test := range testCases {
478+
instanceID, err := instanceIDFromProviderID(test.providerID)
479+
if (err != nil) != test.fail {
480+
t.Errorf("%s yielded `err != nil` as %t. expected %t", test.providerID, (err != nil), test.fail)
481+
}
482+
483+
if test.fail {
484+
continue
485+
}
486+
487+
if instanceID != test.instanceID {
488+
t.Errorf("%s yielded %s. expected %s", test.providerID, instanceID, test.instanceID)
489+
}
490+
}
491+
}

0 commit comments

Comments
 (0)