Files
teleport/lib/cloud/azure/vm_test.go
T

188 lines
5.2 KiB
Go

// Copyright 2022 Gravitational, Inc
//
// 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 azure
import (
"context"
"fmt"
"testing"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3"
"github.com/stretchr/testify/require"
)
func TestGetVirtualMachine(t *testing.T) {
ctx := context.Background()
validResourceID := "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm"
for _, tc := range []struct {
desc string
resourceID string
client *ARMComputeMock
assertError require.ErrorAssertionFunc
assertVM require.ValueAssertionFunc
}{
{
desc: "vm with valid user identities",
resourceID: validResourceID,
client: &ARMComputeMock{
GetResult: armcompute.VirtualMachine{
ID: to.Ptr(validResourceID),
Name: to.Ptr("name"),
Identity: &armcompute.VirtualMachineIdentity{
PrincipalID: to.Ptr("system assigned"),
Type: to.Ptr(armcompute.ResourceIdentityTypeSystemAssigned),
UserAssignedIdentities: map[string]*armcompute.UserAssignedIdentitiesValue{
"identity1": {},
"identity2": {},
},
},
},
},
assertError: require.NoError,
assertVM: func(t require.TestingT, val interface{}, _ ...interface{}) {
require.NotNil(t, val)
vm, ok := val.(*VirtualMachine)
require.Truef(t, ok, "expected *VirtualMachine, got %T", val)
require.Equal(t, vm.ID, validResourceID)
require.Equal(t, vm.Name, "name")
require.ElementsMatch(t, []Identity{
{ResourceID: "system assigned"},
{ResourceID: "identity1"},
{ResourceID: "identity2"},
}, vm.Identities)
},
},
{
desc: "vm without identity",
resourceID: validResourceID,
client: &ARMComputeMock{
GetResult: armcompute.VirtualMachine{
ID: to.Ptr(validResourceID),
Name: to.Ptr("name"),
},
},
assertError: require.NoError,
assertVM: func(t require.TestingT, val interface{}, _ ...interface{}) {
require.NotNil(t, val)
vm, ok := val.(*VirtualMachine)
require.Truef(t, ok, "expected *VirtualMachine, got %T", val)
require.Equal(t, vm.ID, validResourceID)
require.Equal(t, vm.Name, "name")
require.Empty(t, vm.Identities)
},
},
{
desc: "vm with only user managed identities",
resourceID: validResourceID,
client: &ARMComputeMock{
GetResult: armcompute.VirtualMachine{
ID: to.Ptr(validResourceID),
Name: to.Ptr("name"),
Identity: &armcompute.VirtualMachineIdentity{
UserAssignedIdentities: map[string]*armcompute.UserAssignedIdentitiesValue{
"identity1": {},
"identity2": {},
},
},
},
},
assertError: require.NoError,
assertVM: func(t require.TestingT, val interface{}, _ ...interface{}) {
require.NotNil(t, val)
vm, ok := val.(*VirtualMachine)
require.Truef(t, ok, "expected *VirtualMachine, got %T", val)
require.Equal(t, vm.ID, validResourceID)
require.Equal(t, vm.Name, "name")
require.ElementsMatch(t, []Identity{
{ResourceID: "identity1"},
{ResourceID: "identity2"},
}, vm.Identities)
},
},
{
desc: "invalid resource ID",
resourceID: "random-id",
client: &ARMComputeMock{},
assertError: require.Error,
assertVM: require.Nil,
},
{
desc: "client error",
resourceID: validResourceID,
client: &ARMComputeMock{
GetErr: fmt.Errorf("client error"),
},
assertError: require.Error,
assertVM: require.Nil,
},
} {
t.Run(tc.desc, func(t *testing.T) {
vmClient := NewVirtualMachinesClientByAPI(tc.client)
vm, err := vmClient.Get(ctx, tc.resourceID)
tc.assertError(t, err)
tc.assertVM(t, vm)
})
}
}
func TestListVirtualMachines(t *testing.T) {
t.Parallel()
mockAPI := &ARMComputeMock{
VirtualMachines: map[string][]*armcompute.VirtualMachine{
"rg1": {
{ID: to.Ptr("vm1")},
{ID: to.Ptr("vm2")},
},
"rg2": {
{ID: to.Ptr("vm3")},
{ID: to.Ptr("vm4")},
},
},
}
tests := []struct {
name string
resourceGroup string
wantIDs []string
}{
{
name: "existing resource group",
resourceGroup: "rg1",
wantIDs: []string{"vm1", "vm2"},
},
{
name: "nonexistant resource group",
resourceGroup: "rgfake",
wantIDs: []string{},
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
client := NewVirtualMachinesClientByAPI(mockAPI)
vms, err := client.ListVirtualMachines(context.Background(), tc.resourceGroup)
require.NoError(t, err)
var vmIDs []string
for _, vm := range vms {
vmIDs = append(vmIDs, *vm.ID)
}
require.ElementsMatch(t, tc.wantIDs, vmIDs)
})
}
}