14
15
"github.com/Azure/go-autorest/autorest/to"
15
16
"github.com/juju/errors"
16
17
"github.com/juju/schema"
17
"github.com/juju/utils"
18
18
"gopkg.in/juju/names.v2"
20
"github.com/juju/juju/environs"
21
20
"github.com/juju/juju/instance"
21
"github.com/juju/juju/provider/azure/internal/armtemplates"
22
22
internalazurestorage "github.com/juju/juju/provider/azure/internal/azurestorage"
23
23
"github.com/juju/juju/storage"
582
582
// virtualMachines returns a mapping of instance IDs to VirtualMachines and
583
583
// errors, for each of the specified instance IDs.
584
584
func (v *azureVolumeSource) virtualMachines(instanceIds []instance.Id) (map[instance.Id]*maybeVirtualMachine, error) {
585
// Fetch all instances at once. Failure to find an instance should
586
// not cause the entire method to fail.
585
vmsClient := compute.VirtualMachinesClient{v.env.compute}
586
var result compute.VirtualMachineListResult
587
if err := v.env.callAPI(func() (autorest.Response, error) {
589
result, err = vmsClient.List(v.env.resourceGroup)
590
return result.Response, err
592
return nil, errors.Annotate(err, "listing virtual machines")
595
all := make(map[instance.Id]*compute.VirtualMachine)
596
if result.Value != nil {
597
for _, vm := range *result.Value {
599
all[instance.Id(to.String(vm.Name))] = &vmCopy
587
602
results := make(map[instance.Id]*maybeVirtualMachine)
588
instances, err := v.env.instances(
591
false, /* don't refresh addresses */
594
case nil, environs.ErrPartialInstances:
595
for i, inst := range instances {
596
vm := &maybeVirtualMachine{}
598
vm.vm = &inst.(*azureInstance).VirtualMachine
600
vm.err = errors.NotFoundf("instance %v", instanceIds[i])
602
results[instanceIds[i]] = vm
604
case environs.ErrNoInstances:
605
for _, instanceId := range instanceIds {
606
results[instanceId] = &maybeVirtualMachine{
607
err: errors.NotFoundf("instance %v", instanceId),
611
return nil, errors.Annotate(err, "getting instances")
603
for _, id := range instanceIds {
604
result := &maybeVirtualMachine{vm: all[id]}
605
if result.vm == nil {
606
result.err = errors.NotFoundf("instance %v", id)
613
610
return results, nil
751
749
listKeysResult, err = client.ListKeys(resourceGroup, accountName)
752
750
return listKeysResult.Response, err
752
if listKeysResult.Response.Response != nil && listKeysResult.StatusCode == http.StatusNotFound {
753
return nil, errors.NewNotFound(err, "storage account keys not found")
754
755
return nil, errors.Annotate(err, "listing storage account keys")
756
757
if listKeysResult.Keys == nil {
778
779
return fullKey, nil
781
// RandomStorageAccountName returns a random storage account name.
782
func RandomStorageAccountName() string {
783
const maxStorageAccountNameLen = 24
784
validRunes := append(utils.LowerAlpha, utils.Digits...)
785
return utils.RandomString(maxStorageAccountNameLen, validRunes)
782
// storageAccountTemplateResource returns a template resource definition
783
// for creating a storage account.
784
func storageAccountTemplateResource(
786
envTags map[string]string,
787
accountName, accountType string,
788
) armtemplates.Resource {
789
return armtemplates.Resource{
790
APIVersion: armstorage.APIVersion,
791
Type: "Microsoft.Storage/storageAccounts",
795
StorageSku: &armstorage.Sku{
796
Name: armstorage.SkuName(accountType),