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  }