pkg/armhelpers/compute.go (68 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package armhelpers
import (
"context"
"strings"
compute "github.com/Azure/azure-sdk-for-go/profile/p20200901/resourcemanager/compute/armcompute"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/pkg/errors"
)
// ListVirtualMachines returns (the first page of) the machines in the specified resource group.
func (az *AzureClient) ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*compute.VirtualMachine, error) {
ctx = policy.WithHTTPHeader(ctx, az.acceptLanguageHeader)
pager := az.virtualMachinesClient.NewListPager(resourceGroup, nil)
list := []*compute.VirtualMachine{}
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
return nil, errors.Wrapf(err, "listing virtual machines for resource group %s", resourceGroup)
}
list = append(list, page.Value...)
}
return list, nil
}
// GetVirtualMachine returns the specified machine in the specified resource group.
func (az *AzureClient) GetVirtualMachine(ctx context.Context, resourceGroup, name string) (compute.VirtualMachine, error) {
ctx = policy.WithHTTPHeader(ctx, az.acceptLanguageHeader)
vm, err := az.virtualMachinesClient.Get(ctx, resourceGroup, name, nil)
if err != nil {
return compute.VirtualMachine{}, errors.Wrapf(err, "getting virtual machine %s/%s", resourceGroup, name)
}
return vm.VirtualMachine, nil
}
// RestartVirtualMachine restarts the specified virtual machine.
func (az *AzureClient) RestartVirtualMachine(ctx context.Context, resourceGroup, name string) error {
ctx = policy.WithHTTPHeader(ctx, az.acceptLanguageHeader)
poller, err := az.virtualMachinesClient.BeginRestart(ctx, resourceGroup, name, nil)
if err != nil {
return errors.Wrapf(err, "restarting virtual machine %s/%s", resourceGroup, name)
}
if _, err = poller.PollUntilDone(ctx, nil); err != nil {
return errors.Wrapf(err, "restarting virtual machine %s/%s", resourceGroup, name)
}
return err
}
// DeleteVirtualMachine handles deletion of a CRP/VMAS VM (aka, not a VMSS VM).
func (az *AzureClient) DeleteVirtualMachine(ctx context.Context, resourceGroup, name string) error {
ctx = policy.WithHTTPHeader(ctx, az.acceptLanguageHeader)
poller, err := az.virtualMachinesClient.BeginDelete(ctx, resourceGroup, name, nil)
if err != nil {
return errors.Wrapf(err, "deleting virtual machine %s/%s", resourceGroup, name)
}
if _, err = poller.PollUntilDone(ctx, nil); err != nil {
return errors.Wrapf(err, "deleting virtual machine %s/%s", resourceGroup, name)
}
return err
}
// GetVirtualMachinePowerState returns the virtual machine's PowerState status code
func (az *AzureClient) GetVirtualMachinePowerState(ctx context.Context, resourceGroup, name string) (string, error) {
ctx = policy.WithHTTPHeader(ctx, az.acceptLanguageHeader)
expandValue := "instanceView"
options := &compute.VirtualMachinesClientGetOptions{
Expand: &expandValue,
}
vm, err := az.virtualMachinesClient.Get(ctx, resourceGroup, name, options)
if err != nil {
return "", errors.Wrapf(err, "fetching virtual machine %s/%s", resourceGroup, name)
}
for _, status := range vm.VirtualMachine.Properties.InstanceView.Statuses {
if strings.HasPrefix(*status.Code, "PowerState") {
return *status.Code, nil
}
}
return "", nil
}