Skip to content

Commit c4d0b7f

Browse files
author
t-qini
committed
Enrich the unit tests for azure clients and azure zones.
1 parent 3fdceba commit c4d0b7f

File tree

9 files changed

+721
-11
lines changed

9 files changed

+721
-11
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure_zones_test.go

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@ import (
2424
"net"
2525
"net/http"
2626
"testing"
27+
28+
"k8s.io/apimachinery/pkg/util/sets"
29+
cloudprovider "k8s.io/cloud-provider"
30+
"k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient"
31+
32+
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
33+
"github.com/Azure/go-autorest/autorest/to"
34+
"github.com/golang/mock/gomock"
35+
"github.com/stretchr/testify/assert"
36+
)
37+
38+
const (
39+
testAvailabilitySetNodeProviderID = "azure:///subscriptions/sub/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm-0"
2740
)
2841

2942
func TestIsAvailabilityZone(t *testing.T) {
@@ -91,6 +104,8 @@ func TestGetZone(t *testing.T) {
91104
location string
92105
faultDomain string
93106
expected string
107+
isNilResp bool
108+
expectedErr error
94109
}{
95110
{
96111
name: "GetZone should get real zone if only node's zone is set",
@@ -117,6 +132,19 @@ func TestGetZone(t *testing.T) {
117132
zone: "1",
118133
expected: "eastus-1",
119134
},
135+
{
136+
name: "GetZone should report an error if there is no `Compute` in the response",
137+
isNilResp: true,
138+
expectedErr: fmt.Errorf("failure of getting compute information from instance metadata"),
139+
},
140+
{
141+
name: "GetZone should report an error if the zone is invalid",
142+
zone: "a",
143+
location: "eastus",
144+
faultDomain: "99",
145+
expected: "",
146+
expectedErr: fmt.Errorf("failed to parse zone ID \"a\": strconv.Atoi: parsing \"a\": invalid syntax"),
147+
},
120148
}
121149

122150
for _, test := range testcases {
@@ -125,9 +153,13 @@ func TestGetZone(t *testing.T) {
125153
t.Errorf("Test [%s] unexpected error: %v", test.name, err)
126154
}
127155

156+
respString := fmt.Sprintf(`{"compute":{"zone":"%s", "platformFaultDomain":"%s", "location":"%s"}}`, test.zone, test.faultDomain, test.location)
157+
if test.isNilResp {
158+
respString = "{}"
159+
}
128160
mux := http.NewServeMux()
129161
mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
130-
fmt.Fprint(w, fmt.Sprintf(`{"compute":{"zone":"%s", "platformFaultDomain":"%s", "location":"%s"}}`, test.zone, test.faultDomain, test.location))
162+
fmt.Fprint(w, respString)
131163
}))
132164
go func() {
133165
http.Serve(listener, mux)
@@ -141,13 +173,72 @@ func TestGetZone(t *testing.T) {
141173

142174
zone, err := cloud.GetZone(context.Background())
143175
if err != nil {
144-
t.Errorf("Test [%s] unexpected error: %v", test.name, err)
176+
if test.expectedErr == nil {
177+
t.Errorf("Test [%s] unexpected error: %v", test.name, err)
178+
} else {
179+
assert.Equal(t, test.expectedErr, err)
180+
}
145181
}
146182
if zone.FailureDomain != test.expected {
147183
t.Errorf("Test [%s] unexpected zone: %s, expected %q", test.name, zone.FailureDomain, test.expected)
148184
}
149-
if zone.Region != cloud.Location {
185+
if err == nil && zone.Region != cloud.Location {
150186
t.Errorf("Test [%s] unexpected region: %s, expected: %s", test.name, zone.Region, cloud.Location)
151187
}
152188
}
153189
}
190+
191+
func TestMakeZone(t *testing.T) {
192+
az := &Cloud{}
193+
zone := az.makeZone("EASTUS", 2)
194+
assert.Equal(t, "eastus-2", zone)
195+
}
196+
197+
func TestGetZoneByProviderID(t *testing.T) {
198+
ctrl := gomock.NewController(t)
199+
defer ctrl.Finish()
200+
201+
az := GetTestCloud(ctrl)
202+
203+
zone, err := az.GetZoneByProviderID(context.Background(), "")
204+
assert.Equal(t, errNodeNotInitialized, err)
205+
assert.Equal(t, cloudprovider.Zone{}, zone)
206+
207+
zone, err = az.GetZoneByProviderID(context.Background(), "invalid/id")
208+
assert.NoError(t, err)
209+
assert.Equal(t, cloudprovider.Zone{}, zone)
210+
211+
mockVMClient := az.VirtualMachinesClient.(*mockvmclient.MockInterface)
212+
mockVMClient.EXPECT().Get(gomock.Any(), az.ResourceGroup, "vm-0", gomock.Any()).Return(compute.VirtualMachine{
213+
Zones: &[]string{"1"},
214+
Location: to.StringPtr("eastus"),
215+
}, nil)
216+
zone, err = az.GetZoneByProviderID(context.Background(), testAvailabilitySetNodeProviderID)
217+
assert.NoError(t, err)
218+
assert.Equal(t, cloudprovider.Zone{
219+
FailureDomain: "eastus-1",
220+
Region: "eastus",
221+
}, zone)
222+
}
223+
224+
func TestAvailabilitySetGetZoneByNodeName(t *testing.T) {
225+
az := &Cloud{
226+
unmanagedNodes: sets.String{"vm-0": sets.Empty{}},
227+
nodeInformerSynced: func() bool {
228+
return true
229+
},
230+
}
231+
zone, err := az.GetZoneByNodeName(context.Background(), "vm-0")
232+
assert.NoError(t, err)
233+
assert.Equal(t, cloudprovider.Zone{}, zone)
234+
235+
az = &Cloud{
236+
unmanagedNodes: sets.String{"vm-0": sets.Empty{}},
237+
nodeInformerSynced: func() bool {
238+
return false
239+
},
240+
}
241+
zone, err = az.GetZoneByNodeName(context.Background(), "vm-0")
242+
assert.Equal(t, fmt.Errorf("node informer is not synced when trying to GetUnmanagedNodes"), err)
243+
assert.Equal(t, cloudprovider.Zone{}, zone)
244+
}

staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/azure_armclient.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ func (c *Client) SendAsync(ctx context.Context, request *http.Request) (*azure.F
285285

286286
future, err := azure.NewFutureFromResponse(asyncResponse)
287287
if err != nil {
288-
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "sendAsync.responed", request.URL.String(), err)
288+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "sendAsync.respond", request.URL.String(), err)
289289
return nil, asyncResponse, retry.GetError(asyncResponse, err)
290290
}
291291

@@ -337,7 +337,7 @@ func (c *Client) PutResource(ctx context.Context, resourceID string, parameters
337337
}
338338

339339
// PutResources puts a list of resources from resources map[resourceID]parameters.
340-
// Those resources sync requests are sequential while async requests are concurent. It 's especially
340+
// Those resources sync requests are sequential while async requests are concurrent. It's especially
341341
// useful when the ARM API doesn't support concurrent requests.
342342
func (c *Client) PutResources(ctx context.Context, resources map[string]interface{}) map[string]*PutResourcesResponse {
343343
if len(resources) == 0 {

0 commit comments

Comments
 (0)