1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/errors"
9
"github.com/juju/juju/state"
10
"github.com/juju/juju/state/multiwatcher"
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)
26
// machineJobFromParams returns the job corresponding to multiwatcher.MachineJob.
27
func machineJobFromParams(job multiwatcher.MachineJob) (state.MachineJob, error) {
29
case multiwatcher.JobHostUnits:
30
return state.JobHostUnits, nil
31
case multiwatcher.JobManageModel:
32
return state.JobManageModel, nil
34
return -1, errors.Errorf("invalid machine job %q", job)
38
type origStateInterface interface {
39
Machine(string) (*state.Machine, error)
42
type stateInterface interface {
43
Machine(string) (Machine, error)
46
type stateShim struct {
50
func (st *stateShim) Machine(id string) (Machine, error) {
51
return st.origStateInterface.Machine(id)
54
type Machine interface {
60
func DestroyMachines(st origStateInterface, force bool, ids ...string) error {
61
return destroyMachines(&stateShim{st}, force, ids...)
64
func destroyMachines(st stateInterface, force bool, ids ...string) error {
66
for _, id := range ids {
67
machine, err := st.Machine(id)
69
case errors.IsNotFound(err):
70
err = errors.Errorf("machine %s does not exist", id)
73
err = machine.ForceDestroy()
74
case machine.Life() != state.Alive:
77
err = machine.Destroy()
80
errs = append(errs, err.Error())
83
return DestroyErr("machines", ids, errs)