Skip to content

Commit f6afbfe

Browse files
authored
Merge pull request #256 from atlassian/validate-cloud-provider-id
Validate cloud provider id and return error
2 parents 0464971 + fb7f5f3 commit f6afbfe

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

pkg/cloudprovider/aws/aws.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package aws
22

33
import (
4-
"errors"
54
"fmt"
65
"strings"
76
"time"
@@ -13,6 +12,7 @@ import (
1312
"github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface"
1413
"github.com/aws/aws-sdk-go/service/ec2"
1514
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
15+
"github.com/pkg/errors"
1616
log "github.com/sirupsen/logrus"
1717
v1 "k8s.io/api/core/v1"
1818
)
@@ -40,8 +40,15 @@ func instanceToProviderID(instance *autoscaling.Instance) string {
4040
return fmt.Sprintf("aws:///%s/%s", *instance.AvailabilityZone, *instance.InstanceId)
4141
}
4242

43-
func providerIDToInstanceID(providerID string) string {
44-
return strings.Split(providerID, "/")[4]
43+
func providerIDToInstanceID(providerID string) (string, error) {
44+
if providerID == "" {
45+
return "", fmt.Errorf("empty providerID, it may be set later by cloud controller")
46+
}
47+
parts := strings.Split(providerID, "/")
48+
if len(parts) < 5 {
49+
return "", fmt.Errorf("malformed providerID %s: expected at least 4 slashes", providerID)
50+
}
51+
return parts[4], nil
4552
}
4653

4754
// CloudProvider providers an aws cloud provider implementation
@@ -136,8 +143,10 @@ type Instance struct {
136143
func (c *CloudProvider) GetInstance(node *v1.Node) (cloudprovider.Instance, error) {
137144
var instance *Instance
138145

139-
id := providerIDToInstanceID(node.Spec.ProviderID)
140-
146+
id, err := providerIDToInstanceID(node.Spec.ProviderID)
147+
if err != nil {
148+
return instance, errors.Wrap(err, "failed to get instance ID from provider ID")
149+
}
141150
input := &ec2.DescribeInstancesInput{
142151
InstanceIds: []*string{&id},
143152
}

pkg/cloudprovider/aws/aws_test.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,21 @@ func TestInstanceToProviderId(t *testing.T) {
7070
}
7171

7272
func TestProviderIdToInstanceId(t *testing.T) {
73-
assert.Equal(t, "abc123", providerIDToInstanceID("aws:///us-east-1b/abc123"))
73+
id, err := providerIDToInstanceID("aws:///us-east-1b/abc123")
74+
assert.Nil(t, err)
75+
assert.Equal(t, "abc123", id)
76+
}
77+
78+
func TestProviderIdToInstanceIdEmpty(t *testing.T) {
79+
_, err := providerIDToInstanceID("")
80+
assert.NotNil(t, err)
81+
assert.Contains(t, err.Error(), "empty providerID, it may be set later by cloud controller")
82+
}
83+
84+
func TestProviderIdToInstanceIdMalformed(t *testing.T) {
85+
_, err := providerIDToInstanceID("fake://provider/id")
86+
assert.NotNil(t, err)
87+
assert.Contains(t, err.Error(), "malformed providerID fake://provider/id: expected at least 4 slashes")
7488
}
7589

7690
func newMockCloudProvider(nodeGroups []string, service *test.MockAutoscalingService, ec2Service *test.MockEc2Service) (*CloudProvider, error) {
@@ -195,10 +209,9 @@ func TestCreateTemplateOverrides_NoASG(t *testing.T) {
195209
)
196210
mockNodeGroup.provider = awsCloudProvider
197211

198-
_, error := createTemplateOverrides(mockNodeGroup)
212+
_, err := createTemplateOverrides(mockNodeGroup)
199213
errorMessage := "failed to get an ASG from DescribeAutoscalingGroups response"
200-
e := errors.New(errorMessage)
201-
assert.Equalf(t, e, error, "Expected error with message '%v'", errorMessage)
214+
assert.EqualError(t, err, errorMessage)
202215
}
203216

204217
func TestCreateTemplateOverrides_NoSubnetIDs(t *testing.T) {
@@ -219,10 +232,9 @@ func TestCreateTemplateOverrides_NoSubnetIDs(t *testing.T) {
219232
)
220233
mockNodeGroup.provider = awsCloudProvider
221234

222-
_, error := createTemplateOverrides(mockNodeGroup)
235+
_, err := createTemplateOverrides(mockNodeGroup)
223236
errorMessage := "failed to get any subnetIDs from DescribeAutoscalingGroups response"
224-
e := errors.New(errorMessage)
225-
assert.Equalf(t, e, error, "Expected error with message '%v'", errorMessage)
237+
assert.EqualError(t, err, errorMessage)
226238
}
227239

228240
func TestCreateTemplateOverrides_Success(t *testing.T) {

pkg/cloudprovider/aws/cloud_provider_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,3 +308,15 @@ func TestCloudProvider_GetInstance(t *testing.T) {
308308
})
309309
}
310310
}
311+
312+
func TestCloudProvider_GetInstance_No_Provider_ID(t *testing.T) {
313+
nodeGroups := []string{"1"}
314+
node := &v1.Node{
315+
Spec: v1.NodeSpec{},
316+
}
317+
ec2Service := &test.MockEc2Service{}
318+
awsCloudProvider, err := newMockCloudProvider(nodeGroups, nil, ec2Service)
319+
assert.Nil(t, err)
320+
_, err = awsCloudProvider.GetInstance(node)
321+
assert.NotNil(t, err)
322+
}

0 commit comments

Comments
 (0)