blob: 55284ca2152dca4f48682adbb93cfd3e3ee7470a [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package platform
import (
"fmt"
"reflect"
"testing"
)
// Mock responses for Azure Metadata (based on Microsoft API documentation samples)
// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service
const (
MockVersionsTemplate = `{"error": "Bad request. api-version was not specified in the request","newest-versions": ["%s"]}`
MockMetadata = `{"compute": {"location": "centralus", "name": "negasonic", "tags": "Department:IT;Environment:Prod;Role:WorkerRole", ` +
`"vmId": "13f56399-bd52-4150-9748-7190aae1ff21", "zone": "1"}}`
MockMetadataWithValuelessTag = `{"compute": {"location": "centralus", "name": "negasonic", "tags": "Department", ` +
`"vmId": "13f56399-bd52-4150-9748-7190aae1ff21", "zone": "1"}}`
MockMetadataTagsList = `{"compute": {"location": "centralus", "name": "negasonic", ` +
`"tagsList": [{"name": "Department", "value":"IT"}, {"name": "Environment", "value": "Prod"}, {"name": "Role", "value": "WorkerRole; OtherWorker"}], ` +
`"vmId": "13f56399-bd52-4150-9748-7190aae1ff21", "zone": "1"}}`
)
func TestAzureVersionUpdate(t *testing.T) {
oldAzureAPIVersionsFn := azureAPIVersionsFn
defer func() { azureAPIVersionsFn = oldAzureAPIVersionsFn }()
MinDate, MaxDate := "0000-00-00", "9999-12-31"
tests := []struct {
name string
response string
version string
}{
{"ignore empty response", "", AzureDefaultAPIVersion},
{"ignore smaller version", fmt.Sprintf(MockVersionsTemplate, MinDate), AzureDefaultAPIVersion},
{"ignore no version", fmt.Sprintf(MockVersionsTemplate, ""), AzureDefaultAPIVersion},
{"use larger version", fmt.Sprintf(MockVersionsTemplate, MaxDate), MaxDate},
}
for idx, tt := range tests {
t.Run(fmt.Sprintf("[%d] %s", idx, tt.name), func(t *testing.T) {
azureAPIVersionsFn = func() string { return tt.response }
e := &azureEnv{APIVersion: AzureDefaultAPIVersion}
e.updateAPIVersion()
if e.APIVersion != tt.version {
t.Errorf("updateAPIVersion() => '%v'; want '%v'", e.APIVersion, tt.version)
}
})
}
}
func TestAzureMetadata(t *testing.T) {
oldGetAPIVersions, oldGetAzureMetadata := azureAPIVersionsFn, azureMetadataFn
defer func() { azureAPIVersionsFn, azureMetadataFn = oldGetAPIVersions, oldGetAzureMetadata }()
tests := []struct {
name string
response string
metadata map[string]string
}{
{"ignore empty response", "", map[string]string{}},
{
"parse fields", MockMetadata,
map[string]string{
"azure_Department": "IT", "azure_Environment": "Prod", "azure_Role": "WorkerRole",
"azure_name": "negasonic", "azure_location": "centralus", "azure_vmId": "13f56399-bd52-4150-9748-7190aae1ff21",
},
},
{
"handle tags without values", MockMetadataWithValuelessTag,
map[string]string{
"azure_Department": "", "azure_name": "negasonic", "azure_location": "centralus", "azure_vmId": "13f56399-bd52-4150-9748-7190aae1ff21",
},
},
{
"handle tagsList", MockMetadataTagsList,
map[string]string{
"azure_Department": "IT", "azure_Environment": "Prod", "azure_Role": "WorkerRole; OtherWorker",
"azure_name": "negasonic", "azure_location": "centralus", "azure_vmId": "13f56399-bd52-4150-9748-7190aae1ff21",
},
},
}
// Prevent actual requests to metadata server for updating the API version
azureAPIVersionsFn = func() string { return "" }
for idx, tt := range tests {
t.Run(fmt.Sprintf("[%d] %s", idx, tt.name), func(t *testing.T) {
azureMetadataFn = func(string) string { return tt.response }
e := NewAzure()
if metadata := e.Metadata(); !reflect.DeepEqual(metadata, tt.metadata) {
t.Errorf("Metadata() => '%v'; want '%v'", metadata, tt.metadata)
}
})
}
}