github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/apiserver/uniter/uniter_v1_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package uniter_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/apiserver/common" 11 commontesting "github.com/juju/juju/apiserver/common/testing" 12 "github.com/juju/juju/apiserver/params" 13 apiservertesting "github.com/juju/juju/apiserver/testing" 14 "github.com/juju/juju/apiserver/uniter" 15 "github.com/juju/juju/state" 16 ) 17 18 type uniterV1Suite struct { 19 uniterBaseSuite 20 *commontesting.EnvironWatcherTest 21 22 uniter *uniter.UniterAPIV1 23 meteredUniter *uniter.UniterAPIV1 24 } 25 26 var _ = gc.Suite(&uniterV1Suite{}) 27 28 func (s *uniterV1Suite) SetUpTest(c *gc.C) { 29 s.uniterBaseSuite.setUpTest(c) 30 31 uniterAPIV1, err := uniter.NewUniterAPIV1( 32 s.State, 33 s.resources, 34 s.authorizer, 35 ) 36 c.Assert(err, jc.ErrorIsNil) 37 s.uniter = uniterAPIV1 38 39 meteredAuthorizer := apiservertesting.FakeAuthorizer{ 40 Tag: s.meteredUnit.Tag(), 41 } 42 s.meteredUniter, err = uniter.NewUniterAPIV1( 43 s.State, 44 s.resources, 45 meteredAuthorizer, 46 ) 47 c.Assert(err, jc.ErrorIsNil) 48 49 s.EnvironWatcherTest = commontesting.NewEnvironWatcherTest( 50 s.uniter, 51 s.State, 52 s.resources, 53 commontesting.NoSecrets, 54 ) 55 } 56 57 func (s *uniterV1Suite) TestUniterFailsWithNonUnitAgentUser(c *gc.C) { 58 factory := func(st *state.State, res *common.Resources, auth common.Authorizer) error { 59 _, err := uniter.NewUniterAPIV1(st, res, auth) 60 return err 61 } 62 s.testUniterFailsWithNonUnitAgentUser(c, factory) 63 } 64 65 func (s *uniterV1Suite) TestSetStatus(c *gc.C) { 66 s.testSetStatus(c, s.uniter) 67 } 68 69 func (s *uniterV1Suite) TestLife(c *gc.C) { 70 s.testLife(c, s.uniter) 71 } 72 73 func (s *uniterV1Suite) TestEnsureDead(c *gc.C) { 74 s.testEnsureDead(c, s.uniter) 75 } 76 77 func (s *uniterV1Suite) TestWatch(c *gc.C) { 78 s.testWatch(c, s.uniter) 79 } 80 81 func (s *uniterV1Suite) TestPublicAddress(c *gc.C) { 82 s.testPublicAddress(c, s.uniter) 83 } 84 85 func (s *uniterV1Suite) TestAvailabilityZone(c *gc.C) { 86 s.testAvailabilityZone(c, s.uniter) 87 } 88 89 func (s *uniterV1Suite) TestPrivateAddress(c *gc.C) { 90 s.testPrivateAddress(c, s.uniter) 91 } 92 93 func (s *uniterV1Suite) TestResolved(c *gc.C) { 94 s.testResolved(c, s.uniter) 95 } 96 97 func (s *uniterV1Suite) TestClearResolved(c *gc.C) { 98 s.testClearResolved(c, s.uniter) 99 } 100 101 func (s *uniterV1Suite) TestGetPrincipal(c *gc.C) { 102 factory := func( 103 st *state.State, 104 resources *common.Resources, 105 authorizer common.Authorizer, 106 ) (getPrincipal, error) { 107 return uniter.NewUniterAPIV1(st, resources, authorizer) 108 } 109 s.testGetPrincipal(c, s.uniter, factory) 110 } 111 112 func (s *uniterV1Suite) TestHasSubordinates(c *gc.C) { 113 s.testHasSubordinates(c, s.uniter) 114 } 115 116 func (s *uniterV1Suite) TestDestroy(c *gc.C) { 117 s.testDestroy(c, s.uniter) 118 } 119 120 func (s *uniterV1Suite) TestDestroyAllSubordinates(c *gc.C) { 121 s.testDestroyAllSubordinates(c, s.uniter) 122 } 123 124 func (s *uniterV1Suite) TestCharmURL(c *gc.C) { 125 s.testCharmURL(c, s.uniter) 126 } 127 128 func (s *uniterV1Suite) TestSetCharmURL(c *gc.C) { 129 s.testSetCharmURL(c, s.uniter) 130 } 131 132 func (s *uniterV1Suite) TestOpenPorts(c *gc.C) { 133 s.testOpenPorts(c, s.uniter) 134 } 135 136 func (s *uniterV1Suite) TestClosePorts(c *gc.C) { 137 s.testClosePorts(c, s.uniter) 138 } 139 140 func (s *uniterV1Suite) TestOpenPort(c *gc.C) { 141 s.testOpenPort(c, s.uniter) 142 } 143 144 func (s *uniterV1Suite) TestClosePort(c *gc.C) { 145 s.testClosePort(c, s.uniter) 146 } 147 148 func (s *uniterV1Suite) TestWatchConfigSettings(c *gc.C) { 149 s.testWatchConfigSettings(c, s.uniter) 150 } 151 152 func (s *uniterV1Suite) TestWatchActionNotifications(c *gc.C) { 153 s.testWatchActionNotifications(c, s.uniter) 154 } 155 156 func (s *uniterV1Suite) TestWatchPreexistingActions(c *gc.C) { 157 s.testWatchPreexistingActions(c, s.uniter) 158 } 159 160 func (s *uniterV1Suite) TestWatchActionNotificationsMalformedTag(c *gc.C) { 161 s.testWatchActionNotificationsMalformedTag(c, s.uniter) 162 } 163 164 func (s *uniterV1Suite) TestWatchActionNotificationsMalformedUnitName(c *gc.C) { 165 s.testWatchActionNotificationsMalformedUnitName(c, s.uniter) 166 } 167 168 func (s *uniterV1Suite) TestWatchActionNotificationsNotUnit(c *gc.C) { 169 s.testWatchActionNotificationsNotUnit(c, s.uniter) 170 } 171 172 func (s *uniterV1Suite) TestWatchActionNotificationsPermissionDenied(c *gc.C) { 173 s.testWatchActionNotificationsPermissionDenied(c, s.uniter) 174 } 175 176 func (s *uniterV1Suite) TestConfigSettings(c *gc.C) { 177 s.testConfigSettings(c, s.uniter) 178 } 179 180 func (s *uniterV1Suite) TestWatchServiceRelations(c *gc.C) { 181 s.testWatchServiceRelations(c, s.uniter) 182 } 183 184 func (s *uniterV1Suite) TestCharmArchiveSha256(c *gc.C) { 185 s.testCharmArchiveSha256(c, s.uniter) 186 } 187 188 func (s *uniterV1Suite) TestCharmArchiveURLs(c *gc.C) { 189 s.testCharmArchiveURLs(c, s.uniter) 190 } 191 192 func (s *uniterV1Suite) TestCurrentEnvironUUID(c *gc.C) { 193 s.testCurrentEnvironUUID(c, s.uniter) 194 } 195 196 func (s *uniterV1Suite) TestCurrentEnvironment(c *gc.C) { 197 s.testCurrentEnvironment(c, s.uniter) 198 } 199 200 func (s *uniterV1Suite) TestActions(c *gc.C) { 201 s.testActions(c, s.uniter) 202 } 203 204 func (s *uniterV1Suite) TestActionsNotPresent(c *gc.C) { 205 s.testActionsNotPresent(c, s.uniter) 206 } 207 208 func (s *uniterV1Suite) TestActionsWrongUnit(c *gc.C) { 209 factory := func( 210 st *state.State, 211 resources *common.Resources, 212 authorizer common.Authorizer, 213 ) (actions, error) { 214 return uniter.NewUniterAPIV1(st, resources, authorizer) 215 } 216 s.testActionsWrongUnit(c, factory) 217 } 218 219 func (s *uniterV1Suite) TestActionsPermissionDenied(c *gc.C) { 220 s.testActionsPermissionDenied(c, s.uniter) 221 } 222 223 func (s *uniterV1Suite) TestFinishActionsSuccess(c *gc.C) { 224 s.testFinishActionsSuccess(c, s.uniter) 225 } 226 227 func (s *uniterV1Suite) TestFinishActionsFailure(c *gc.C) { 228 s.testFinishActionsFailure(c, s.uniter) 229 } 230 231 func (s *uniterV1Suite) TestFinishActionsAuthAccess(c *gc.C) { 232 s.testFinishActionsAuthAccess(c, s.uniter) 233 } 234 235 func (s *uniterV1Suite) TestBeginActions(c *gc.C) { 236 s.testBeginActions(c, s.uniter) 237 } 238 239 func (s *uniterV1Suite) TestRelation(c *gc.C) { 240 s.testRelation(c, s.uniter) 241 } 242 243 func (s *uniterV1Suite) TestRelationById(c *gc.C) { 244 s.testRelationById(c, s.uniter) 245 } 246 247 func (s *uniterV1Suite) TestProviderType(c *gc.C) { 248 s.testProviderType(c, s.uniter) 249 } 250 251 func (s *uniterV1Suite) TestEnterScope(c *gc.C) { 252 s.testEnterScope(c, s.uniter) 253 } 254 255 func (s *uniterV1Suite) TestLeaveScope(c *gc.C) { 256 s.testLeaveScope(c, s.uniter) 257 } 258 259 func (s *uniterV1Suite) TestJoinedRelations(c *gc.C) { 260 s.testJoinedRelations(c, s.uniter) 261 } 262 263 func (s *uniterV1Suite) TestReadSettings(c *gc.C) { 264 s.testReadSettings(c, s.uniter) 265 } 266 267 func (s *uniterV1Suite) TestReadSettingsWithNonStringValuesFails(c *gc.C) { 268 s.testReadSettingsWithNonStringValuesFails(c, s.uniter) 269 } 270 271 func (s *uniterV1Suite) TestReadRemoteSettings(c *gc.C) { 272 s.testReadRemoteSettings(c, s.uniter) 273 } 274 275 func (s *uniterV1Suite) TestReadRemoteSettingsWithNonStringValuesFails(c *gc.C) { 276 s.testReadRemoteSettingsWithNonStringValuesFails(c, s.uniter) 277 } 278 279 func (s *uniterV1Suite) TestUpdateSettings(c *gc.C) { 280 s.testUpdateSettings(c, s.uniter) 281 } 282 283 func (s *uniterV1Suite) TestWatchRelationUnits(c *gc.C) { 284 s.testWatchRelationUnits(c, s.uniter) 285 } 286 287 func (s *uniterV1Suite) TestAPIAddresses(c *gc.C) { 288 s.testAPIAddresses(c, s.uniter) 289 } 290 291 func (s *uniterV1Suite) TestWatchUnitAddresses(c *gc.C) { 292 s.testWatchUnitAddresses(c, s.uniter) 293 } 294 295 func (s *uniterV1Suite) TestGetMeterStatus(c *gc.C) { 296 s.testGetMeterStatus(c, s.uniter) 297 } 298 299 func (s *uniterV1Suite) TestGetMeterStatusUnauthenticated(c *gc.C) { 300 s.testGetMeterStatusUnauthenticated(c, s.uniter) 301 } 302 303 func (s *uniterV1Suite) TestGetMeterStatusBadTag(c *gc.C) { 304 s.testGetMeterStatusBadTag(c, s.uniter) 305 } 306 307 func (s *uniterV1Suite) TestWatchMeterStatus(c *gc.C) { 308 s.testWatchMeterStatus(c, s.uniter) 309 } 310 311 func (s *uniterV1Suite) TestGetOwnerTagV1NotImplemented(c *gc.C) { 312 apiservertesting.AssertNotImplemented(c, s.uniter, "GetOwnerTag") 313 } 314 315 func (s *uniterV1Suite) TestServiceOwner(c *gc.C) { 316 args := params.Entities{Entities: []params.Entity{ 317 {Tag: "unit-mysql-0"}, 318 {Tag: "service-wordpress"}, 319 {Tag: "unit-wordpress-0"}, 320 {Tag: "unit-foo-42"}, 321 {Tag: "machine-0"}, 322 {Tag: "service-foo"}, 323 }} 324 result, err := s.uniter.ServiceOwner(args) 325 c.Assert(err, jc.ErrorIsNil) 326 c.Assert(result, jc.DeepEquals, params.StringResults{ 327 Results: []params.StringResult{ 328 {Error: apiservertesting.ErrUnauthorized}, 329 {Result: s.AdminUserTag(c).String()}, 330 {Error: apiservertesting.ErrUnauthorized}, 331 {Error: apiservertesting.ErrUnauthorized}, 332 {Error: apiservertesting.ErrUnauthorized}, 333 {Error: apiservertesting.ErrUnauthorized}, 334 }, 335 }) 336 } 337 338 func (s *uniterV1Suite) TestAssignedMachine(c *gc.C) { 339 args := params.Entities{Entities: []params.Entity{ 340 {Tag: "unit-mysql-0"}, 341 {Tag: "unit-wordpress-0"}, 342 {Tag: "unit-foo-42"}, 343 {Tag: "service-mysql"}, 344 {Tag: "service-wordpress"}, 345 {Tag: "machine-0"}, 346 {Tag: "machine-1"}, 347 {Tag: "machine-42"}, 348 {Tag: "service-foo"}, 349 {Tag: "relation-svc1.rel1#svc2.rel2"}, 350 }} 351 result, err := s.uniter.AssignedMachine(args) 352 c.Assert(err, jc.ErrorIsNil) 353 c.Assert(result, jc.DeepEquals, params.StringResults{ 354 Results: []params.StringResult{ 355 {Error: apiservertesting.ErrUnauthorized}, 356 {Result: "machine-0"}, 357 {Error: apiservertesting.ErrUnauthorized}, 358 {Error: apiservertesting.ErrUnauthorized}, 359 {Error: apiservertesting.ErrUnauthorized}, 360 {Error: apiservertesting.ErrUnauthorized}, 361 {Error: apiservertesting.ErrUnauthorized}, 362 {Error: apiservertesting.ErrUnauthorized}, 363 {Error: apiservertesting.ErrUnauthorized}, 364 {Error: apiservertesting.ErrUnauthorized}, 365 }, 366 }) 367 } 368 369 func (s *uniterV1Suite) TestAllMachinePorts(c *gc.C) { 370 // Verify no ports are opened yet on the machine or unit. 371 machinePorts, err := s.machine0.AllPorts() 372 c.Assert(err, jc.ErrorIsNil) 373 c.Assert(machinePorts, gc.HasLen, 0) 374 unitPorts, err := s.wordpressUnit.OpenedPorts() 375 c.Assert(err, jc.ErrorIsNil) 376 c.Assert(unitPorts, gc.HasLen, 0) 377 378 // Add another mysql unit on machine 0. 379 mysqlUnit1, err := s.mysql.AddUnit() 380 c.Assert(err, jc.ErrorIsNil) 381 err = mysqlUnit1.AssignToMachine(s.machine0) 382 c.Assert(err, jc.ErrorIsNil) 383 384 // Open some ports on both units. 385 err = s.wordpressUnit.OpenPorts("tcp", 100, 200) 386 c.Assert(err, jc.ErrorIsNil) 387 err = s.wordpressUnit.OpenPorts("udp", 10, 20) 388 c.Assert(err, jc.ErrorIsNil) 389 err = mysqlUnit1.OpenPorts("tcp", 201, 250) 390 c.Assert(err, jc.ErrorIsNil) 391 err = mysqlUnit1.OpenPorts("udp", 1, 8) 392 c.Assert(err, jc.ErrorIsNil) 393 394 args := params.Entities{Entities: []params.Entity{ 395 {Tag: "unit-mysql-0"}, 396 {Tag: "machine-0"}, 397 {Tag: "machine-1"}, 398 {Tag: "unit-foo-42"}, 399 {Tag: "machine-42"}, 400 {Tag: "service-wordpress"}, 401 }} 402 expectPorts := []params.MachinePortRange{ 403 {UnitTag: "unit-wordpress-0", PortRange: params.PortRange{100, 200, "tcp"}}, 404 {UnitTag: "unit-mysql-1", PortRange: params.PortRange{201, 250, "tcp"}}, 405 {UnitTag: "unit-mysql-1", PortRange: params.PortRange{1, 8, "udp"}}, 406 {UnitTag: "unit-wordpress-0", PortRange: params.PortRange{10, 20, "udp"}}, 407 } 408 result, err := s.uniter.AllMachinePorts(args) 409 c.Assert(err, jc.ErrorIsNil) 410 c.Assert(result, gc.DeepEquals, params.MachinePortsResults{ 411 Results: []params.MachinePortsResult{ 412 {Error: apiservertesting.ErrUnauthorized}, 413 {Ports: expectPorts}, 414 {Error: apiservertesting.ErrUnauthorized}, 415 {Error: apiservertesting.ErrUnauthorized}, 416 {Error: apiservertesting.ErrUnauthorized}, 417 {Error: apiservertesting.ErrUnauthorized}, 418 }, 419 }) 420 } 421 422 func (s *uniterV1Suite) TestRequestReboot(c *gc.C) { 423 args := params.Entities{Entities: []params.Entity{ 424 {Tag: s.machine0.Tag().String()}, 425 {Tag: s.machine1.Tag().String()}, 426 {Tag: "bogus"}, 427 {Tag: "nasty-tag"}, 428 }} 429 errResult, err := s.uniter.RequestReboot(args) 430 c.Assert(err, jc.ErrorIsNil) 431 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 432 Results: []params.ErrorResult{ 433 {Error: nil}, 434 {Error: apiservertesting.ErrUnauthorized}, 435 {Error: apiservertesting.ErrUnauthorized}, 436 {Error: apiservertesting.ErrUnauthorized}, 437 }}) 438 439 rFlag, err := s.machine0.GetRebootFlag() 440 c.Assert(err, jc.ErrorIsNil) 441 c.Assert(rFlag, jc.IsTrue) 442 443 rFlag, err = s.machine1.GetRebootFlag() 444 c.Assert(err, jc.ErrorIsNil) 445 c.Assert(rFlag, jc.IsFalse) 446 }