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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // Package hostkeyreporter implements the API facade used by the
     5  // hostkeyreporter worker.
     6  package hostkeyreporter
     7  
     8  import (
     9  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/apiserver/common"
    12  	"github.com/juju/juju/apiserver/facade"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/state"
    15  )
    16  
    17  // Backend defines the State API used by the hostkeyreporter facade.
    18  type Backend interface {
    19  	SetSSHHostKeys(names.MachineTag, state.SSHHostKeys) error
    20  }
    21  
    22  // Facade implements the API required by the hostkeyreporter worker.
    23  type Facade struct {
    24  	backend      Backend
    25  	getCanModify common.GetAuthFunc
    26  }
    27  
    28  // New returns a new API facade for the hostkeyreporter worker.
    29  func New(backend Backend, _ facade.Resources, authorizer facade.Authorizer) (*Facade, error) {
    30  	return &Facade{
    31  		backend: backend,
    32  		getCanModify: func() (common.AuthFunc, error) {
    33  			return authorizer.AuthOwner, nil
    34  		},
    35  	}, nil
    36  }
    37  
    38  // ReportKeys sets the SSH host keys for one or more entities.
    39  func (facade *Facade) ReportKeys(args params.SSHHostKeySet) (params.ErrorResults, error) {
    40  	results := params.ErrorResults{
    41  		Results: make([]params.ErrorResult, len(args.EntityKeys)),
    42  	}
    43  
    44  	canModify, err := facade.getCanModify()
    45  	if err != nil {
    46  		return results, err
    47  	}
    48  
    49  	for i, arg := range args.EntityKeys {
    50  		tag, err := names.ParseMachineTag(arg.Tag)
    51  		if err != nil {
    52  			results.Results[i].Error = common.ServerError(common.ErrPerm)
    53  			continue
    54  		}
    55  		err = common.ErrPerm
    56  		if canModify(tag) {
    57  			err = facade.backend.SetSSHHostKeys(tag, state.SSHHostKeys(arg.PublicKeys))
    58  		}
    59  		results.Results[i].Error = common.ServerError(err)
    60  	}
    61  	return results, nil
    62  }