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