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  }