453
452
err = host.SupportsNoContainers()
454
453
c.Assert(err, gc.IsNil)
456
params := state.AddMachineParams{
458
ContainerType: instance.LXC,
460
Jobs: []state.MachineJob{state.JobHostUnits},
462
_, err = s.State.AddMachineWithConstraints(¶ms)
463
c.Assert(err, gc.ErrorMatches, "cannot add a new container: machine 0 cannot host lxc containers")
455
_, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
457
Jobs: []state.MachineJob{state.JobHostUnits},
458
}, "0", instance.LXC)
459
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: machine 0 cannot host lxc containers")
464
460
s.assertMachineContainers(c, host, nil)
467
func (s *StateSuite) TestAddContainerWithConstraints(c *gc.C) {
468
oneJob := []state.MachineJob{state.JobHostUnits}
469
cons := constraints.MustParse("mem=4G")
471
params := state.AddMachineParams{
473
ContainerType: instance.LXC,
478
params.InstanceId = "id"
479
m, err := s.State.AddMachineWithConstraints(¶ms)
480
c.Assert(err, gc.ErrorMatches, "cannot specify an instance id when adding a new machine")
481
params.InstanceId = ""
482
params.Nonce = "nonce"
483
m, err = s.State.AddMachineWithConstraints(¶ms)
484
c.Assert(err, gc.ErrorMatches, "cannot specify a nonce when adding a new machine")
486
m, err = s.State.AddMachineWithConstraints(¶ms)
487
c.Assert(err, gc.IsNil)
488
c.Assert(m.Id(), gc.Equals, "0/lxc/0")
489
c.Assert(m.Series(), gc.Equals, "quantal")
490
c.Assert(m.ContainerType(), gc.Equals, instance.LXC)
491
c.Assert(m.Jobs(), gc.DeepEquals, oneJob)
492
mcons, err := m.Constraints()
493
c.Assert(err, gc.IsNil)
494
c.Assert(cons, gc.DeepEquals, mcons)
463
func (s *StateSuite) TestInvalidAddMachineParams(c *gc.C) {
464
instIdTemplate := state.MachineTemplate{
466
Jobs: []state.MachineJob{state.JobHostUnits},
469
normalTemplate := state.MachineTemplate{
471
Jobs: []state.MachineJob{state.JobHostUnits},
473
_, err := s.State.AddMachineInsideMachine(instIdTemplate, "0", instance.LXC)
474
c.Check(err, gc.ErrorMatches, "cannot add a new machine: cannot specify instance id for a new container")
476
_, err = s.State.AddMachineInsideNewMachine(instIdTemplate, normalTemplate, instance.LXC)
477
c.Check(err, gc.ErrorMatches, "cannot add a new machine: cannot specify instance id for a new container")
479
_, err = s.State.AddMachineInsideNewMachine(normalTemplate, instIdTemplate, instance.LXC)
480
c.Check(err, gc.ErrorMatches, "cannot add a new machine: cannot specify instance id for a new container")
482
_, err = s.State.AddOneMachine(instIdTemplate)
483
c.Check(err, gc.ErrorMatches, "cannot add a new machine: cannot add a machine with an instance id and no nonce")
485
_, err = s.State.AddOneMachine(state.MachineTemplate{
487
Jobs: []state.MachineJob{state.JobHostUnits, state.JobHostUnits},
490
c.Check(err, gc.ErrorMatches, fmt.Sprintf("cannot add a new machine: duplicate job: %s", state.JobHostUnits))
492
noSeriesTemplate := state.MachineTemplate{
493
Jobs: []state.MachineJob{state.JobHostUnits, state.JobHostUnits},
495
_, err = s.State.AddOneMachine(noSeriesTemplate)
496
c.Check(err, gc.ErrorMatches, "cannot add a new machine: no series specified")
498
_, err = s.State.AddMachineInsideNewMachine(noSeriesTemplate, normalTemplate, instance.LXC)
499
c.Check(err, gc.ErrorMatches, "cannot add a new machine: no series specified")
501
_, err = s.State.AddMachineInsideNewMachine(normalTemplate, noSeriesTemplate, instance.LXC)
502
c.Check(err, gc.ErrorMatches, "cannot add a new machine: no series specified")
504
_, err = s.State.AddMachineInsideMachine(noSeriesTemplate, "0", instance.LXC)
505
c.Check(err, gc.ErrorMatches, "cannot add a new machine: no series specified")
497
508
func (s *StateSuite) TestAddContainerErrors(c *gc.C) {
498
oneJob := []state.MachineJob{state.JobHostUnits}
500
params := state.AddMachineParams{
502
ContainerType: instance.LXC,
509
template := state.MachineTemplate{
511
Jobs: []state.MachineJob{state.JobHostUnits},
506
_, err := s.State.AddMachineWithConstraints(¶ms)
507
c.Assert(err, gc.ErrorMatches, "cannot add a new container: machine 10 not found")
508
params.ContainerType = ""
509
_, err = s.State.AddMachineWithConstraints(¶ms)
510
c.Assert(err, gc.ErrorMatches, "cannot add a new container: no container type specified")
513
_, err := s.State.AddMachineInsideMachine(template, "10", instance.LXC)
514
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: machine 10 not found")
515
_, err = s.State.AddMachineInsideMachine(template, "10", "")
516
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: no container type specified")
513
519
func (s *StateSuite) TestInjectMachineErrors(c *gc.C) {
514
injectMachine := func(series, instanceId, nonce string, jobs ...state.MachineJob) error {
515
params := &state.AddMachineParams{
516
InstanceId: instance.Id(instanceId),
520
injectMachine := func(series string, instanceId instance.Id, nonce string, jobs ...state.MachineJob) error {
521
_, err := s.State.AddOneMachine(state.MachineTemplate{
524
InstanceId: instanceId,
521
_, err := s.State.InjectMachine(params)
524
529
err := injectMachine("", "i-minvalid", state.BootstrapNonce, state.JobHostUnits)
525
530
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: no series specified")
526
531
err = injectMachine("quantal", "", state.BootstrapNonce, state.JobHostUnits)
527
c.Assert(err, gc.ErrorMatches, "cannot inject a machine without an instance id")
532
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: cannot specify a nonce without an instance id")
528
533
err = injectMachine("quantal", "i-minvalid", "", state.JobHostUnits)
529
c.Assert(err, gc.ErrorMatches, "cannot inject a machine without a nonce")
534
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: cannot add a machine with an instance id and no nonce")
530
535
err = injectMachine("quantal", state.BootstrapNonce, "i-mlazy")
531
536
c.Assert(err, gc.ErrorMatches, "cannot add a new machine: no jobs specified")
551
Jobs: []state.MachineJob{state.JobHostUnits, state.JobManageEnviron},
553
m, err := s.State.InjectMachine(params)
558
m, err := s.State.AddOneMachine(template)
554
559
c.Assert(err, gc.IsNil)
555
c.Assert(m.Jobs(), gc.DeepEquals, params.Jobs)
560
c.Assert(m.Jobs(), gc.DeepEquals, template.Jobs)
556
561
instanceId, err := m.InstanceId()
557
562
c.Assert(err, gc.IsNil)
558
c.Assert(instanceId, gc.Equals, params.InstanceId)
563
c.Assert(instanceId, gc.Equals, template.InstanceId)
559
564
mcons, err := m.Constraints()
560
565
c.Assert(err, gc.IsNil)
561
566
c.Assert(cons, gc.DeepEquals, mcons)
562
567
characteristics, err := m.HardwareCharacteristics()
563
568
c.Assert(err, gc.IsNil)
564
c.Assert(*characteristics, gc.DeepEquals, params.HardwareCharacteristics)
569
c.Assert(*characteristics, gc.DeepEquals, template.HardwareCharacteristics)
566
571
// Make sure the bootstrap nonce value is set.
567
c.Assert(m.CheckProvisioned(params.Nonce), gc.Equals, true)
572
c.Assert(m.CheckProvisioned(template.Nonce), gc.Equals, true)
570
575
func (s *StateSuite) TestAddContainerToInjectedMachine(c *gc.C) {
571
576
oneJob := []state.MachineJob{state.JobHostUnits}
572
params := state.AddMachineParams{
577
template := state.MachineTemplate{
573
578
Series: "quantal",
574
InstanceId: instance.Id("i-mindustrious"),
579
InstanceId: "i-mindustrious",
575
580
Nonce: state.BootstrapNonce,
576
581
Jobs: []state.MachineJob{state.JobHostUnits, state.JobManageEnviron},
578
m0, err := s.State.InjectMachine(¶ms)
583
m0, err := s.State.AddOneMachine(template)
579
584
c.Assert(err, gc.IsNil)
581
586
// Add first container.
582
params = state.AddMachineParams{
584
ContainerType: instance.LXC,
586
Jobs: []state.MachineJob{state.JobHostUnits},
587
template = state.MachineTemplate{
589
Jobs: []state.MachineJob{state.JobHostUnits},
588
m, err := s.State.AddMachineWithConstraints(¶ms)
591
m, err := s.State.AddMachineInsideMachine(template, "0", instance.LXC)
589
592
c.Assert(err, gc.IsNil)
590
593
c.Assert(m.Id(), gc.Equals, "0/lxc/0")
591
594
c.Assert(m.Series(), gc.Equals, "quantal")
1503
1509
m1, err := s.State.AddMachine("quantal", state.JobHostUnits)
1504
1510
c.Assert(err, gc.IsNil)
1505
1511
m2, err := s.State.Machine(m1.Id())
1506
c.Assert(m1, gc.DeepEquals, m2)
1512
c.Assert(m1, jc.DeepEquals, m2)
1508
1514
charm1 := s.AddTestingCharm(c, "wordpress")
1509
1515
charm2, err := s.State.Charm(charm1.URL())
1510
1516
c.Assert(err, gc.IsNil)
1511
c.Assert(charm1, gc.DeepEquals, charm2)
1517
c.Assert(charm1, jc.DeepEquals, charm2)
1513
1519
wordpress1 := s.AddTestingService(c, "wordpress", charm1)
1514
1520
wordpress2, err := s.State.Service("wordpress")
1515
1521
c.Assert(err, gc.IsNil)
1516
c.Assert(wordpress1, gc.DeepEquals, wordpress2)
1522
c.Assert(wordpress1, jc.DeepEquals, wordpress2)
1518
1524
unit1, err := wordpress1.AddUnit()
1519
1525
c.Assert(err, gc.IsNil)
1520
1526
unit2, err := s.State.Unit("wordpress/0")
1521
1527
c.Assert(err, gc.IsNil)
1522
c.Assert(unit1, gc.DeepEquals, unit2)
1528
c.Assert(unit1, jc.DeepEquals, unit2)
1524
1530
s.AddTestingService(c, "mysql", s.AddTestingCharm(c, "mysql"))
1525
1531
c.Assert(err, gc.IsNil)