github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/gce/upgrades.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/environs"
    10  	"github.com/juju/juju/environs/context"
    11  	"github.com/juju/juju/environs/tags"
    12  	"github.com/juju/juju/provider/gce/google"
    13  )
    14  
    15  // UpgradeOperations is part of the upgrades.OperationSource interface.
    16  func (env *environ) UpgradeOperations(ctx context.ProviderCallContext, args environs.UpgradeOperationsParams) []environs.UpgradeOperation {
    17  	return []environs.UpgradeOperation{{
    18  		providerVersion1,
    19  		[]environs.UpgradeStep{
    20  			diskLabelsUpgradeStep{env, args.ControllerUUID},
    21  		},
    22  	}}
    23  }
    24  
    25  // diskLabelsUpgradeStep sets labels on the environ's disks,
    26  // associating them with the model and controller.
    27  type diskLabelsUpgradeStep struct {
    28  	env            *environ
    29  	controllerUUID string
    30  }
    31  
    32  // Description is part of the environs.UpgradeStep interface.
    33  func (diskLabelsUpgradeStep) Description() string {
    34  	return "Set disk labels"
    35  }
    36  
    37  // Run is part of the environs.UpgradeStep interface.
    38  func (step diskLabelsUpgradeStep) Run(ctx context.ProviderCallContext) error {
    39  	env := step.env
    40  	disks, err := env.gce.Disks()
    41  	if err != nil {
    42  		return google.HandleCredentialError(errors.Trace(err), ctx)
    43  	}
    44  	for _, disk := range disks {
    45  		if !isValidVolume(disk.Name) {
    46  			continue
    47  		}
    48  		if disk.Labels[tags.JujuModel] != "" || disk.Labels[tags.JujuController] != "" {
    49  			continue
    50  		}
    51  		if disk.Description != "" && disk.Description != env.uuid {
    52  			continue
    53  		}
    54  		if disk.Labels == nil {
    55  			disk.Labels = make(map[string]string)
    56  		}
    57  		disk.Labels[tags.JujuModel] = env.uuid
    58  		disk.Labels[tags.JujuController] = step.controllerUUID
    59  		if err := env.gce.SetDiskLabels(disk.Zone, disk.Name, disk.LabelFingerprint, disk.Labels); err != nil {
    60  			return google.HandleCredentialError(errors.Annotatef(err, "cannot set labels on volume %q", disk.Name), ctx)
    61  		}
    62  	}
    63  	return nil
    64  }