github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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  	// Port is only used by state servers as the port to listen on.
    21  	Port      int
    22  	HostPorts []network.HostPort
    23  }
    24  
    25  // State provides access to the Rsyslog API facade.
    26  type State struct {
    27  	facade base.FacadeCaller
    28  }
    29  
    30  // NewState creates a new client-side Rsyslog facade.
    31  func NewState(caller base.APICaller) *State {
    32  	return &State{facade: base.NewFacadeCaller(caller, rsyslogAPI)}
    33  }
    34  
    35  // SetRsyslogCert sets the rsyslog CA certificate,
    36  // which is used by clients to verify the server's
    37  // identity and establish a TLS session.
    38  func (st *State) SetRsyslogCert(caCert string) error {
    39  	var result params.ErrorResult
    40  	args := params.SetRsyslogCertParams{
    41  		CACert: []byte(caCert),
    42  	}
    43  	err := st.facade.FacadeCall("SetRsyslogCert", args, &result)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	if result.Error != nil {
    48  		return result.Error
    49  	}
    50  	return nil
    51  }
    52  
    53  // WatchForRsyslogChanges returns a new NotifyWatcher.
    54  func (st *State) WatchForRsyslogChanges(agentTag string) (watcher.NotifyWatcher, error) {
    55  	var results params.NotifyWatchResults
    56  	args := params.Entities{
    57  		Entities: []params.Entity{{Tag: agentTag}},
    58  	}
    59  
    60  	err := st.facade.FacadeCall("WatchForRsyslogChanges", args, &results)
    61  	if err != nil {
    62  		// TODO: Not directly tested
    63  		return nil, err
    64  	}
    65  	if len(results.Results) != 1 {
    66  		// TODO: Not directly tested
    67  		return nil, fmt.Errorf("expected 1 result, got %d", len(results.Results))
    68  	}
    69  	result := results.Results[0]
    70  	if result.Error != nil {
    71  		//  TODO: Not directly tested
    72  		return nil, result.Error
    73  	}
    74  	w := watcher.NewNotifyWatcher(st.facade.RawAPICaller(), result)
    75  	return w, nil
    76  }
    77  
    78  // GetRsyslogConfig returns a RsyslogConfig.
    79  func (st *State) GetRsyslogConfig(agentTag string) (*RsyslogConfig, error) {
    80  	var results params.RsyslogConfigResults
    81  	args := params.Entities{
    82  		Entities: []params.Entity{{Tag: agentTag}},
    83  	}
    84  	err := st.facade.FacadeCall("GetRsyslogConfig", args, &results)
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  	result := results.Results[0]
    89  	if result.Error != nil {
    90  		//  TODO: Not directly tested
    91  		return nil, result.Error
    92  	}
    93  	return &RsyslogConfig{
    94  		CACert:    result.CACert,
    95  		Port:      result.Port,
    96  		HostPorts: result.HostPorts,
    97  	}, nil
    98  }