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 }