func (*OpenSuite) TestConfigForNameNoDefault(c *gc.C) { defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore() cfg, source, err := environs.ConfigForName("", configstore.NewMem()) c.Assert(err, gc.ErrorMatches, "no default environment found") c.Assert(cfg, gc.IsNil) c.Assert(source, gc.Equals, environs.ConfigFromEnvirons) }
func (*OpenSuite) TestConfigForNameDefault(c *gc.C) { defer testing.MakeFakeHome(c, testing.SingleEnvConfig, testing.SampleCertName).Restore() cfg, source, err := environs.ConfigForName("", configstore.NewMem()) c.Assert(err, gc.IsNil) c.Assert(cfg.Name(), gc.Equals, "erewhemos") c.Assert(source, gc.Equals, environs.ConfigFromEnvirons) }
func (*OpenSuite) TestConfigForNameFromInfo(c *gc.C) { defer testing.MakeFakeHome(c, testing.SingleEnvConfig, testing.SampleCertName).Restore() store := configstore.NewMem() cfg, source, err := environs.ConfigForName("", store) c.Assert(err, gc.IsNil) c.Assert(source, gc.Equals, environs.ConfigFromEnvirons) info, err := store.CreateInfo("test-config") c.Assert(err, gc.IsNil) var attrs testing.Attrs = cfg.AllAttrs() attrs = attrs.Merge(testing.Attrs{ "name": "test-config", }) info.SetBootstrapConfig(attrs) err = info.Write() c.Assert(err, gc.IsNil) cfg, source, err = environs.ConfigForName("test-config", store) c.Assert(err, gc.IsNil) c.Assert(source, gc.Equals, environs.ConfigFromInfo) c.Assert(testing.Attrs(cfg.AllAttrs()), gc.DeepEquals, attrs) }
func (*OpenSuite) TestNewFromNameWithInvalidInfo(c *gc.C) { defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore() store := configstore.NewMem() cfg, _, err := environs.ConfigForName("erewhemos", store) c.Assert(err, gc.IsNil) info, err := store.CreateInfo("erewhemos") c.Assert(err, gc.IsNil) // The configuration from environments.yaml is invalid // because it doesn't contain the state-id attribute which // the dummy environment adds at Prepare time. info.SetBootstrapConfig(cfg.AllAttrs()) err = info.Write() c.Assert(err, gc.IsNil) e, err := environs.NewFromName("erewhemos", store) c.Assert(err, gc.ErrorMatches, "environment is not prepared") c.Assert(e, gc.IsNil) }
func (c *restoreCommand) Run(ctx *cmd.Context) error { if c.showDescription { fmt.Fprintf(ctx.Stdout, "%s\n", c.Info().Purpose) return nil } if err := c.Log.Start(ctx); err != nil { return err } creds, err := extractCreds(c.backupFile) if err != nil { return fmt.Errorf("cannot extract credentials from backup file: %v", err) } progress("extracted credentials from backup file") store, err := configstore.Default() if err != nil { return err } cfg, _, err := environs.ConfigForName(c.EnvName, store) if err != nil { return err } env, err := rebootstrap(cfg, ctx, c.Constraints) if err != nil { return fmt.Errorf("cannot re-bootstrap environment: %v", err) } progress("connecting to newly bootstrapped instance") conn, err := juju.NewAPIConn(env, api.DefaultDialOpts()) if err != nil { return fmt.Errorf("cannot connect to bootstrap instance: %v", err) } progress("restoring bootstrap machine") newInstId, machine0Addr, err := restoreBootstrapMachine(conn, c.backupFile, creds) if err != nil { return fmt.Errorf("cannot restore bootstrap machine: %v", err) } progress("restored bootstrap machine") // Update the environ state to point to the new instance. if err := bootstrap.SaveState(env.Storage(), &bootstrap.BootstrapState{ StateInstances: []instance.Id{newInstId}, }); err != nil { return fmt.Errorf("cannot update environ bootstrap state storage: %v", err) } // Construct our own state info rather than using juju.NewConn so // that we can avoid storage eventual-consistency issues // (and it's faster too). caCert, ok := cfg.CACert() if !ok { return fmt.Errorf("configuration has no CA certificate") } progress("opening state") st, err := state.Open(&state.Info{ Addrs: []string{fmt.Sprintf("%s:%d", machine0Addr, cfg.StatePort())}, CACert: caCert, Tag: creds.Tag, Password: creds.Password, }, state.DefaultDialOpts(), environs.NewStatePolicy()) if err != nil { return fmt.Errorf("cannot open state: %v", err) } progress("updating all machines") if err := updateAllMachines(st, machine0Addr); err != nil { return fmt.Errorf("cannot update machines: %v", err) } return nil }