github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/common/machine.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/state" 10 "github.com/juju/juju/state/multiwatcher" 11 ) 12 13 // StateJobs translates a slice of multiwatcher jobs to their equivalents in state. 14 func StateJobs(jobs []multiwatcher.MachineJob) ([]state.MachineJob, error) { 15 newJobs := make([]state.MachineJob, len(jobs)) 16 for i, job := range jobs { 17 newJob, err := machineJobFromParams(job) 18 if err != nil { 19 return nil, err 20 } 21 newJobs[i] = newJob 22 } 23 return newJobs, nil 24 } 25 26 // machineJobFromParams returns the job corresponding to multiwatcher.MachineJob. 27 func machineJobFromParams(job multiwatcher.MachineJob) (state.MachineJob, error) { 28 switch job { 29 case multiwatcher.JobHostUnits: 30 return state.JobHostUnits, nil 31 case multiwatcher.JobManageModel: 32 return state.JobManageModel, nil 33 case multiwatcher.JobManageNetworking: 34 return state.JobManageNetworking, nil 35 default: 36 return -1, errors.Errorf("invalid machine job %q", job) 37 } 38 } 39 40 type origStateInterface interface { 41 Machine(string) (*state.Machine, error) 42 } 43 44 type stateInterface interface { 45 Machine(string) (Machine, error) 46 } 47 48 type stateShim struct { 49 origStateInterface 50 } 51 52 func (st *stateShim) Machine(id string) (Machine, error) { 53 return st.origStateInterface.Machine(id) 54 } 55 56 type Machine interface { 57 Life() state.Life 58 ForceDestroy() error 59 Destroy() error 60 } 61 62 func DestroyMachines(st origStateInterface, force bool, ids ...string) error { 63 return destroyMachines(&stateShim{st}, force, ids...) 64 } 65 66 func destroyMachines(st stateInterface, force bool, ids ...string) error { 67 var errs []string 68 for _, id := range ids { 69 machine, err := st.Machine(id) 70 switch { 71 case errors.IsNotFound(err): 72 err = errors.Errorf("machine %s does not exist", id) 73 case err != nil: 74 case force: 75 err = machine.ForceDestroy() 76 case machine.Life() != state.Alive: 77 continue 78 default: 79 err = machine.Destroy() 80 } 81 if err != nil { 82 errs = append(errs, err.Error()) 83 } 84 } 85 return DestroyErr("machines", ids, errs) 86 }