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 }