github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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.v5/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.Warningf("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  
    34  func getUniterStateFile(dataDir string, tag names.UnitTag) string {
    35  	paths := NewPaths(dataDir, tag)
    36  	return paths.State.OperationsFile
    37  }
    38  
    39  func performUpgrade(opsFile string, state *operation.State) error {
    40  	statefile := operation.NewStateFile(opsFile)
    41  	if state.Kind == operation.Continue && state.Hook != nil && state.Hook.Kind == hooks.Stop {
    42  		state.Stopped = true
    43  		state.Hook = nil
    44  		return statefile.Write(state)
    45  	}
    46  	return nil
    47  }
    48  
    49  func readUnsafe(opsfile string) (*operation.State, error) {
    50  	var st operation.State
    51  	if err := utils.ReadYaml(opsfile, &st); err != nil {
    52  		if os.IsNotExist(err) {
    53  			return nil, operation.ErrNoStateFile
    54  		}
    55  	}
    56  	return &st, nil
    57  }