// install installs fake SSH commands, which will respond to // manual provisioning/bootstrapping commands with the specified // output and exit codes. func (r fakeSSH) install(c *gc.C) testing.Restorer { var restore testing.Restorer add := func(input, output interface{}, rc int) { restore = restore.Add(installFakeSSH(c, input, output, rc)) } if !r.SkipProvisionAgent { add(nil, nil, r.ProvisionAgentExitCode) } if !r.SkipDetection { restore.Add(installDetectionFakeSSH(c, r.Series, r.Arch)) } var checkProvisionedOutput interface{} if r.Provisioned { checkProvisionedOutput = "/etc/init/jujud-machine-0.conf" } add(manual.CheckProvisionedScript, checkProvisionedOutput, r.CheckProvisionedExitCode) if r.InitUbuntuUser { add("", nil, 0) } return restore }
func (s *BootstrapSuite) run(c *gc.C, test bootstrapTest) testing.Restorer { // Create home with dummy provider and remove all // of its envtools. resetJujuXDGDataHome(c) dummy.Reset(c) var restore testing.Restorer = func() { s.store = jujuclienttesting.NewMemStore() } if test.version != "" { useVersion := strings.Replace(test.version, "%LTS%", series.LatestLts(), 1) v := version.MustParseBinary(useVersion) restore = restore.Add(testing.PatchValue(&jujuversion.Current, v.Number)) restore = restore.Add(testing.PatchValue(&arch.HostArch, func() string { return v.Arch })) restore = restore.Add(testing.PatchValue(&series.HostSeries, func() string { return v.Series })) } if test.hostArch != "" { restore = restore.Add(testing.PatchValue(&arch.HostArch, func() string { return test.hostArch })) } controllerName := "peckham-controller" cloudName := "dummy" // Run command and check for uploads. args := append([]string{ controllerName, cloudName, "--config", "default-series=raring", }, test.args...) opc, errc := cmdtesting.RunCommand(cmdtesting.NullContext(c), s.newBootstrapCommand(), args...) // Check for remaining operations/errors. if test.err != "" { err := <-errc c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Check(stripped, gc.Matches, test.err) return restore } if !c.Check(<-errc, gc.IsNil) { return restore } opBootstrap := (<-opc).(dummy.OpBootstrap) c.Check(opBootstrap.Env, gc.Equals, "admin") c.Check(opBootstrap.Args.ModelConstraints, gc.DeepEquals, test.constraints) if test.bootstrapConstraints == (constraints.Value{}) { test.bootstrapConstraints = test.constraints } c.Check(opBootstrap.Args.BootstrapConstraints, gc.DeepEquals, test.bootstrapConstraints) c.Check(opBootstrap.Args.Placement, gc.Equals, test.placement) opFinalizeBootstrap := (<-opc).(dummy.OpFinalizeBootstrap) c.Check(opFinalizeBootstrap.Env, gc.Equals, "admin") c.Check(opFinalizeBootstrap.InstanceConfig.ToolsList(), gc.Not(gc.HasLen), 0) if test.upload != "" { c.Check(opFinalizeBootstrap.InstanceConfig.AgentVersion().String(), gc.Equals, test.upload) } expectedBootstrappedControllerName := bootstrappedControllerName(controllerName) // Check controllers.yaml controller details. addrConnectedTo := []string{"localhost:17070"} controller, err := s.store.ControllerByName(expectedBootstrappedControllerName) c.Assert(err, jc.ErrorIsNil) c.Assert(controller.CACert, gc.Not(gc.Equals), "") c.Assert(controller.UnresolvedAPIEndpoints, gc.DeepEquals, addrConnectedTo) c.Assert(controller.APIEndpoints, gc.DeepEquals, addrConnectedTo) c.Assert(utils.IsValidUUIDString(controller.ControllerUUID), jc.IsTrue) // Controller model should be called "admin". controllerModel, err := s.store.ModelByName(expectedBootstrappedControllerName, "admin@local", "admin") c.Assert(controllerModel.ModelUUID, gc.Equals, controller.ControllerUUID) c.Assert(err, jc.ErrorIsNil) // Bootstrap config should have been saved, and should only contain // the type, name, and any user-supplied configuration. bootstrapConfig, err := s.store.BootstrapConfigForController(expectedBootstrappedControllerName) c.Assert(err, jc.ErrorIsNil) c.Assert(bootstrapConfig.Cloud, gc.Equals, "dummy") c.Assert(bootstrapConfig.Credential, gc.Equals, "") c.Assert(bootstrapConfig.Config, jc.DeepEquals, map[string]interface{}{ "name": "admin", "type": "dummy", "default-series": "raring", }) return restore }