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  }