github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/uniter/upgrade123.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter
     5  
     6  import (
     7  	"os"
     8  
     9  	"github.com/juju/names"
    10  	"github.com/juju/utils"
    11  	"gopkg.in/juju/charm.v6-unstable/hooks"
    12  
    13  	"github.com/juju/juju/worker/uniter/operation"
    14  )
    15  
    16  func AddStoppedFieldToUniterState(tag names.UnitTag, dataDir string) error {
    17  	logger.Tracef("entering upgrade step AddStoppedFieldToUniterState")
    18  	defer logger.Tracef("leaving upgrade step AddStoppedFieldToUniterState")
    19  
    20  	opsFile := getUniterStateFile(dataDir, tag)
    21  	state, err := readUnsafe(opsFile)
    22  	switch err {
    23  	case nil:
    24  		return performUpgrade(opsFile, state)
    25  	case operation.ErrNoStateFile:
    26  		logger.Debugf("no uniter state file found for unit %s, skipping uniter upgrade step", tag)
    27  		return nil
    28  	default:
    29  		return err
    30  	}
    31  }
    32  
    33  func getUniterStateFile(dataDir string, tag names.UnitTag) string {
    34  	paths := NewPaths(dataDir, tag)
    35  	return paths.State.OperationsFile
    36  }
    37  
    38  func performUpgrade(opsFile string, state *operation.State) error {
    39  	statefile := operation.NewStateFile(opsFile)
    40  	if state.Kind == operation.Continue && state.Hook != nil && state.Hook.Kind == hooks.Stop {
    41  		state.Stopped = true
    42  		state.Hook = nil
    43  		return statefile.Write(state)
    44  	}
    45  	return nil
    46  }
    47  
    48  func readUnsafe(opsfile string) (*operation.State, error) {
    49  	var st operation.State
    50  	if err := utils.ReadYaml(opsfile, &st); err != nil {
    51  		if os.IsNotExist(err) {
    52  			return nil, operation.ErrNoStateFile
    53  		}
    54  	}
    55  	return &st, nil
    56  }