github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/api/highavailability/client_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package highavailability_test 5 6 import ( 7 stdtesting "testing" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/api/highavailability" 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/constraints" 15 jujutesting "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 "github.com/juju/juju/state/presence" 18 coretesting "github.com/juju/juju/testing" 19 ) 20 21 func TestAll(t *stdtesting.T) { 22 coretesting.MgoTestPackage(t) 23 } 24 25 type clientSuite struct { 26 jujutesting.JujuConnSuite 27 } 28 29 var _ = gc.Suite(&clientSuite{}) 30 31 type Killer interface { 32 Kill() error 33 } 34 35 func assertKill(c *gc.C, killer Killer) { 36 c.Assert(killer.Kill(), gc.IsNil) 37 } 38 39 func setAgentPresence(c *gc.C, s *jujutesting.JujuConnSuite, machineId string) *presence.Pinger { 40 m, err := s.BackingState.Machine(machineId) 41 c.Assert(err, jc.ErrorIsNil) 42 pinger, err := m.SetAgentPresence() 43 c.Assert(err, jc.ErrorIsNil) 44 s.BackingState.StartSync() 45 err = m.WaitAgentPresence(coretesting.LongWait) 46 c.Assert(err, jc.ErrorIsNil) 47 return pinger 48 } 49 50 func assertEnsureAvailability(c *gc.C, s *jujutesting.JujuConnSuite) { 51 _, err := s.State.AddMachine("quantal", state.JobManageEnviron) 52 c.Assert(err, jc.ErrorIsNil) 53 // We have to ensure the agents are alive, or EnsureAvailability will 54 // create more to replace them. 55 pingerA := setAgentPresence(c, s, "0") 56 defer assertKill(c, pingerA) 57 58 emptyCons := constraints.Value{} 59 client := highavailability.NewClient(s.APIState) 60 result, err := client.EnsureAvailability(3, emptyCons, "", nil) 61 c.Assert(err, jc.ErrorIsNil) 62 63 c.Assert(result.Maintained, gc.DeepEquals, []string{"machine-0"}) 64 c.Assert(result.Added, gc.DeepEquals, []string{"machine-1", "machine-2"}) 65 c.Assert(result.Removed, gc.HasLen, 0) 66 67 machines, err := s.State.AllMachines() 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(machines, gc.HasLen, 3) 70 c.Assert(machines[0].Series(), gc.Equals, "quantal") 71 c.Assert(machines[1].Series(), gc.Equals, "quantal") 72 c.Assert(machines[2].Series(), gc.Equals, "quantal") 73 } 74 75 func (s *clientSuite) TestClientEnsureAvailability(c *gc.C) { 76 assertEnsureAvailability(c, &s.JujuConnSuite) 77 } 78 79 func (s *clientSuite) TestClientEnsureAvailabilityVersion(c *gc.C) { 80 client := highavailability.NewClient(s.APIState) 81 c.Assert(client.BestAPIVersion(), gc.Equals, 1) 82 } 83 84 type clientLegacySuite struct { 85 jujutesting.JujuConnSuite 86 } 87 88 var _ = gc.Suite(&clientLegacySuite{}) 89 90 func (s *clientLegacySuite) SetUpTest(c *gc.C) { 91 common.Facades.Discard("HighAvailability", 1) 92 s.JujuConnSuite.SetUpTest(c) 93 } 94 95 func (s *clientLegacySuite) TestEnsureAvailabilityLegacy(c *gc.C) { 96 assertEnsureAvailability(c, &s.JujuConnSuite) 97 } 98 99 func (s *clientLegacySuite) TestEnsureAvailabilityLegacyRejectsPlacement(c *gc.C) { 100 client := highavailability.NewClient(s.APIState) 101 _, err := client.EnsureAvailability(3, constraints.Value{}, "", []string{"machine"}) 102 c.Assert(err, gc.ErrorMatches, "placement directives not supported with this version of Juju") 103 }