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: ¶ms.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 }