github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/api/rsyslog/rsyslog.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package rsyslog 5 6 import ( 7 "fmt" 8 9 "github.com/juju/juju/api/base" 10 "github.com/juju/juju/api/watcher" 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/network" 13 ) 14 15 const rsyslogAPI = "Rsyslog" 16 17 // RsyslogConfig holds the values needed for the rsyslog worker 18 type RsyslogConfig struct { 19 CACert string 20 CAKey string 21 // Port is only used by state servers as the port to listen on. 22 Port int 23 HostPorts []network.HostPort 24 } 25 26 // State provides access to the Rsyslog API facade. 27 type State struct { 28 facade base.FacadeCaller 29 } 30 31 // NewState creates a new client-side Rsyslog facade. 32 func NewState(caller base.APICaller) *State { 33 return &State{facade: base.NewFacadeCaller(caller, rsyslogAPI)} 34 } 35 36 // SetRsyslogCert sets the rsyslog CA and Key certificates. 37 // The CA cert is used to verify the server's identify and establish 38 // a TLS session. The Key is used to allow us to properly regenerate 39 // rsyslog server certificates when adding and removing 40 // state servers with ensure-availability. 41 func (st *State) SetRsyslogCert(caCert, caKey string) error { 42 var result params.ErrorResult 43 args := params.SetRsyslogCertParams{ 44 CACert: []byte(caCert), 45 CAKey: []byte(caKey), 46 } 47 err := st.facade.FacadeCall("SetRsyslogCert", args, &result) 48 if err != nil { 49 return err 50 } 51 if result.Error != nil { 52 return result.Error 53 } 54 return nil 55 } 56 57 // WatchForRsyslogChanges returns a new NotifyWatcher. 58 func (st *State) WatchForRsyslogChanges(agentTag string) (watcher.NotifyWatcher, error) { 59 var results params.NotifyWatchResults 60 args := params.Entities{ 61 Entities: []params.Entity{{Tag: agentTag}}, 62 } 63 64 err := st.facade.FacadeCall("WatchForRsyslogChanges", args, &results) 65 if err != nil { 66 // TODO: Not directly tested 67 return nil, err 68 } 69 if len(results.Results) != 1 { 70 // TODO: Not directly tested 71 return nil, fmt.Errorf("expected 1 result, got %d", len(results.Results)) 72 } 73 result := results.Results[0] 74 if result.Error != nil { 75 // TODO: Not directly tested 76 return nil, result.Error 77 } 78 w := watcher.NewNotifyWatcher(st.facade.RawAPICaller(), result) 79 return w, nil 80 } 81 82 // GetRsyslogConfig returns a RsyslogConfig. 83 func (st *State) GetRsyslogConfig(agentTag string) (*RsyslogConfig, error) { 84 var results params.RsyslogConfigResults 85 args := params.Entities{ 86 Entities: []params.Entity{{Tag: agentTag}}, 87 } 88 err := st.facade.FacadeCall("GetRsyslogConfig", args, &results) 89 if err != nil { 90 return nil, err 91 } 92 result := results.Results[0] 93 if result.Error != nil { 94 // TODO: Not directly tested 95 return nil, result.Error 96 } 97 return &RsyslogConfig{ 98 CACert: result.CACert, 99 CAKey: result.CAKey, 100 Port: result.Port, 101 HostPorts: params.NetworkHostPorts(result.HostPorts), 102 }, nil 103 }