github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/upgrades/block.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrades 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/api/block" 10 "github.com/juju/juju/environs/config" 11 "github.com/juju/juju/state" 12 ) 13 14 func moveBlocksFromEnvironToState(context Context) error { 15 logger.Infof("recording existing blocks") 16 st := context.State() 17 if st == nil { 18 logger.Debugf("no state connection, no block recording required") 19 // We're running on a different node than the state server. 20 return nil 21 } 22 blocks, err := getCurrentBlocks(st) 23 24 if err != nil { 25 return errors.Trace(err) 26 } 27 err = upgradeBlocks(context, blocks) 28 if err != nil { 29 return errors.Trace(err) 30 } 31 err = removeBlockEnvVar(st) 32 if err != nil { 33 return errors.Trace(err) 34 } 35 return nil 36 } 37 38 func upgradeBlocks(context Context, blocks []string) error { 39 if len(blocks) == 0 { 40 // no existing blocks = nothing to do here :) 41 return nil 42 } 43 blockClient := block.NewClient(context.APIState()) 44 for _, one := range blocks { 45 err := blockClient.SwitchBlockOn(one, "") 46 if err != nil { 47 return errors.Annotatef(err, "switching on %v", one) 48 } 49 } 50 return nil 51 } 52 53 func getCurrentBlocks(st *state.State) ([]string, error) { 54 cfg, err := getEnvironConfig(st) 55 if err != nil { 56 return nil, errors.Trace(err) 57 } 58 return getBlocks(cfg), nil 59 } 60 61 func getEnvironConfig(st *state.State) (*config.Config, error) { 62 envConfig, err := st.EnvironConfig() 63 if err != nil { 64 return nil, errors.Annotatef(err, "reading current config") 65 } 66 return envConfig, nil 67 } 68 69 func getBlocks(cfg *config.Config) []string { 70 var blocks []string 71 addBlock := func(aType string) { 72 blocks = append(blocks, aType) 73 } 74 75 if cfg.PreventAllChanges() { 76 addBlock(state.ChangeBlock.String()) 77 } 78 if cfg.PreventRemoveObject() { 79 addBlock(state.RemoveBlock.String()) 80 } 81 if cfg.PreventDestroyEnvironment() { 82 addBlock(state.DestroyBlock.String()) 83 } 84 return blocks 85 } 86 87 func removeBlockEnvVar(st *state.State) error { 88 removeAttrs := []string{ 89 config.PreventAllChangesKey, 90 config.PreventDestroyEnvironmentKey, 91 config.PreventRemoveObjectKey, 92 } 93 return st.UpdateEnvironConfig(map[string]interface{}{}, removeAttrs, nil) 94 }