github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/machine/machiner.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // The machiner package implements the API interface
     5  // used by the machiner worker.
     6  package machine
     7  
     8  import (
     9  	"github.com/juju/errors"
    10  	"github.com/juju/loggo"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/common/networkingcommon"
    15  	"github.com/juju/juju/apiserver/facade"
    16  	"github.com/juju/juju/apiserver/params"
    17  	"github.com/juju/juju/state"
    18  	"github.com/juju/juju/state/multiwatcher"
    19  )
    20  
    21  var logger = loggo.GetLogger("juju.apiserver.machine")
    22  
    23  // MachinerAPI implements the API used by the machiner worker.
    24  type MachinerAPI struct {
    25  	*common.LifeGetter
    26  	*common.StatusSetter
    27  	*common.DeadEnsurer
    28  	*common.AgentEntityWatcher
    29  	*common.APIAddresser
    30  	*networkingcommon.NetworkConfigAPI
    31  
    32  	st           *state.State
    33  	auth         facade.Authorizer
    34  	getCanModify common.GetAuthFunc
    35  	getCanRead   common.GetAuthFunc
    36  }
    37  
    38  // NewMachinerAPI creates a new instance of the Machiner API.
    39  func NewMachinerAPI(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*MachinerAPI, error) {
    40  	if !authorizer.AuthMachineAgent() {
    41  		return nil, common.ErrPerm
    42  	}
    43  	getCanModify := func() (common.AuthFunc, error) {
    44  		return authorizer.AuthOwner, nil
    45  	}
    46  	getCanRead := func() (common.AuthFunc, error) {
    47  		return authorizer.AuthOwner, nil
    48  	}
    49  	return &MachinerAPI{
    50  		LifeGetter:         common.NewLifeGetter(st, getCanRead),
    51  		StatusSetter:       common.NewStatusSetter(st, getCanModify),
    52  		DeadEnsurer:        common.NewDeadEnsurer(st, getCanModify),
    53  		AgentEntityWatcher: common.NewAgentEntityWatcher(st, resources, getCanRead),
    54  		APIAddresser:       common.NewAPIAddresser(st, resources),
    55  		NetworkConfigAPI:   networkingcommon.NewNetworkConfigAPI(st, state.CallContext(st), getCanModify),
    56  		st:                 st,
    57  		auth:               authorizer,
    58  		getCanModify:       getCanModify,
    59  		getCanRead:         getCanRead,
    60  	}, nil
    61  }
    62  
    63  func (api *MachinerAPI) getMachine(tag names.Tag) (*state.Machine, error) {
    64  	entity, err := api.st.FindEntity(tag)
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  	return entity.(*state.Machine), nil
    69  }
    70  
    71  func (api *MachinerAPI) SetMachineAddresses(args params.SetMachinesAddresses) (params.ErrorResults, error) {
    72  	results := params.ErrorResults{
    73  		Results: make([]params.ErrorResult, len(args.MachineAddresses)),
    74  	}
    75  	canModify, err := api.getCanModify()
    76  	if err != nil {
    77  		return results, err
    78  	}
    79  	for i, arg := range args.MachineAddresses {
    80  		tag, err := names.ParseMachineTag(arg.Tag)
    81  		if err != nil {
    82  			results.Results[i].Error = common.ServerError(common.ErrPerm)
    83  			continue
    84  		}
    85  		err = common.ErrPerm
    86  		if canModify(tag) {
    87  			var m *state.Machine
    88  			m, err = api.getMachine(tag)
    89  			if err == nil {
    90  				addresses := params.NetworkAddresses(arg.Addresses...)
    91  				err = m.SetMachineAddresses(addresses...)
    92  			} else if errors.IsNotFound(err) {
    93  				err = common.ErrPerm
    94  			}
    95  		}
    96  		results.Results[i].Error = common.ServerError(err)
    97  	}
    98  	return results, nil
    99  }
   100  
   101  // Jobs returns the jobs assigned to the given entities.
   102  func (api *MachinerAPI) Jobs(args params.Entities) (params.JobsResults, error) {
   103  	result := params.JobsResults{
   104  		Results: make([]params.JobsResult, len(args.Entities)),
   105  	}
   106  
   107  	canRead, err := api.getCanRead()
   108  	if err != nil {
   109  		return result, err
   110  	}
   111  
   112  	for i, agent := range args.Entities {
   113  		tag, err := names.ParseMachineTag(agent.Tag)
   114  		if err != nil {
   115  			result.Results[i].Error = common.ServerError(err)
   116  			continue
   117  		}
   118  
   119  		if !canRead(tag) {
   120  			result.Results[i].Error = common.ServerError(common.ErrPerm)
   121  			continue
   122  		}
   123  
   124  		machine, err := api.getMachine(tag)
   125  		if err != nil {
   126  			result.Results[i].Error = common.ServerError(err)
   127  			continue
   128  		}
   129  		machineJobs := machine.Jobs()
   130  		jobs := make([]multiwatcher.MachineJob, len(machineJobs))
   131  		for i, job := range machineJobs {
   132  			jobs[i] = job.ToParams()
   133  		}
   134  		result.Results[i].Jobs = jobs
   135  	}
   136  	return result, nil
   137  }