github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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 "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/agent"
    15  	"github.com/juju/juju/apiserver/client"
    16  	"github.com/juju/juju/apiserver/params"
    17  	coreCloudinit "github.com/juju/juju/cloudinit"
    18  	"github.com/juju/juju/cloudinit/sshinit"
    19  	"github.com/juju/juju/environs/cloudinit"
    20  	"github.com/juju/juju/environs/manual"
    21  	envtesting "github.com/juju/juju/environs/testing"
    22  	envtools "github.com/juju/juju/environs/tools"
    23  	"github.com/juju/juju/instance"
    24  	"github.com/juju/juju/juju/testing"
    25  	coretesting "github.com/juju/juju/testing"
    26  	"github.com/juju/juju/version"
    27  )
    28  
    29  type provisionerSuite struct {
    30  	testing.JujuConnSuite
    31  }
    32  
    33  var _ = gc.Suite(&provisionerSuite{})
    34  
    35  func (s *provisionerSuite) getArgs(c *gc.C) manual.ProvisionMachineArgs {
    36  	hostname, err := os.Hostname()
    37  	c.Assert(err, jc.ErrorIsNil)
    38  	client := s.APIState.Client()
    39  	s.AddCleanup(func(*gc.C) { client.Close() })
    40  	return manual.ProvisionMachineArgs{
    41  		Host:           hostname,
    42  		Client:         client,
    43  		UpdateBehavior: &params.UpdateBehavior{true, true},
    44  	}
    45  }
    46  
    47  func (s *provisionerSuite) TestProvisionMachine(c *gc.C) {
    48  	const series = coretesting.FakeDefaultSeries
    49  	const arch = "amd64"
    50  	const operatingSystem = version.Ubuntu
    51  
    52  	args := s.getArgs(c)
    53  	hostname := args.Host
    54  	args.Host = "ubuntu@" + args.Host
    55  
    56  	defaultToolsURL := envtools.DefaultBaseURL
    57  	envtools.DefaultBaseURL = ""
    58  
    59  	defer fakeSSH{
    60  		Series:             series,
    61  		Arch:               arch,
    62  		InitUbuntuUser:     true,
    63  		SkipProvisionAgent: true,
    64  	}.install(c).Restore()
    65  	// Attempt to provision a machine with no tools available, expect it to fail.
    66  	machineId, err := manual.ProvisionMachine(args)
    67  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
    68  	c.Assert(machineId, gc.Equals, "")
    69  
    70  	cfg := s.Environ.Config()
    71  	number, ok := cfg.AgentVersion()
    72  	c.Assert(ok, jc.IsTrue)
    73  	binVersion := version.Binary{number, series, arch, operatingSystem}
    74  	envtesting.AssertUploadFakeToolsVersions(c, s.DefaultToolsStorage, "released", "released", binVersion)
    75  	envtools.DefaultBaseURL = defaultToolsURL
    76  
    77  	for i, errorCode := range []int{255, 0} {
    78  		c.Logf("test %d: code %d", i, errorCode)
    79  		defer fakeSSH{
    80  			Series:                 series,
    81  			Arch:                   arch,
    82  			InitUbuntuUser:         true,
    83  			ProvisionAgentExitCode: errorCode,
    84  		}.install(c).Restore()
    85  		machineId, err = manual.ProvisionMachine(args)
    86  		if errorCode != 0 {
    87  			c.Assert(err, gc.ErrorMatches, fmt.Sprintf("subprocess encountered error code %d", errorCode))
    88  			c.Assert(machineId, gc.Equals, "")
    89  		} else {
    90  			c.Assert(err, jc.ErrorIsNil)
    91  			c.Assert(machineId, gc.Not(gc.Equals), "")
    92  			// machine ID will be incremented. Even though we failed and the
    93  			// machine is removed, the ID is not reused.
    94  			c.Assert(machineId, gc.Equals, fmt.Sprint(i+1))
    95  			m, err := s.State.Machine(machineId)
    96  			c.Assert(err, jc.ErrorIsNil)
    97  			instanceId, err := m.InstanceId()
    98  			c.Assert(err, jc.ErrorIsNil)
    99  			c.Assert(instanceId, gc.Equals, instance.Id("manual:"+hostname))
   100  		}
   101  	}
   102  
   103  	// Attempting to provision a machine twice should fail. We effect
   104  	// this by checking for existing juju upstart configurations.
   105  	defer fakeSSH{
   106  		Provisioned:        true,
   107  		InitUbuntuUser:     true,
   108  		SkipDetection:      true,
   109  		SkipProvisionAgent: true,
   110  	}.install(c).Restore()
   111  	_, err = manual.ProvisionMachine(args)
   112  	c.Assert(err, gc.Equals, manual.ErrProvisioned)
   113  	defer fakeSSH{
   114  		Provisioned:              true,
   115  		CheckProvisionedExitCode: 255,
   116  		InitUbuntuUser:           true,
   117  		SkipDetection:            true,
   118  		SkipProvisionAgent:       true,
   119  	}.install(c).Restore()
   120  	_, err = manual.ProvisionMachine(args)
   121  	c.Assert(err, gc.ErrorMatches, "error checking if provisioned: subprocess encountered error code 255")
   122  }
   123  
   124  func (s *provisionerSuite) TestFinishMachineConfig(c *gc.C) {
   125  	const series = coretesting.FakeDefaultSeries
   126  	const arch = "amd64"
   127  	defer fakeSSH{
   128  		Series:         series,
   129  		Arch:           arch,
   130  		InitUbuntuUser: true,
   131  	}.install(c).Restore()
   132  	machineId, err := manual.ProvisionMachine(s.getArgs(c))
   133  	c.Assert(err, jc.ErrorIsNil)
   134  
   135  	// Now check what we would've configured it with.
   136  	mcfg, err := client.MachineConfig(s.State, machineId, agent.BootstrapNonce, "/var/lib/juju")
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Check(mcfg, gc.NotNil)
   139  	c.Check(mcfg.APIInfo, gc.NotNil)
   140  	c.Check(mcfg.MongoInfo, gc.NotNil)
   141  
   142  	stateInfo := s.MongoInfo(c)
   143  	apiInfo := s.APIInfo(c)
   144  	c.Check(mcfg.APIInfo.Addrs, gc.DeepEquals, apiInfo.Addrs)
   145  	c.Check(mcfg.MongoInfo.Addrs, gc.DeepEquals, stateInfo.Addrs)
   146  }
   147  
   148  func (s *provisionerSuite) TestProvisioningScript(c *gc.C) {
   149  	const series = coretesting.FakeDefaultSeries
   150  	const arch = "amd64"
   151  	defer fakeSSH{
   152  		Series:         series,
   153  		Arch:           arch,
   154  		InitUbuntuUser: true,
   155  	}.install(c).Restore()
   156  
   157  	machineId, err := manual.ProvisionMachine(s.getArgs(c))
   158  	c.Assert(err, jc.ErrorIsNil)
   159  
   160  	err = s.State.UpdateEnvironConfig(
   161  		map[string]interface{}{
   162  			"enable-os-upgrade": false,
   163  		}, nil, nil)
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	mcfg, err := client.MachineConfig(s.State, machineId, agent.BootstrapNonce, "/var/lib/juju")
   167  
   168  	c.Assert(err, jc.ErrorIsNil)
   169  	script, err := manual.ProvisioningScript(mcfg)
   170  	c.Assert(err, jc.ErrorIsNil)
   171  
   172  	cloudcfg := coreCloudinit.New()
   173  	udata, err := cloudinit.NewUserdataConfig(mcfg, cloudcfg)
   174  	c.Assert(err, jc.ErrorIsNil)
   175  	err = udata.ConfigureJuju()
   176  	c.Assert(err, jc.ErrorIsNil)
   177  	cloudcfg.SetAptUpgrade(false)
   178  	sshinitScript, err := sshinit.ConfigureScript(cloudcfg)
   179  	c.Assert(err, jc.ErrorIsNil)
   180  
   181  	removeLogFile := "rm -f '/var/log/cloud-init-output.log'\n"
   182  	expectedScript := removeLogFile + shell.DumpFileOnErrorScript("/var/log/cloud-init-output.log") + sshinitScript
   183  	c.Assert(script, gc.Equals, expectedScript)
   184  }