25
24
"github.com/juju/juju/environs"
26
25
"github.com/juju/juju/environs/bootstrap"
27
26
"github.com/juju/juju/environs/config"
27
"github.com/juju/juju/environs/tags"
28
28
envjujutesting "github.com/juju/juju/environs/testing"
29
29
envtools "github.com/juju/juju/environs/tools"
30
30
"github.com/juju/juju/instance"
31
31
jujutesting "github.com/juju/juju/juju/testing"
32
32
"github.com/juju/juju/network"
33
"github.com/juju/juju/provider/common"
34
33
coretesting "github.com/juju/juju/testing"
70
69
c.Assert(env, gc.NotNil)
73
func (suite *maas2EnvironSuite) injectControllerWithSpacesAndCheck(c *gc.C, spaces []gomaasapi.Space, expected gomaasapi.AllocateMachineArgs) *maasEnviron {
72
func (suite *maas2EnvironSuite) injectControllerWithSpacesAndCheck(c *gc.C, spaces []gomaasapi.Space, expected gomaasapi.AllocateMachineArgs) (*maasEnviron, *fakeController) {
74
73
var env *maasEnviron
75
74
check := func(args gomaasapi.AllocateMachineArgs) {
76
75
expected.AgentName = env.Config().UUID()
311
310
func (suite *maas2EnvironSuite) TestStartInstance(c *gc.C) {
312
env := suite.injectControllerWithSpacesAndCheck(c, nil, gomaasapi.AllocateMachineArgs{})
311
env, _ := suite.injectControllerWithSpacesAndCheck(c, nil, gomaasapi.AllocateMachineArgs{})
314
313
params := environs.StartInstanceParams{ControllerUUID: suite.controllerUUID}
315
314
result, err := jujutesting.StartInstanceWithParams(env, "1", params)
317
316
c.Assert(result.Instance.Id(), gc.Equals, instance.Id("Bruce Sterling"))
319
func (suite *maas2EnvironSuite) TestStartInstanceAppliesResourceTags(c *gc.C) {
320
env, controller := suite.injectControllerWithSpacesAndCheck(c, nil, gomaasapi.AllocateMachineArgs{})
321
config := env.Config()
322
_, ok := config.ResourceTags()
323
c.Assert(ok, jc.IsTrue)
324
params := environs.StartInstanceParams{ControllerUUID: suite.controllerUUID}
325
_, err := jujutesting.StartInstanceWithParams(env, "1", params)
326
c.Assert(err, jc.ErrorIsNil)
328
machine := controller.allocateMachine.(*fakeMachine)
329
machine.CheckCallNames(c, "Start", "SetOwnerData")
330
c.Assert(machine.Calls()[1].Args[0], gc.DeepEquals, map[string]string{
332
tags.JujuController: suite.controllerUUID,
333
tags.JujuModel: config.UUID(),
320
337
func (suite *maas2EnvironSuite) TestStartInstanceParams(c *gc.C) {
321
338
var env *maasEnviron
322
339
suite.injectController(&fakeController{
371
388
Tags: []string{"tag1", "tag3"},
372
389
NotTags: []string{"tag2", "tag4"},
374
env = suite.injectControllerWithSpacesAndCheck(c, nil, expected)
391
env, _ = suite.injectControllerWithSpacesAndCheck(c, nil, expected)
375
392
_, err := env.acquireNode2(
377
394
constraints.Value{Tags: stringslicep("tag1", "^tag2", "tag3", "^tag4")},
414
430
{Label: "1", Space: "7"},
417
env := suite.injectControllerWithSpacesAndCheck(c, getFourSpaces(), expected)
433
env, _ := suite.injectControllerWithSpacesAndCheck(c, getFourSpaces(), expected)
419
435
_, err := env.acquireNode2(
427
443
func (suite *maas2EnvironSuite) TestAcquireNodeDisambiguatesNamedLabelsFromIndexedUpToALimit(c *gc.C) {
428
env := suite.injectControllerWithSpacesAndCheck(c, getFourSpaces(), gomaasapi.AllocateMachineArgs{})
444
env, _ := suite.injectControllerWithSpacesAndCheck(c, getFourSpaces(), gomaasapi.AllocateMachineArgs{})
429
445
var shortLimit uint = 0
430
446
suite.PatchValue(&numericLabelLimit, shortLimit)
624
640
NotSpace: []string{"3"},
625
641
Interfaces: []gomaasapi.InterfaceSpec{{Label: "0", Space: "2"}},
627
env := suite.injectControllerWithSpacesAndCheck(c, getTwoSpaces(), expected)
643
env, _ := suite.injectControllerWithSpacesAndCheck(c, getTwoSpaces(), expected)
628
644
cons := constraints.Value{
629
645
Spaces: stringslicep("foo", "^bar"),
637
653
NotSpace: []string{"3"},
638
654
Interfaces: []gomaasapi.InterfaceSpec{{Label: "0", Space: "2"}},
640
env := suite.injectControllerWithSpacesAndCheck(c, getTwoSpaces(), expected)
656
env, _ := suite.injectControllerWithSpacesAndCheck(c, getTwoSpaces(), expected)
641
657
cons := constraints.Value{
642
658
Spaces: stringslicep("foo-1", "^bar-3"),
1253
1269
suite.assertAllocateContainerAddressesFails(c, controller, nil, "cannot find primary interface for container")
1256
func (suite *maas2EnvironSuite) TestAllocateContainerAddressesPrimaryInterfaceSubnetMissing(c *gc.C) {
1257
controller := &fakeController{}
1258
prepared := []network.InterfaceInfo{{InterfaceName: "eth0"}}
1259
errorMatches := "primary NIC subnet not found"
1260
suite.assertAllocateContainerAddressesFails(c, controller, prepared, errorMatches)
1263
1272
func makeFakeSubnet(id int) fakeSubnet {
1264
1273
return fakeSubnet{
1344
1353
c.Assert(maasArgs, jc.DeepEquals, expected)
1347
func (suite *maas2EnvironSuite) TestAllocateContainerAddressesSecondNICSubnetMissing(c *gc.C) {
1356
func (suite *maas2EnvironSuite) TestAllocateContainerAddressesSubnetMissing(c *gc.C) {
1348
1357
subnet := makeFakeSubnet(3)
1349
1358
var env *maasEnviron
1350
1359
device := &fakeDevice{
1351
interfaceSet: []gomaasapi.Interface{&fakeInterface{}},
1360
Stub: &testing.Stub{},
1361
interfaceSet: []gomaasapi.Interface{
1367
macAddress: "53:54:00:70:9b:ff",
1368
vlan: &fakeVLAN{vid: 0},
1369
links: []gomaasapi.Link{
1375
parents: []string{},
1376
children: []string{},
1377
Stub: &testing.Stub{},
1380
interface_: &fakeInterface{
1385
macAddress: "53:54:00:70:9b:f1",
1386
vlan: &fakeVLAN{vid: 0},
1387
links: []gomaasapi.Link{
1393
parents: []string{},
1394
children: []string{},
1395
Stub: &testing.Stub{},
1354
1399
machine := &fakeMachine{
1355
1400
Stub: &testing.Stub{},
1365
1411
subnets: []gomaasapi.Subnet{subnet},
1414
devices: []gomaasapi.Device{device},
1369
1416
suite.injectController(controller)
1370
1417
env = suite.makeEnviron(c, nil)
1371
1418
prepared := []network.InterfaceInfo{
1372
{InterfaceName: "eth0", CIDR: "10.20.19.0/24", MACAddress: "DEADBEEF"},
1373
{InterfaceName: "eth1", CIDR: "10.20.20.0/24", MACAddress: "DEADBEEE"},
1419
{InterfaceName: "eth0", CIDR: "", MACAddress: "DEADBEEF"},
1420
{InterfaceName: "eth1", CIDR: "", MACAddress: "DEADBEEE"},
1375
1422
ignored := names.NewMachineTag("1/lxd/0")
1376
_, err := env.AllocateContainerAddresses(instance.Id("1"), ignored, prepared)
1377
c.Assert(err, gc.ErrorMatches, "NIC eth1 subnet 10.20.20.0/24 not found")
1423
allocated, err := env.AllocateContainerAddresses(instance.Id("1"), ignored, prepared)
1424
c.Assert(err, jc.ErrorIsNil)
1425
c.Assert(allocated, jc.DeepEquals, []network.InterfaceInfo{{
1426
MACAddress: "53:54:00:70:9b:ff",
1428
ProviderVLANId: "0",
1430
InterfaceName: "eth0",
1431
InterfaceType: "ethernet",
1434
ConfigType: "manual",
1437
MACAddress: "53:54:00:70:9b:f1",
1439
ProviderVLANId: "0",
1441
InterfaceName: "eth1",
1442
InterfaceType: "ethernet",
1445
ConfigType: "manual",
1380
1450
func (suite *maas2EnvironSuite) TestAllocateContainerAddressesCreateInterfaceError(c *gc.C) {
1450
1521
subnets: []gomaasapi.Subnet{subnet, subnet2},
1524
devices: []gomaasapi.Device{device},
1454
1526
suite.injectController(controller)
1455
1527
env = suite.makeEnviron(c, nil)
1458
1530
{InterfaceName: "eth1", CIDR: "10.20.20.0/24", MACAddress: "DEADBEEE"},
1460
1532
ignored := names.NewMachineTag("1/lxd/0")
1461
_, err := env.AllocateContainerAddresses(instance.Id("1"), ignored, prepared)
1462
c.Assert(err, gc.ErrorMatches, "cannot link device interface to subnet: boom")
1533
allocated, err := env.AllocateContainerAddresses(instance.Id("1"), ignored, prepared)
1534
c.Assert(err, jc.ErrorIsNil)
1535
c.Assert(allocated, jc.DeepEquals, []network.InterfaceInfo{{
1538
ProviderSubnetId: "",
1539
ProviderVLANId: "0",
1542
InterfaceType: "ethernet",
1550
ProviderSubnetId: "",
1551
ProviderVLANId: "0",
1554
InterfaceType: "ethernet",
1463
1561
args := getArgs(c, interface_.Calls())
1464
1562
maasArgs, ok := args.(gomaasapi.LinkSubnetArgs)
1465
1563
c.Assert(ok, jc.IsTrue)
1503
1601
c.Assert(err, jc.ErrorIsNil)
1505
machine.Stub.CheckCallNames(c, "Start")
1506
controller.Stub.CheckCallNames(c, "GetFile", "AddFile")
1507
addFileArgs, ok := controller.Stub.Calls()[1].Args[0].(gomaasapi.AddFileArgs)
1603
machine.Stub.CheckCallNames(c, "Start", "SetOwnerData")
1604
ownerData, ok := machine.Stub.Calls()[1].Args[0].(map[string]string)
1508
1605
c.Assert(ok, jc.IsTrue)
1510
// Make it look like the right state was written to the file.
1511
buffer := new(bytes.Buffer)
1512
buffer.ReadFrom(addFileArgs.Reader)
1513
file.contents = buffer.Bytes()
1514
c.Check(string(buffer.Bytes()), gc.Equals, "state-instances:\n- gus\n")
1606
c.Assert(ownerData, gc.DeepEquals, map[string]string{
1608
tags.JujuController: suite.controllerUUID,
1609
tags.JujuIsController: "true",
1610
tags.JujuModel: env.Config().UUID(),
1516
1613
// Test the instance id is correctly recorded for the bootstrap node.
1517
1614
// Check that ControllerInstances returns the id of the bootstrap machine.
1533
1630
instance, hc := jujutesting.AssertStartInstance(c, env, suite.controllerUUID, "1")
1534
1631
c.Check(instance, gc.NotNil)
1535
1632
c.Assert(hc, gc.NotNil)
1536
c.Check(hc.String(), gc.Equals, fmt.Sprintf("arch=%s cpu-cores=1 mem=1024M availability-zone=test_zone", arch.HostArch()))
1633
c.Check(hc.String(), gc.Equals, fmt.Sprintf("arch=%s cores=1 mem=1024M availability-zone=test_zone", arch.HostArch()))
1538
node1.Stub.CheckCallNames(c, "Start")
1635
node1.Stub.CheckCallNames(c, "Start", "SetOwnerData")
1539
1636
startArgs, ok := node1.Stub.Calls()[0].Args[0].(gomaasapi.StartArgs)
1540
1637
c.Assert(ok, jc.IsTrue)
1563
1660
_, err := env.ControllerInstances(suite.controllerUUID)
1564
1661
c.Assert(err, gc.Equals, environs.ErrNotBootstrapped)
1566
tests := [][]instance.Id{{}, {"inst-0"}, {"inst-0", "inst-1"}}
1663
controller.machinesArgsCheck = func(args gomaasapi.MachinesArgs) {
1664
c.Assert(args, gc.DeepEquals, gomaasapi.MachinesArgs{
1665
OwnerData: map[string]string{
1666
tags.JujuIsController: "true",
1667
tags.JujuController: suite.controllerUUID,
1672
tests := [][]instance.Id{{"inst-0"}, {"inst-0", "inst-1"}}
1567
1673
for _, expected := range tests {
1568
state, err := goyaml.Marshal(&common.BootstrapState{StateInstances: expected})
1569
c.Assert(err, jc.ErrorIsNil)
1571
controller.files = []gomaasapi.File{&fakeFile{
1572
name: coretesting.ModelTag.Id() + "-provider-state",
1674
controller.machines = make([]gomaasapi.Machine, len(expected))
1675
for i := range expected {
1676
controller.machines[i] = newFakeMachine(string(expected[i]), "", "")
1575
1678
controllerInstances, err := env.ControllerInstances(suite.controllerUUID)
1576
1679
c.Assert(err, jc.ErrorIsNil)
1577
1680
c.Assert(controllerInstances, jc.SameContents, expected)
1581
func (suite *maas2EnvironSuite) TestControllerInstancesFailsIfNoStateInstances(c *gc.C) {
1582
env := suite.makeEnviron(c,
1583
newFakeControllerWithErrors(gomaasapi.NewNoMatchError("state")))
1584
_, err := env.ControllerInstances(suite.controllerUUID)
1585
c.Check(err, gc.Equals, environs.ErrNotBootstrapped)
1588
1684
func (suite *maas2EnvironSuite) TestDestroy(c *gc.C) {
1589
1685
file1 := &fakeFile{name: coretesting.ModelTag.Id() + "-provider-state"}
1590
1686
file2 := &fakeFile{name: coretesting.ModelTag.Id() + "-horace"}