github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 }