github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/juju/deploy_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package juju_test 5 6 import ( 7 "fmt" 8 stdtesting "testing" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils/set" 13 gc "gopkg.in/check.v1" 14 "gopkg.in/juju/charm.v5" 15 "gopkg.in/juju/charm.v5/charmrepo" 16 17 "github.com/juju/juju/constraints" 18 "github.com/juju/juju/instance" 19 "github.com/juju/juju/juju" 20 "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/state" 22 "github.com/juju/juju/testcharms" 23 coretesting "github.com/juju/juju/testing" 24 "github.com/juju/juju/testing/factory" 25 ) 26 27 func Test(t *stdtesting.T) { 28 coretesting.MgoTestPackage(t) 29 } 30 31 // DeployLocalSuite uses a fresh copy of the same local dummy charm for each 32 // test, because DeployService demands that a charm already exists in state, 33 // and that's is the simplest way to get one in there. 34 type DeployLocalSuite struct { 35 testing.JujuConnSuite 36 repo charmrepo.Interface 37 charm *state.Charm 38 oldCacheDir string 39 } 40 41 var _ = gc.Suite(&DeployLocalSuite{}) 42 43 func (s *DeployLocalSuite) SetUpSuite(c *gc.C) { 44 s.JujuConnSuite.SetUpSuite(c) 45 s.repo = &charmrepo.LocalRepository{Path: testcharms.Repo.Path()} 46 s.oldCacheDir, charmrepo.CacheDir = charmrepo.CacheDir, c.MkDir() 47 } 48 49 func (s *DeployLocalSuite) TearDownSuite(c *gc.C) { 50 charmrepo.CacheDir = s.oldCacheDir 51 s.JujuConnSuite.TearDownSuite(c) 52 } 53 54 func (s *DeployLocalSuite) SetUpTest(c *gc.C) { 55 s.JujuConnSuite.SetUpTest(c) 56 curl := charm.MustParseURL("local:quantal/dummy") 57 charm, err := testing.PutCharm(s.State, curl, s.repo, false) 58 c.Assert(err, jc.ErrorIsNil) 59 s.charm = charm 60 } 61 62 func (s *DeployLocalSuite) TestDeployMinimal(c *gc.C) { 63 service, err := juju.DeployService(s.State, 64 juju.DeployServiceParams{ 65 ServiceName: "bob", 66 Charm: s.charm, 67 }) 68 c.Assert(err, jc.ErrorIsNil) 69 s.assertCharm(c, service, s.charm.URL()) 70 s.assertSettings(c, service, charm.Settings{}) 71 s.assertConstraints(c, service, constraints.Value{}) 72 s.assertMachines(c, service, constraints.Value{}) 73 c.Assert(service.GetOwnerTag(), gc.Equals, s.AdminUserTag(c).String()) 74 } 75 76 func (s *DeployLocalSuite) TestDeployOwnerTag(c *gc.C) { 77 s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 78 service, err := juju.DeployService(s.State, 79 juju.DeployServiceParams{ 80 ServiceName: "bobwithowner", 81 Charm: s.charm, 82 ServiceOwner: "user-foobar", 83 }) 84 c.Assert(err, jc.ErrorIsNil) 85 c.Assert(service.GetOwnerTag(), gc.Equals, "user-foobar") 86 } 87 88 func (s *DeployLocalSuite) TestDeploySettings(c *gc.C) { 89 service, err := juju.DeployService(s.State, 90 juju.DeployServiceParams{ 91 ServiceName: "bob", 92 Charm: s.charm, 93 ConfigSettings: charm.Settings{ 94 "title": "banana cupcakes", 95 "skill-level": 9901, 96 }, 97 }) 98 c.Assert(err, jc.ErrorIsNil) 99 s.assertSettings(c, service, charm.Settings{ 100 "title": "banana cupcakes", 101 "skill-level": int64(9901), 102 }) 103 } 104 105 func (s *DeployLocalSuite) TestDeploySettingsError(c *gc.C) { 106 _, err := juju.DeployService(s.State, 107 juju.DeployServiceParams{ 108 ServiceName: "bob", 109 Charm: s.charm, 110 ConfigSettings: charm.Settings{ 111 "skill-level": 99.01, 112 }, 113 }) 114 c.Assert(err, gc.ErrorMatches, `option "skill-level" expected int, got 99.01`) 115 _, err = s.State.Service("bob") 116 c.Assert(err, jc.Satisfies, errors.IsNotFound) 117 } 118 119 func (s *DeployLocalSuite) TestDeployConstraints(c *gc.C) { 120 err := s.State.SetEnvironConstraints(constraints.MustParse("mem=2G")) 121 c.Assert(err, jc.ErrorIsNil) 122 serviceCons := constraints.MustParse("cpu-cores=2") 123 service, err := juju.DeployService(s.State, 124 juju.DeployServiceParams{ 125 ServiceName: "bob", 126 Charm: s.charm, 127 Constraints: serviceCons, 128 }) 129 c.Assert(err, jc.ErrorIsNil) 130 s.assertConstraints(c, service, serviceCons) 131 } 132 133 func (s *DeployLocalSuite) TestDeployNumUnits(c *gc.C) { 134 err := s.State.SetEnvironConstraints(constraints.MustParse("mem=2G")) 135 c.Assert(err, jc.ErrorIsNil) 136 serviceCons := constraints.MustParse("cpu-cores=2") 137 service, err := juju.DeployService(s.State, 138 juju.DeployServiceParams{ 139 ServiceName: "bob", 140 Charm: s.charm, 141 Constraints: serviceCons, 142 NumUnits: 2, 143 }) 144 c.Assert(err, jc.ErrorIsNil) 145 s.assertConstraints(c, service, serviceCons) 146 s.assertMachines(c, service, constraints.MustParse("mem=2G cpu-cores=2"), "0", "1") 147 } 148 149 func (s *DeployLocalSuite) TestDeployWithForceMachineRejectsTooManyUnits(c *gc.C) { 150 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 151 c.Assert(err, jc.ErrorIsNil) 152 c.Assert(machine.Id(), gc.Equals, "0") 153 _, err = juju.DeployService(s.State, 154 juju.DeployServiceParams{ 155 ServiceName: "bob", 156 Charm: s.charm, 157 NumUnits: 2, 158 ToMachineSpec: "0", 159 }) 160 c.Assert(err, gc.ErrorMatches, "cannot use --num-units with --to") 161 } 162 163 func (s *DeployLocalSuite) TestDeployForceMachineId(c *gc.C) { 164 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 165 c.Assert(err, jc.ErrorIsNil) 166 c.Assert(machine.Id(), gc.Equals, "0") 167 err = s.State.SetEnvironConstraints(constraints.MustParse("mem=2G")) 168 c.Assert(err, jc.ErrorIsNil) 169 serviceCons := constraints.MustParse("cpu-cores=2") 170 service, err := juju.DeployService(s.State, 171 juju.DeployServiceParams{ 172 ServiceName: "bob", 173 Charm: s.charm, 174 Constraints: serviceCons, 175 NumUnits: 1, 176 ToMachineSpec: "0", 177 }) 178 c.Assert(err, jc.ErrorIsNil) 179 s.assertConstraints(c, service, serviceCons) 180 s.assertMachines(c, service, constraints.Value{}, "0") 181 } 182 183 func (s *DeployLocalSuite) TestDeployForceMachineIdWithContainer(c *gc.C) { 184 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 185 c.Assert(err, jc.ErrorIsNil) 186 c.Assert(machine.Id(), gc.Equals, "0") 187 envCons := constraints.MustParse("mem=2G") 188 err = s.State.SetEnvironConstraints(envCons) 189 c.Assert(err, jc.ErrorIsNil) 190 serviceCons := constraints.MustParse("cpu-cores=2") 191 service, err := juju.DeployService(s.State, 192 juju.DeployServiceParams{ 193 ServiceName: "bob", 194 Charm: s.charm, 195 Constraints: serviceCons, 196 NumUnits: 1, 197 ToMachineSpec: fmt.Sprintf("%s:0", instance.LXC), 198 }) 199 c.Assert(err, jc.ErrorIsNil) 200 s.assertConstraints(c, service, serviceCons) 201 units, err := service.AllUnits() 202 c.Assert(err, jc.ErrorIsNil) 203 c.Assert(units, gc.HasLen, 1) 204 205 // The newly created container will use the constraints. 206 id, err := units[0].AssignedMachineId() 207 c.Assert(err, jc.ErrorIsNil) 208 machine, err = s.State.Machine(id) 209 c.Assert(err, jc.ErrorIsNil) 210 machineCons, err := machine.Constraints() 211 c.Assert(err, jc.ErrorIsNil) 212 unitCons, err := units[0].Constraints() 213 c.Assert(err, jc.ErrorIsNil) 214 c.Assert(machineCons, gc.DeepEquals, *unitCons) 215 } 216 217 func (s *DeployLocalSuite) assertCharm(c *gc.C, service *state.Service, expect *charm.URL) { 218 curl, force := service.CharmURL() 219 c.Assert(curl, gc.DeepEquals, expect) 220 c.Assert(force, jc.IsFalse) 221 } 222 223 func (s *DeployLocalSuite) assertSettings(c *gc.C, service *state.Service, expect charm.Settings) { 224 settings, err := service.ConfigSettings() 225 c.Assert(err, jc.ErrorIsNil) 226 c.Assert(settings, gc.DeepEquals, expect) 227 } 228 229 func (s *DeployLocalSuite) assertConstraints(c *gc.C, service *state.Service, expect constraints.Value) { 230 cons, err := service.Constraints() 231 c.Assert(err, jc.ErrorIsNil) 232 c.Assert(cons, gc.DeepEquals, expect) 233 } 234 235 func (s *DeployLocalSuite) assertMachines(c *gc.C, service *state.Service, expectCons constraints.Value, expectIds ...string) { 236 units, err := service.AllUnits() 237 c.Assert(err, jc.ErrorIsNil) 238 c.Assert(units, gc.HasLen, len(expectIds)) 239 unseenIds := set.NewStrings(expectIds...) 240 for _, unit := range units { 241 id, err := unit.AssignedMachineId() 242 c.Assert(err, jc.ErrorIsNil) 243 unseenIds.Remove(id) 244 machine, err := s.State.Machine(id) 245 c.Assert(err, jc.ErrorIsNil) 246 cons, err := machine.Constraints() 247 c.Assert(err, jc.ErrorIsNil) 248 c.Assert(cons, gc.DeepEquals, expectCons) 249 } 250 c.Assert(unseenIds, gc.DeepEquals, set.NewStrings()) 251 }