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 }