github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/environs/manual/provisioner_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package manual_test
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  
    10  	jc "github.com/juju/testing/checkers"
    11  	"github.com/juju/utils/shell"
    12  	gc "launchpad.net/gocheck"
    13  
    14  	coreCloudinit "github.com/juju/juju/cloudinit"
    15  	"github.com/juju/juju/cloudinit/sshinit"
    16  	"github.com/juju/juju/environs/cloudinit"
    17  	"github.com/juju/juju/environs/manual"
    18  	envtesting "github.com/juju/juju/environs/testing"
    19  	"github.com/juju/juju/instance"
    20  	"github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/state"
    22  	"github.com/juju/juju/state/api/params"
    23  	"github.com/juju/juju/state/apiserver/client"
    24  	"github.com/juju/juju/version"
    25  )
    26  
    27  type provisionerSuite struct {
    28  	testing.JujuConnSuite
    29  }
    30  
    31  var _ = gc.Suite(&provisionerSuite{})
    32  
    33  func (s *provisionerSuite) getArgs(c *gc.C) manual.ProvisionMachineArgs {
    34  	hostname, err := os.Hostname()
    35  	c.Assert(err, gc.IsNil)
    36  	return manual.ProvisionMachineArgs{
    37  		Host:    hostname,
    38  		EnvName: "dummyenv",
    39  	}
    40  }
    41  
    42  func (s *provisionerSuite) TestProvisionMachine(c *gc.C) {
    43  	const series = "precise"
    44  	const arch = "amd64"
    45  
    46  	args := s.getArgs(c)
    47  	hostname := args.Host
    48  	args.Host = "ubuntu@" + args.Host
    49  
    50  	envtesting.RemoveTools(c, s.Conn.Environ.Storage())
    51  	defer fakeSSH{
    52  		Series:             series,
    53  		Arch:               arch,
    54  		InitUbuntuUser:     true,
    55  		SkipProvisionAgent: true,
    56  	}.install(c).Restore()
    57  	// Attempt to provision a machine with no tools available, expect it to fail.
    58  	machineId, err := manual.ProvisionMachine(args)
    59  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
    60  	c.Assert(machineId, gc.Equals, "")
    61  
    62  	cfg := s.Conn.Environ.Config()
    63  	number, ok := cfg.AgentVersion()
    64  	c.Assert(ok, jc.IsTrue)
    65  	binVersion := version.Binary{number, series, arch}
    66  	envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), binVersion)
    67  
    68  	for i, errorCode := range []int{255, 0} {
    69  		c.Logf("test %d: code %d", i, errorCode)
    70  		defer fakeSSH{
    71  			Series:                 series,
    72  			Arch:                   arch,
    73  			InitUbuntuUser:         true,
    74  			ProvisionAgentExitCode: errorCode,
    75  		}.install(c).Restore()
    76  		machineId, err = manual.ProvisionMachine(args)
    77  		if errorCode != 0 {
    78  			c.Assert(err, gc.ErrorMatches, fmt.Sprintf("subprocess encountered error code %d", errorCode))
    79  			c.Assert(machineId, gc.Equals, "")
    80  		} else {
    81  			c.Assert(err, gc.IsNil)
    82  			c.Assert(machineId, gc.Not(gc.Equals), "")
    83  			// machine ID will be incremented. Even though we failed and the
    84  			// machine is removed, the ID is not reused.
    85  			c.Assert(machineId, gc.Equals, fmt.Sprint(i+1))
    86  			m, err := s.State.Machine(machineId)
    87  			c.Assert(err, gc.IsNil)
    88  			instanceId, err := m.InstanceId()
    89  			c.Assert(err, gc.IsNil)
    90  			c.Assert(instanceId, gc.Equals, instance.Id("manual:"+hostname))
    91  		}
    92  	}
    93  
    94  	// Attempting to provision a machine twice should fail. We effect
    95  	// this by checking for existing juju upstart configurations.
    96  	defer fakeSSH{
    97  		Provisioned:        true,
    98  		InitUbuntuUser:     true,
    99  		SkipDetection:      true,
   100  		SkipProvisionAgent: true,
   101  	}.install(c).Restore()
   102  	_, err = manual.ProvisionMachine(args)
   103  	c.Assert(err, gc.Equals, manual.ErrProvisioned)
   104  	defer fakeSSH{
   105  		Provisioned:              true,
   106  		CheckProvisionedExitCode: 255,
   107  		InitUbuntuUser:           true,
   108  		SkipDetection:            true,
   109  		SkipProvisionAgent:       true,
   110  	}.install(c).Restore()
   111  	_, err = manual.ProvisionMachine(args)
   112  	c.Assert(err, gc.ErrorMatches, "error checking if provisioned: subprocess encountered error code 255")
   113  }
   114  
   115  func (s *provisionerSuite) TestFinishMachineConfig(c *gc.C) {
   116  	const series = "precise"
   117  	const arch = "amd64"
   118  	defer fakeSSH{
   119  		Series:         series,
   120  		Arch:           arch,
   121  		InitUbuntuUser: true,
   122  	}.install(c).Restore()
   123  	machineId, err := manual.ProvisionMachine(s.getArgs(c))
   124  	c.Assert(err, gc.IsNil)
   125  
   126  	// Now check what we would've configured it with.
   127  	mcfg, err := client.MachineConfig(s.State, machineId, state.BootstrapNonce, "/var/lib/juju")
   128  	c.Assert(err, gc.IsNil)
   129  	c.Check(mcfg, gc.NotNil)
   130  	c.Check(mcfg.APIInfo, gc.NotNil)
   131  	c.Check(mcfg.StateInfo, gc.NotNil)
   132  
   133  	stateInfo, apiInfo, err := s.APIConn.Environ.StateInfo()
   134  	c.Assert(err, gc.IsNil)
   135  	c.Check(mcfg.APIInfo.Addrs, gc.DeepEquals, apiInfo.Addrs)
   136  	c.Check(mcfg.StateInfo.Addrs, gc.DeepEquals, stateInfo.Addrs)
   137  }
   138  
   139  func (s *provisionerSuite) TestProvisioningScript(c *gc.C) {
   140  	const series = "precise"
   141  	const arch = "amd64"
   142  	defer fakeSSH{
   143  		Series:         series,
   144  		Arch:           arch,
   145  		InitUbuntuUser: true,
   146  	}.install(c).Restore()
   147  	machineId, err := manual.ProvisionMachine(s.getArgs(c))
   148  	c.Assert(err, gc.IsNil)
   149  
   150  	mcfg, err := client.MachineConfig(s.State, machineId, state.BootstrapNonce, "/var/lib/juju")
   151  	c.Assert(err, gc.IsNil)
   152  	script, err := manual.ProvisioningScript(mcfg)
   153  	c.Assert(err, gc.IsNil)
   154  
   155  	cloudcfg := coreCloudinit.New()
   156  	err = cloudinit.ConfigureJuju(mcfg, cloudcfg)
   157  	c.Assert(err, gc.IsNil)
   158  	cloudcfg.SetAptUpgrade(false)
   159  	sshinitScript, err := sshinit.ConfigureScript(cloudcfg)
   160  	c.Assert(err, gc.IsNil)
   161  
   162  	removeLogFile := "rm -f '/var/log/cloud-init-output.log'\n"
   163  	expectedScript := removeLogFile + shell.DumpFileOnErrorScript("/var/log/cloud-init-output.log") + sshinitScript
   164  	c.Assert(script, gc.Equals, expectedScript)
   165  }