github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/sshclient/facade_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package sshclient_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jujutesting "github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	apitesting "github.com/juju/juju/api/base/testing"
    14  	"github.com/juju/juju/api/sshclient"
    15  	"github.com/juju/juju/apiserver/common"
    16  	"github.com/juju/juju/apiserver/params"
    17  )
    18  
    19  type FacadeSuite struct {
    20  	jujutesting.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&FacadeSuite{})
    24  
    25  func (s *FacadeSuite) TestAddresses(c *gc.C) {
    26  	var stub jujutesting.Stub
    27  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    28  		stub.AddCall(objType+"."+request, arg)
    29  		c.Check(id, gc.Equals, "")
    30  
    31  		switch request {
    32  		case "PublicAddress", "PrivateAddress":
    33  			*result.(*params.SSHAddressResults) = params.SSHAddressResults{
    34  				Results: []params.SSHAddressResult{
    35  					{Address: "1.1.1.1"},
    36  				},
    37  			}
    38  
    39  		case "AllAddresses":
    40  			*result.(*params.SSHAddressesResults) = params.SSHAddressesResults{
    41  				Results: []params.SSHAddressesResult{
    42  					{Addresses: []string{"1.1.1.1", "2.2.2.2"}},
    43  				},
    44  			}
    45  		}
    46  
    47  		return nil
    48  	})
    49  
    50  	facade := sshclient.NewFacade(apiCaller)
    51  	expectedArg := []interface{}{params.Entities{[]params.Entity{{
    52  		names.NewUnitTag("foo/0").String(),
    53  	}}}}
    54  
    55  	public, err := facade.PublicAddress("foo/0")
    56  	c.Assert(err, jc.ErrorIsNil)
    57  	c.Check(public, gc.Equals, "1.1.1.1")
    58  	stub.CheckCalls(c, []jujutesting.StubCall{{"SSHClient.PublicAddress", expectedArg}})
    59  	stub.ResetCalls()
    60  
    61  	private, err := facade.PrivateAddress("foo/0")
    62  	c.Assert(err, jc.ErrorIsNil)
    63  	c.Check(private, gc.Equals, "1.1.1.1")
    64  	stub.CheckCalls(c, []jujutesting.StubCall{{"SSHClient.PrivateAddress", expectedArg}})
    65  	stub.ResetCalls()
    66  
    67  	addrs, err := facade.AllAddresses("foo/0")
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	c.Check(addrs, gc.DeepEquals, []string{"1.1.1.1", "2.2.2.2"})
    70  	stub.CheckCalls(c, []jujutesting.StubCall{{"SSHClient.AllAddresses", expectedArg}})
    71  }
    72  
    73  func (s *FacadeSuite) TestAddressesError(c *gc.C) {
    74  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    75  		return errors.New("boom")
    76  	})
    77  	facade := sshclient.NewFacade(apiCaller)
    78  
    79  	public, err := facade.PublicAddress("foo/0")
    80  	c.Check(public, gc.Equals, "")
    81  	c.Check(err, gc.ErrorMatches, "boom")
    82  
    83  	private, err := facade.PrivateAddress("foo/0")
    84  	c.Check(private, gc.Equals, "")
    85  	c.Check(err, gc.ErrorMatches, "boom")
    86  
    87  	addrs, err := facade.AllAddresses("foo/0")
    88  	c.Check(addrs, gc.IsNil)
    89  	c.Check(err, gc.ErrorMatches, "boom")
    90  }
    91  
    92  func (s *FacadeSuite) TestAddressesTargetError(c *gc.C) {
    93  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    94  		serverError := common.ServerError(errors.New("boom"))
    95  
    96  		switch request {
    97  		case "PublicAddress", "PrivateAddress":
    98  			*result.(*params.SSHAddressResults) = params.SSHAddressResults{
    99  				Results: []params.SSHAddressResult{{Error: serverError}},
   100  			}
   101  		case "AllAddresses":
   102  			*result.(*params.SSHAddressesResults) = params.SSHAddressesResults{
   103  				Results: []params.SSHAddressesResult{{Error: serverError}},
   104  			}
   105  		}
   106  
   107  		return nil
   108  	})
   109  	facade := sshclient.NewFacade(apiCaller)
   110  
   111  	public, err := facade.PublicAddress("foo/0")
   112  	c.Check(public, gc.Equals, "")
   113  	c.Check(err, gc.ErrorMatches, "boom")
   114  
   115  	private, err := facade.PrivateAddress("foo/0")
   116  	c.Check(private, gc.Equals, "")
   117  	c.Check(err, gc.ErrorMatches, "boom")
   118  
   119  	addrs, err := facade.AllAddresses("foo/0")
   120  	c.Check(addrs, gc.IsNil)
   121  	c.Check(err, gc.ErrorMatches, "boom")
   122  }
   123  
   124  func (s *FacadeSuite) TestAddressesMissingResults(c *gc.C) {
   125  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   126  		return nil
   127  	})
   128  	facade := sshclient.NewFacade(apiCaller)
   129  	expectedErr := "expected 1 result, got 0"
   130  
   131  	public, err := facade.PublicAddress("foo/0")
   132  	c.Check(public, gc.Equals, "")
   133  	c.Check(err, gc.ErrorMatches, expectedErr)
   134  
   135  	private, err := facade.PrivateAddress("foo/0")
   136  	c.Check(private, gc.Equals, "")
   137  	c.Check(err, gc.ErrorMatches, expectedErr)
   138  
   139  	addrs, err := facade.AllAddresses("foo/0")
   140  	c.Check(addrs, gc.IsNil)
   141  	c.Check(err, gc.ErrorMatches, expectedErr)
   142  }
   143  
   144  func (s *FacadeSuite) TestAddressesExtraResults(c *gc.C) {
   145  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   146  		switch request {
   147  		case "PublicAddress", "PrivateAddress":
   148  			*result.(*params.SSHAddressResults) = params.SSHAddressResults{
   149  				Results: []params.SSHAddressResult{
   150  					{Address: "1.1.1.1"},
   151  					{Address: "2.2.2.2"},
   152  				},
   153  			}
   154  		case "AllAddresses":
   155  			*result.(*params.SSHAddressesResults) = params.SSHAddressesResults{
   156  				Results: []params.SSHAddressesResult{
   157  					{Addresses: []string{"1.1.1.1"}},
   158  					{Addresses: []string{"2.2.2.2"}},
   159  				},
   160  			}
   161  		}
   162  		return nil
   163  	})
   164  	facade := sshclient.NewFacade(apiCaller)
   165  	expectedErr := "expected 1 result, got 2"
   166  
   167  	public, err := facade.PublicAddress("foo/0")
   168  	c.Check(public, gc.Equals, "")
   169  	c.Check(err, gc.ErrorMatches, expectedErr)
   170  
   171  	private, err := facade.PrivateAddress("foo/0")
   172  	c.Check(private, gc.Equals, "")
   173  	c.Check(err, gc.ErrorMatches, expectedErr)
   174  
   175  	addrs, err := facade.AllAddresses("foo/0")
   176  	c.Check(addrs, gc.IsNil)
   177  	c.Check(err, gc.ErrorMatches, expectedErr)
   178  }
   179  
   180  func (s *FacadeSuite) TestPublicKeys(c *gc.C) {
   181  	var stub jujutesting.Stub
   182  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   183  		stub.AddCall(objType+"."+request, arg)
   184  		c.Check(id, gc.Equals, "")
   185  		*result.(*params.SSHPublicKeysResults) = params.SSHPublicKeysResults{
   186  			Results: []params.SSHPublicKeysResult{{PublicKeys: []string{"rsa", "dsa"}}},
   187  		}
   188  		return nil
   189  	})
   190  	facade := sshclient.NewFacade(apiCaller)
   191  	keys, err := facade.PublicKeys("foo/0")
   192  	c.Assert(err, jc.ErrorIsNil)
   193  	c.Check(keys, gc.DeepEquals, []string{"rsa", "dsa"})
   194  	stub.CheckCalls(c, []jujutesting.StubCall{{
   195  		"SSHClient.PublicKeys",
   196  		[]interface{}{params.Entities{[]params.Entity{{
   197  			Tag: names.NewUnitTag("foo/0").String(),
   198  		}}}},
   199  	}})
   200  }
   201  
   202  func (s *FacadeSuite) TestPublicKeysError(c *gc.C) {
   203  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   204  		return errors.New("boom")
   205  	})
   206  	facade := sshclient.NewFacade(apiCaller)
   207  	keys, err := facade.PublicKeys("foo/0")
   208  	c.Check(keys, gc.IsNil)
   209  	c.Check(err, gc.ErrorMatches, "boom")
   210  }
   211  
   212  func (s *FacadeSuite) TestPublicKeysTargetError(c *gc.C) {
   213  	var stub jujutesting.Stub
   214  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   215  		stub.AddCall(objType+"."+request, arg)
   216  		c.Check(id, gc.Equals, "")
   217  		*result.(*params.SSHPublicKeysResults) = params.SSHPublicKeysResults{
   218  			Results: []params.SSHPublicKeysResult{{Error: common.ServerError(errors.New("boom"))}},
   219  		}
   220  		return nil
   221  	})
   222  	facade := sshclient.NewFacade(apiCaller)
   223  	keys, err := facade.PublicKeys("foo/0")
   224  	c.Check(keys, gc.IsNil)
   225  	c.Check(err, gc.ErrorMatches, "boom")
   226  }
   227  
   228  func (s *FacadeSuite) TestPublicKeysMissingResults(c *gc.C) {
   229  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   230  		return nil
   231  	})
   232  	facade := sshclient.NewFacade(apiCaller)
   233  	keys, err := facade.PublicKeys("foo/0")
   234  	c.Check(keys, gc.IsNil)
   235  	c.Check(err, gc.ErrorMatches, "expected 1 result, got 0")
   236  }
   237  
   238  func (s *FacadeSuite) TestPublicKeysExtraResults(c *gc.C) {
   239  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   240  		*result.(*params.SSHPublicKeysResults) = params.SSHPublicKeysResults{
   241  			Results: []params.SSHPublicKeysResult{
   242  				{PublicKeys: []string{"rsa"}},
   243  				{PublicKeys: []string{"rsa"}},
   244  			},
   245  		}
   246  		return nil
   247  	})
   248  	facade := sshclient.NewFacade(apiCaller)
   249  	keys, err := facade.PublicKeys("foo/0")
   250  	c.Check(keys, gc.IsNil)
   251  	c.Check(err, gc.ErrorMatches, "expected 1 result, got 2")
   252  }
   253  
   254  func (s *FacadeSuite) TestProxy(c *gc.C) {
   255  	checkProxy(c, true)
   256  	checkProxy(c, false)
   257  }
   258  
   259  func checkProxy(c *gc.C, useProxy bool) {
   260  	var stub jujutesting.Stub
   261  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   262  		stub.AddCall(objType+"."+request, arg)
   263  		*result.(*params.SSHProxyResult) = params.SSHProxyResult{
   264  			UseProxy: useProxy,
   265  		}
   266  		return nil
   267  	})
   268  	facade := sshclient.NewFacade(apiCaller)
   269  	result, err := facade.Proxy()
   270  	c.Check(err, jc.ErrorIsNil)
   271  	c.Check(result, gc.Equals, useProxy)
   272  	stub.CheckCalls(c, []jujutesting.StubCall{{"SSHClient.Proxy", []interface{}{nil}}})
   273  }
   274  
   275  func (s *FacadeSuite) TestProxyError(c *gc.C) {
   276  	apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   277  		return errors.New("boom")
   278  	})
   279  	facade := sshclient.NewFacade(apiCaller)
   280  	_, err := facade.Proxy()
   281  	c.Check(err, gc.ErrorMatches, "boom")
   282  }