github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/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  func init() {
    18  	common.RegisterStandardFacade("HostKeyReporter", 1, newFacade)
    19  }
    20  
    21  // Backend defines the State API used by the hostkeyreporter facade.
    22  type Backend interface {
    23  	SetSSHHostKeys(names.MachineTag, state.SSHHostKeys) error
    24  }
    25  
    26  // Facade implements the API required by the hostkeyreporter worker.
    27  type Facade struct {
    28  	backend      Backend
    29  	getCanModify common.GetAuthFunc
    30  }
    31  
    32  // New returns a new API facade for the hostkeyreporter worker.
    33  func New(backend Backend, _ facade.Resources, authorizer facade.Authorizer) (*Facade, error) {
    34  	return &Facade{
    35  		backend: backend,
    36  		getCanModify: func() (common.AuthFunc, error) {
    37  			return authorizer.AuthOwner, nil
    38  		},
    39  	}, nil
    40  }
    41  
    42  // ReportKeys sets the SSH host keys for one or more entities.
    43  func (facade *Facade) ReportKeys(args params.SSHHostKeySet) (params.ErrorResults, error) {
    44  	results := params.ErrorResults{
    45  		Results: make([]params.ErrorResult, len(args.EntityKeys)),
    46  	}
    47  
    48  	canModify, err := facade.getCanModify()
    49  	if err != nil {
    50  		return results, err
    51  	}
    52  
    53  	for i, arg := range args.EntityKeys {
    54  		tag, err := names.ParseMachineTag(arg.Tag)
    55  		if err != nil {
    56  			results.Results[i].Error = common.ServerError(common.ErrPerm)
    57  			continue
    58  		}
    59  		err = common.ErrPerm
    60  		if canModify(tag) {
    61  			err = facade.backend.SetSSHHostKeys(tag, state.SSHHostKeys(arg.PublicKeys))
    62  		}
    63  		results.Results[i].Error = common.ServerError(err)
    64  	}
    65  	return results, nil
    66  }