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 }