func (suite *StateSuite) TestLoadStateReturnsNotFoundErrorForMissingFile(c *C) { storage, cleanup := makeDummyStorage(c) defer cleanup() _, err := environs.LoadState(storage) c.Check(errors.IsNotFoundError(err), Equals, true) }
func (suite *StateSuite) TestLoadStateReadsStateFile(c *C) { storage, cleanup := makeDummyStorage(c) defer cleanup() state := suite.setupSavedState(c, storage) storedState, err := environs.LoadState(storage) c.Assert(err, IsNil) c.Check(*storedState, DeepEquals, state) }
// TODO (wallyworld) - this test was copied from the ec2 provider. // It should be moved to environs.jujutests.Tests. func (s *localServerSuite) TestBootstrapInstanceUserDataAndState(c *C) { err := environs.Bootstrap(s.env, constraints.Value{}) c.Assert(err, IsNil) // check that the state holds the id of the bootstrap machine. stateData, err := environs.LoadState(s.env.Storage()) c.Assert(err, IsNil) c.Assert(stateData.StateInstances, HasLen, 1) expectedHardware := instance.MustParseHardware("arch=amd64 cpu-cores=1 mem=512M") insts, err := s.env.AllInstances() c.Assert(err, IsNil) c.Assert(insts, HasLen, 1) c.Check(insts[0].Id(), Equals, stateData.StateInstances[0]) c.Check(expectedHardware, DeepEquals, stateData.Characteristics[0]) info, apiInfo, err := s.env.StateInfo() c.Assert(err, IsNil) c.Assert(info, NotNil) bootstrapDNS, err := insts[0].DNSName() c.Assert(err, IsNil) c.Assert(bootstrapDNS, Not(Equals), "") // TODO(wallyworld) - 2013-03-01 bug=1137005 // The nova test double needs to be updated to support retrieving instance userData. // Until then, we can't check the cloud init script was generated correctly. // check that a new instance will be started with a machine agent, // and without a provisioning agent. series := s.env.Config().DefaultSeries() info.Tag = "machine-1" apiInfo.Tag = "machine-1" inst1, _, err := s.env.StartInstance("1", "fake_nonce", series, constraints.Value{}, info, apiInfo) c.Assert(err, IsNil) err = s.env.Destroy(append(insts, inst1)) c.Assert(err, IsNil) _, err = environs.LoadState(s.env.Storage()) c.Assert(err, NotNil) }
func (suite *StateSuite) TestLoadStateIntegratesWithSaveState(c *C) { storage, cleanup := makeDummyStorage(c) defer cleanup() arch := "amd64" state := environs.BootstrapState{ StateInstances: []instance.Id{instance.Id("an-instance-id")}, Characteristics: []instance.HardwareCharacteristics{{Arch: &arch}}} err := environs.SaveState(storage, &state) c.Assert(err, IsNil) storedState, err := environs.LoadState(storage) c.Assert(err, IsNil) c.Check(*storedState, DeepEquals, state) }
func (suite *EnvironSuite) TestStartInstanceStartsInstance(c *C) { suite.setupFakeTools(c) env := suite.makeEnviron() // Create node 0: it will be used as the bootstrap node. suite.testMAASObject.TestServer.NewNode(`{"system_id": "node0", "hostname": "host0"}`) err := environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) // The bootstrap node has been acquired and started. operations := suite.testMAASObject.TestServer.NodeOperations() actions, found := operations["node0"] c.Check(found, Equals, true) c.Check(actions, DeepEquals, []string{"acquire", "start"}) // Test the instance id is correctly recorded for the bootstrap node. // Check that the state holds the id of the bootstrap machine. stateData, err := environs.LoadState(env.Storage()) c.Assert(err, IsNil) c.Assert(stateData.StateInstances, HasLen, 1) insts, err := env.AllInstances() c.Assert(err, IsNil) c.Assert(insts, HasLen, 1) c.Check(insts[0].Id(), Equals, stateData.StateInstances[0]) // Create node 1: it will be used as instance number 1. suite.testMAASObject.TestServer.NewNode(`{"system_id": "node1", "hostname": "host1"}`) stateInfo, apiInfo, err := env.StateInfo() c.Assert(err, IsNil) stateInfo.Tag = "machine-1" apiInfo.Tag = "machine-1" series := version.Current.Series nonce := "12345" // TODO(wallyworld) - test instance metadata instance, _, err := env.StartInstance("1", nonce, series, constraints.Value{}, stateInfo, apiInfo) c.Assert(err, IsNil) c.Check(instance, NotNil) // The instance number 1 has been acquired and started. actions, found = operations["node1"] c.Assert(found, Equals, true) c.Check(actions, DeepEquals, []string{"acquire", "start"}) // The value of the "user data" parameter used when starting the node // contains the run cmd used to write the machine information onto // the node's filesystem. requestValues := suite.testMAASObject.TestServer.NodeOperationRequestValues() nodeRequestValues, found := requestValues["node1"] c.Assert(found, Equals, true) c.Assert(len(nodeRequestValues), Equals, 2) userData := nodeRequestValues[1].Get("user_data") decodedUserData, err := decodeUserData(userData) c.Assert(err, IsNil) info := machineInfo{"host1"} cloudinitRunCmd, err := info.cloudinitRunCmd() c.Assert(err, IsNil) data, err := goyaml.Marshal(cloudinitRunCmd) c.Assert(err, IsNil) c.Check(string(decodedUserData), Matches, "(.|\n)*"+string(data)+"(\n|.)*") // Trash the tools and try to start another instance. envtesting.RemoveTools(c, env.Storage()) instance, _, err = env.StartInstance("2", "fake-nonce", series, constraints.Value{}, stateInfo, apiInfo) c.Check(instance, IsNil) c.Check(err, ErrorMatches, "no tools available") c.Check(err, FitsTypeOf, (*errors.NotFoundError)(nil)) }
func (t *localServerSuite) TestBootstrapInstanceUserDataAndState(c *C) { envtesting.UploadFakeTools(c, t.env.Storage()) err := environs.Bootstrap(t.env, constraints.Value{}) c.Assert(err, IsNil) // check that the state holds the id of the bootstrap machine. bootstrapState, err := environs.LoadState(t.env.Storage()) c.Assert(err, IsNil) c.Assert(bootstrapState.StateInstances, HasLen, 1) expectedHardware := instance.MustParseHardware("arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M") insts, err := t.env.AllInstances() c.Assert(err, IsNil) c.Assert(insts, HasLen, 1) c.Check(insts[0].Id(), Equals, bootstrapState.StateInstances[0]) c.Check(expectedHardware, DeepEquals, bootstrapState.Characteristics[0]) info, apiInfo, err := t.env.StateInfo() c.Assert(err, IsNil) c.Assert(info, NotNil) // check that the user data is configured to start zookeeper // and the machine and provisioning agents. inst := t.srv.ec2srv.Instance(string(insts[0].Id())) c.Assert(inst, NotNil) bootstrapDNS, err := insts[0].DNSName() c.Assert(err, IsNil) c.Assert(bootstrapDNS, Not(Equals), "") userData, err := utils.Gunzip(inst.UserData) c.Assert(err, IsNil) c.Logf("first instance: UserData: %q", userData) var x map[interface{}]interface{} err = goyaml.Unmarshal(userData, &x) c.Assert(err, IsNil) CheckPackage(c, x, "git", true) CheckScripts(c, x, "jujud bootstrap-state", true) // TODO check for provisioning agent // TODO check for machine agent // check that a new instance will be started without // zookeeper, with a machine agent, and without a // provisioning agent. series := t.env.Config().DefaultSeries() info.Tag = "machine-1" apiInfo.Tag = "machine-1" inst1, hc, err := t.env.StartInstance("1", "fake_nonce", series, constraints.Value{}, info, apiInfo) c.Assert(err, IsNil) c.Check(*hc.Arch, Equals, "amd64") c.Check(*hc.Mem, Equals, uint64(1740)) c.Check(*hc.CpuCores, Equals, uint64(1)) c.Assert(*hc.CpuPower, Equals, uint64(100)) inst = t.srv.ec2srv.Instance(string(inst1.Id())) c.Assert(inst, NotNil) userData, err = utils.Gunzip(inst.UserData) c.Assert(err, IsNil) c.Logf("second instance: UserData: %q", userData) x = nil err = goyaml.Unmarshal(userData, &x) c.Assert(err, IsNil) CheckPackage(c, x, "zookeeperd", false) // TODO check for provisioning agent // TODO check for machine agent err = t.env.Destroy(append(insts, inst1)) c.Assert(err, IsNil) _, err = environs.LoadState(t.env.Storage()) c.Assert(err, NotNil) }