github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/payloadshookcontext/unitfacade_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package payloadshookcontext_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/charm.v6" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/apiserver/common" 15 unitfacade "github.com/juju/juju/apiserver/facades/agent/payloadshookcontext" 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/payload" 18 ) 19 20 var _ = gc.Suite(&suite{}) 21 22 type suite struct { 23 testing.IsolationSuite 24 25 stub *testing.Stub 26 state *FakeState 27 } 28 29 func (s *suite) SetUpTest(c *gc.C) { 30 s.IsolationSuite.SetUpTest(c) 31 32 s.stub = &testing.Stub{} 33 s.state = &FakeState{stub: s.stub} 34 } 35 36 func (s *suite) TestTrack(c *gc.C) { 37 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 38 s.state.stateIDs = []string{id} 39 40 a := unitfacade.NewUnitFacade(s.state) 41 42 args := params.TrackPayloadArgs{ 43 Payloads: []params.Payload{{ 44 Class: "idfoo", 45 Type: "type", 46 ID: "bar", 47 Status: payload.StateRunning, 48 }}, 49 } 50 51 res, err := a.Track(args) 52 c.Assert(err, jc.ErrorIsNil) 53 54 c.Check(res, jc.DeepEquals, params.PayloadResults{ 55 Results: []params.PayloadResult{{ 56 Entity: params.Entity{ 57 Tag: names.NewPayloadTag(id).String(), 58 }, 59 Payload: nil, 60 NotFound: false, 61 Error: nil, 62 }}, 63 }) 64 65 c.Check(s.state.payload, jc.DeepEquals, payload.Payload{ 66 PayloadClass: charm.PayloadClass{ 67 Name: "idfoo", 68 Type: "type", 69 }, 70 Status: payload.StateRunning, 71 Labels: []string{}, 72 ID: "bar", 73 }) 74 } 75 76 func (s *suite) TestListOne(c *gc.C) { 77 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 78 pl := payload.Payload{ 79 PayloadClass: charm.PayloadClass{ 80 Name: "foobar", 81 Type: "type", 82 }, 83 ID: "idfoo", 84 Status: payload.StateRunning, 85 Unit: "a-application/0", 86 } 87 s.state.payloads = []payload.Result{{ 88 ID: id, 89 Payload: &payload.FullPayloadInfo{ 90 Payload: pl, 91 Machine: "1", 92 }, 93 }} 94 95 a := unitfacade.NewUnitFacade(s.state) 96 args := params.Entities{ 97 Entities: []params.Entity{{ 98 Tag: names.NewPayloadTag(id).String(), 99 }}, 100 } 101 results, err := a.List(args) 102 c.Assert(err, jc.ErrorIsNil) 103 104 expected := params.Payload{ 105 Class: "foobar", 106 Type: "type", 107 ID: "idfoo", 108 Status: payload.StateRunning, 109 Labels: []string{}, 110 Unit: "unit-a-application-0", 111 Machine: "machine-1", 112 } 113 114 c.Check(results, jc.DeepEquals, params.PayloadResults{ 115 Results: []params.PayloadResult{{ 116 Entity: params.Entity{ 117 Tag: names.NewPayloadTag(id).String(), 118 }, 119 Payload: &expected, 120 NotFound: false, 121 Error: nil, 122 }}, 123 }) 124 } 125 126 func (s *suite) TestListAll(c *gc.C) { 127 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 128 s.state.stateIDs = []string{id} 129 pl := payload.Payload{ 130 PayloadClass: charm.PayloadClass{ 131 Name: "foobar", 132 Type: "type", 133 }, 134 ID: "idfoo", 135 Status: payload.StateRunning, 136 Unit: "a-application/0", 137 } 138 s.state.payloads = []payload.Result{{ 139 ID: id, 140 Payload: &payload.FullPayloadInfo{ 141 Payload: pl, 142 Machine: "1", 143 }, 144 }} 145 146 a := unitfacade.NewUnitFacade(s.state) 147 args := params.Entities{} 148 results, err := a.List(args) 149 c.Assert(err, jc.ErrorIsNil) 150 151 expected := params.Payload{ 152 Class: "foobar", 153 Type: "type", 154 ID: "idfoo", 155 Status: payload.StateRunning, 156 Labels: []string{}, 157 Unit: "unit-a-application-0", 158 Machine: "machine-1", 159 } 160 c.Check(results, jc.DeepEquals, params.PayloadResults{ 161 Results: []params.PayloadResult{{ 162 Entity: params.Entity{ 163 Tag: names.NewPayloadTag(id).String(), 164 }, 165 Payload: &expected, 166 NotFound: false, 167 Error: nil, 168 }}, 169 }) 170 } 171 172 func (s *suite) TestLookUpOkay(c *gc.C) { 173 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 174 s.state.stateIDs = []string{id} 175 176 a := unitfacade.NewUnitFacade(s.state) 177 args := params.LookUpPayloadArgs{ 178 Args: []params.LookUpPayloadArg{{ 179 Name: "fooID", 180 ID: "bar", 181 }}, 182 } 183 res, err := a.LookUp(args) 184 c.Assert(err, jc.ErrorIsNil) 185 186 s.stub.CheckCalls(c, []testing.StubCall{{ 187 FuncName: "LookUp", 188 Args: []interface{}{"fooID", "bar"}, 189 }}) 190 191 c.Check(res, jc.DeepEquals, params.PayloadResults{ 192 Results: []params.PayloadResult{{ 193 Entity: params.Entity{ 194 Tag: names.NewPayloadTag(id).String(), 195 }, 196 NotFound: false, 197 Error: nil, 198 }}, 199 }) 200 } 201 202 func (s *suite) TestLookUpMixed(c *gc.C) { 203 s.state.stateIDs = []string{ 204 "ce5bc2a7-65d8-4800-8199-a7c3356ab309", 205 "", 206 "ce5bc2a7-65d8-4800-8199-a7c3356ab311", 207 } 208 notFound := errors.NotFoundf("payload") 209 s.stub.SetErrors(nil, notFound, nil) 210 211 a := unitfacade.NewUnitFacade(s.state) 212 args := params.LookUpPayloadArgs{ 213 Args: []params.LookUpPayloadArg{{ 214 Name: "fooID", 215 ID: "bar", 216 }, { 217 Name: "bazID", 218 ID: "bam", 219 }, { 220 Name: "spam", 221 ID: "eggs", 222 }}, 223 } 224 res, err := a.LookUp(args) 225 c.Assert(err, jc.ErrorIsNil) 226 227 s.stub.CheckCallNames(c, "LookUp", "LookUp", "LookUp") 228 c.Check(res, jc.DeepEquals, params.PayloadResults{ 229 Results: []params.PayloadResult{{ 230 Entity: params.Entity{ 231 Tag: names.NewPayloadTag("ce5bc2a7-65d8-4800-8199-a7c3356ab309").String(), 232 }, 233 NotFound: false, 234 Error: nil, 235 }, { 236 Entity: params.Entity{ 237 Tag: "", 238 }, 239 NotFound: true, 240 Error: common.ServerError(notFound), 241 }, { 242 Entity: params.Entity{ 243 Tag: names.NewPayloadTag("ce5bc2a7-65d8-4800-8199-a7c3356ab311").String(), 244 }, 245 NotFound: false, 246 Error: nil, 247 }}, 248 }) 249 } 250 251 func (s *suite) TestSetStatus(c *gc.C) { 252 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 253 s.state.stateIDs = []string{id} 254 s.state.stateIDs = []string{"ce5bc2a7-65d8-4800-8199-a7c3356ab309"} 255 256 a := unitfacade.NewUnitFacade(s.state) 257 args := params.SetPayloadStatusArgs{ 258 Args: []params.SetPayloadStatusArg{{ 259 Entity: params.Entity{ 260 Tag: names.NewPayloadTag(id).String(), 261 }, 262 Status: payload.StateRunning, 263 }}, 264 } 265 res, err := a.SetStatus(args) 266 c.Assert(err, jc.ErrorIsNil) 267 268 c.Check(s.state.id, gc.Equals, id) 269 c.Assert(s.state.status, gc.Equals, payload.StateRunning) 270 271 expected := params.PayloadResults{ 272 Results: []params.PayloadResult{{ 273 Entity: params.Entity{ 274 Tag: names.NewPayloadTag(id).String(), 275 }, 276 Error: nil, 277 }}, 278 } 279 c.Assert(res, gc.DeepEquals, expected) 280 } 281 282 func (s *suite) TestUntrack(c *gc.C) { 283 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 284 s.state.stateIDs = []string{id} 285 286 a := unitfacade.NewUnitFacade(s.state) 287 args := params.Entities{ 288 Entities: []params.Entity{{ 289 Tag: names.NewPayloadTag(id).String(), 290 }}, 291 } 292 res, err := a.Untrack(args) 293 c.Assert(err, jc.ErrorIsNil) 294 295 c.Assert(s.state.id, gc.Equals, id) 296 297 expected := params.PayloadResults{ 298 Results: []params.PayloadResult{{ 299 Entity: params.Entity{ 300 Tag: names.NewPayloadTag(id).String(), 301 }, 302 Error: nil, 303 }}, 304 } 305 c.Assert(res, gc.DeepEquals, expected) 306 } 307 308 func (s *suite) TestUntrackEmptyID(c *gc.C) { 309 a := unitfacade.NewUnitFacade(s.state) 310 args := params.Entities{ 311 Entities: []params.Entity{{ 312 Tag: "", 313 }}, 314 } 315 res, err := a.Untrack(args) 316 c.Assert(err, jc.ErrorIsNil) 317 318 c.Assert(s.state.id, gc.Equals, "") 319 320 expected := params.PayloadResults{ 321 Results: []params.PayloadResult{{ 322 Entity: params.Entity{ 323 Tag: "", 324 }, 325 Error: nil, 326 }}, 327 } 328 c.Assert(res, gc.DeepEquals, expected) 329 } 330 331 func (s *suite) TestUntrackNoIDs(c *gc.C) { 332 id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309" 333 s.state.id = id 334 335 a := unitfacade.NewUnitFacade(s.state) 336 args := params.Entities{ 337 Entities: []params.Entity{}, 338 } 339 res, err := a.Untrack(args) 340 c.Assert(err, jc.ErrorIsNil) 341 342 c.Assert(s.state.id, gc.Equals, id) 343 344 expected := params.PayloadResults{} 345 c.Assert(res, gc.DeepEquals, expected) 346 } 347 348 type FakeState struct { 349 stub *testing.Stub 350 351 // inputs 352 id string 353 ids []string 354 status string 355 payload payload.Payload 356 357 //outputs 358 stateIDs []string 359 payloads []payload.Result 360 } 361 362 func (f *FakeState) nextID() string { 363 if len(f.stateIDs) == 0 { 364 return "" 365 } 366 id := f.stateIDs[0] 367 f.stateIDs = f.stateIDs[1:] 368 return id 369 } 370 371 func (f *FakeState) Track(pl payload.Payload) error { 372 f.payload = pl 373 if err := f.stub.NextErr(); err != nil { 374 return errors.Trace(err) 375 } 376 377 return nil 378 } 379 380 func (f *FakeState) List(ids ...string) ([]payload.Result, error) { 381 f.ids = ids 382 if err := f.stub.NextErr(); err != nil { 383 return nil, errors.Trace(err) 384 } 385 386 return f.payloads, nil 387 } 388 389 func (f *FakeState) SetStatus(id, status string) error { 390 f.id = id 391 f.status = status 392 if err := f.stub.NextErr(); err != nil { 393 return errors.Trace(err) 394 } 395 396 return nil 397 } 398 399 func (f *FakeState) LookUp(name, rawID string) (string, error) { 400 f.stub.AddCall("LookUp", name, rawID) 401 id := f.nextID() 402 if err := f.stub.NextErr(); err != nil { 403 return "", errors.Trace(err) 404 } 405 406 return id, nil 407 } 408 409 func (f *FakeState) Untrack(id string) error { 410 f.id = id 411 if err := f.stub.NextErr(); err != nil { 412 return errors.Trace(err) 413 } 414 415 return nil 416 }