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 }