func (t *Tests) TestBootstrap(c *C) { // TODO tests for Bootstrap(true) e := t.Open(c) err := environs.Bootstrap(e, false, panicWrite) c.Assert(err, IsNil) info, err := e.StateInfo() c.Assert(info, NotNil) c.Check(info.Addrs, Not(HasLen), 0) err = environs.Bootstrap(e, false, panicWrite) c.Assert(err, ErrorMatches, "environment is already bootstrapped") e2 := t.Open(c) err = environs.Bootstrap(e2, false, panicWrite) c.Assert(err, ErrorMatches, "environment is already bootstrapped") info2, err := e2.StateInfo() c.Check(info2, DeepEquals, info) err = e2.Destroy(nil) c.Assert(err, IsNil) // Open again because Destroy invalidates old environments. e3 := t.Open(c) err = environs.Bootstrap(e3, false, panicWrite) c.Assert(err, IsNil) err = environs.Bootstrap(e3, false, panicWrite) c.Assert(err, NotNil) }
func (s *bootstrapSuite) TestBootstrapNeedsSettings(c *gc.C) { env := newEnviron("bar", noKeysDefined) cleanup := setDummyStorage(c, env) defer cleanup() fixEnv := func(key string, value interface{}) { cfg, err := env.Config().Apply(map[string]interface{}{ key: value, }) c.Assert(err, gc.IsNil) env.cfg = cfg } err := environs.Bootstrap(env, constraints.Value{}) c.Assert(err, gc.ErrorMatches, "environment configuration has no admin-secret") fixEnv("admin-secret", "whatever") err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-cert") fixEnv("ca-cert", testing.CACert) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-private-key") fixEnv("ca-private-key", testing.CAKey) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, gc.IsNil) }
func (s *bootstrapSuite) TestBootstrapUploadTools(c *C) { env := newEnviron("foo", nil, nil) err := environs.Bootstrap(env, false, nil) c.Assert(err, IsNil) c.Assert(env.bootstrapCount, Equals, 1) c.Assert(env.uploadTools, Equals, false) env = newEnviron("foo", nil, nil) err = environs.Bootstrap(env, true, nil) c.Assert(err, IsNil) c.Assert(env.bootstrapCount, Equals, 1) c.Assert(env.uploadTools, Equals, true) }
func build() error { environ, err := environs.NewFromName("") if err != nil { return err } err = environs.Bootstrap(environ, true, nil) if err != nil { return err } conn, err := juju.NewConn(environ) if err != nil { return err } repo := &charm.LocalRepository{filepath.Dir(os.Args[0])} curl := charm.MustParseURL("local:precise/builddb") ch, err := conn.PutCharm(curl, repo, false) if err != nil { return err } service, err := conn.AddService("builddb", ch) if err != nil { return err } if err := service.SetExposed(); err != nil { return err } units, err := conn.AddUnits(service, 1) if err != nil { return err } log.Printf("builddb: Waiting for unit to reach %q status...", state.UnitStarted) unit := units[0] last, info, err := unit.Status() if err != nil { return err } logStatus(last, info) for last != state.UnitStarted { time.Sleep(2 * time.Second) if err := unit.Refresh(); err != nil { return err } status, info, err := unit.Status() if err != nil { return err } if status != last { logStatus(status, info) last = status } } addr, ok := unit.PublicAddress() if !ok { return fmt.Errorf("cannot retrieve files: build unit lacks a public-address") } log.Printf("builddb: Built files published at http://%s", addr) log.Printf("builddb: Remember to destroy the environment when you're done...") return nil }
func (s *bootstrapSuite) TestBootstrapEmptyConstraints(c *gc.C) { env := newEnviron("foo", useDefaultKeys) err := environs.Bootstrap(env, constraints.Value{}) c.Assert(err, gc.IsNil) c.Assert(env.bootstrapCount, gc.Equals, 1) c.Assert(env.constraints, gc.DeepEquals, constraints.Value{}) }
func (t *LiveTests) TestBootstrapWithDefaultSeries(c *C) { if !t.HasProvisioner { c.Skip("HasProvisioner is false; cannot test deployment") } current := version.Current other := current other.Series = "precise" if current == other { other.Series = "quantal" } cfg := t.Env.Config() cfg, err := cfg.Apply(map[string]interface{}{"default-series": other.Series}) c.Assert(err, IsNil) env, err := environs.New(cfg) c.Assert(err, IsNil) dummyenv, err := environs.NewFromAttrs(map[string]interface{}{ "type": "dummy", "name": "dummy storage", "secret": "pizza", "state-server": false, }) c.Assert(err, IsNil) defer dummyenv.Destroy(nil) currentPath := environs.ToolsStoragePath(current) otherPath := environs.ToolsStoragePath(other) envStorage := env.Storage() dummyStorage := dummyenv.Storage() defer envStorage.Remove(otherPath) _, err = environs.PutTools(dummyStorage, ¤t.Number) c.Assert(err, IsNil) // This will only work while cross-compiling across releases is safe, // which depends on external elements. Tends to be safe for the last // few releases, but we may have to refactor some day. err = storageCopy(dummyStorage, currentPath, envStorage, otherPath) c.Assert(err, IsNil) err = environs.Bootstrap(env, false, panicWrite) c.Assert(err, IsNil) defer env.Destroy(nil) conn, err := juju.NewConn(env) c.Assert(err, IsNil) defer conn.Close() // Wait for machine agent to come up on the bootstrap // machine and ensure it deployed the proper series. m0, err := conn.State.Machine("0") c.Assert(err, IsNil) mw0 := newMachineToolWaiter(m0) defer mw0.Stop() waitAgentTools(c, mw0, other) }
// If the environment is configured not to require a public IP address for nodes, // bootstrapping and starting an instance should occur without any attempt to // allocate a public address. func (s *localServerSuite) TestStartInstanceWithoutPublicIP(c *C) { cleanup := s.srv.Service.Nova.RegisterControlPoint( "addFloatingIP", func(sc hook.ServiceControl, args ...interface{}) error { return fmt.Errorf("add floating IP should not have been called") }, ) defer cleanup() cleanup = s.srv.Service.Nova.RegisterControlPoint( "addServerFloatingIP", func(sc hook.ServiceControl, args ...interface{}) error { return fmt.Errorf("add server floating IP should not have been called") }, ) defer cleanup() cfg, err := s.Env.Config().Apply(map[string]interface{}{ "use-floating-ip": false, }) c.Assert(err, IsNil) env, err := environs.New(cfg) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) inst, _ := testing.StartInstance(c, env, "100") err = s.Env.StopInstances([]instance.Instance{inst}) c.Assert(err, IsNil) }
func (s *bootstrapSuite) TestBootstrapFuncKeyGeneration(c *C) { env := newEnviron("foo", nil, nil) var savedCert, savedKey []byte err := environs.Bootstrap(env, false, func(name string, cert, key []byte) error { savedCert = cert savedKey = key return nil }) c.Assert(err, IsNil) c.Assert(env.bootstrapCount, Equals, 1) _, _, err = cert.ParseCertAndKey(env.certPEM, env.keyPEM) c.Assert(err, IsNil) // Check that the cert and key have been set correctly in the configuration cfgCertPEM, cfgCertOK := env.cfg.CACert() cfgKeyPEM, cfgKeyOK := env.cfg.CAPrivateKey() c.Assert(cfgCertOK, Equals, true) c.Assert(cfgKeyOK, Equals, true) c.Assert(cfgCertPEM, DeepEquals, savedCert) c.Assert(cfgKeyPEM, DeepEquals, savedKey) caCert, _, err := cert.ParseCertAndKey(cfgCertPEM, cfgKeyPEM) c.Assert(err, IsNil) c.Assert(caCert.Subject.CommonName, Equals, `juju-generated CA for environment foo`) verifyCert(c, env.certPEM, cfgCertPEM) }
// Run connects to the environment specified on the command line and bootstraps // a juju in that environment if none already exists. func (c *BootstrapCommand) Run(_ *cmd.Context) error { environ, err := environs.NewFromName(c.EnvName) if err != nil { return err } return environs.Bootstrap(environ, c.UploadTools, nil) }
func (s *bootstrapSuite) TestBootstrapKeyGeneration(c *C) { env := newEnviron("foo", nil, nil) err := environs.Bootstrap(env, false, nil) c.Assert(err, IsNil) c.Assert(env.bootstrapCount, Equals, 1) _, _, err = cert.ParseCertAndKey(env.certPEM, env.keyPEM) c.Assert(err, IsNil) // Check that the generated CA key has been written correctly. caCertPEM, err := ioutil.ReadFile(filepath.Join(os.Getenv("HOME"), ".juju", "foo-cert.pem")) c.Assert(err, IsNil) caKeyPEM, err := ioutil.ReadFile(filepath.Join(os.Getenv("HOME"), ".juju", "foo-private-key.pem")) c.Assert(err, IsNil) // Check that the cert and key have been set correctly in the configuration cfgCertPEM, cfgCertOK := env.cfg.CACert() cfgKeyPEM, cfgKeyOK := env.cfg.CAPrivateKey() c.Assert(cfgCertOK, Equals, true) c.Assert(cfgKeyOK, Equals, true) c.Assert(cfgCertPEM, DeepEquals, caCertPEM) c.Assert(cfgKeyPEM, DeepEquals, caKeyPEM) caCert, _, err := cert.ParseCertAndKey(cfgCertPEM, cfgKeyPEM) c.Assert(err, IsNil) c.Assert(caCert.Subject.CommonName, Equals, `juju-generated CA for environment foo`) verifyCert(c, env.certPEM, caCertPEM) }
func (s *bootstrapSuite) TestBootstrapSpecifiedConstraints(c *gc.C) { env := newEnviron("foo", useDefaultKeys) cons := constraints.MustParse("cpu-cores=2 mem=4G") err := environs.Bootstrap(env, cons) c.Assert(err, gc.IsNil) c.Assert(env.bootstrapCount, gc.Equals, 1) c.Assert(env.constraints, gc.DeepEquals, cons) }
func (s *bootstrapSuite) TestBootstrapExistingKey(c *C) { env := newEnviron("foo", []byte(testing.CACert), []byte(testing.CAKey)) err := environs.Bootstrap(env, false, panicWrite) c.Assert(err, IsNil) c.Assert(env.bootstrapCount, Equals, 1) verifyCert(c, env.certPEM, []byte(testing.CACert)) }
func (t *LiveTests) BootstrapOnce(c *C) { if t.bootstrapped { return } err := environs.Bootstrap(t.Env, true, panicWrite) c.Assert(err, IsNil) t.bootstrapped = true }
func (t *Tests) TestBootstrapWithoutAdminSecret(c *C) { m := t.Env.Config().AllAttrs() delete(m, "admin-secret") env, err := environs.NewFromAttrs(m) c.Assert(err, IsNil) err = environs.Bootstrap(env, false, panicWrite) c.Assert(err, ErrorMatches, ".*admin-secret is required for bootstrap") }
func (s *localServerSuite) TestStartInstanceHardwareCharacteristics(c *C) { err := environs.Bootstrap(s.Env, constraints.Value{}) c.Assert(err, IsNil) _, hc := testing.StartInstanceWithConstraints(c, s.Env, "100", constraints.MustParse("mem=1024")) c.Check(*hc.Arch, Equals, "amd64") c.Check(*hc.Mem, Equals, uint64(2048)) c.Check(*hc.CpuCores, Equals, uint64(1)) c.Assert(hc.CpuPower, IsNil) }
func (suite *EnvironSuite) TestBootstrapIntegratesWithEnvirons(c *C) { suite.setupFakeTools(c) env := suite.makeEnviron() suite.testMAASObject.TestServer.NewNode(`{"system_id": "bootstrapnode", "hostname": "host"}`) // environs.Bootstrap calls Environ.Bootstrap. This works. err := environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) }
func (*NewConnSuite) TestNewConnFromName(c *C) { home := c.MkDir() defer os.Setenv("HOME", os.Getenv("HOME")) os.Setenv("HOME", home) conn, err := juju.NewConnFromName("") c.Assert(conn, IsNil) c.Assert(err, ErrorMatches, ".*: no such file or directory") if err := os.Mkdir(filepath.Join(home, ".juju"), 0755); err != nil { c.Fatal("Could not create directory structure") } envs := filepath.Join(home, ".juju", "environments.yaml") err = ioutil.WriteFile(envs, []byte(` default: erewhemos environments: erewhemos: type: dummy state-server: true authorized-keys: i-am-a-key admin-secret: conn-from-name-secret `), 0644) err = ioutil.WriteFile(filepath.Join(home, ".juju", "erewhemos-cert.pem"), []byte(coretesting.CACert), 0600) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(home, ".juju", "erewhemos-private-key.pem"), []byte(coretesting.CAKey), 0600) c.Assert(err, IsNil) // Just run through a few operations on the dummy provider and verify that // they behave as expected. conn, err = juju.NewConnFromName("") c.Assert(err, ErrorMatches, "dummy environment not bootstrapped") environ, err := environs.NewFromName("") c.Assert(err, IsNil) err = environs.Bootstrap(environ, false, panicWrite) c.Assert(err, IsNil) conn, err = juju.NewConnFromName("") c.Assert(err, IsNil) defer conn.Close() c.Assert(conn.Environ, NotNil) c.Assert(conn.Environ.Name(), Equals, "erewhemos") c.Assert(conn.State, NotNil) // Reset the admin password so the state db can be reused. err = conn.State.SetAdminMongoPassword("") c.Assert(err, IsNil) // Close the conn (thereby closing its state) a couple of times to // verify that multiple closes will not panic. We ignore the error, // as the underlying State will return an error the second // time. conn.Close() conn.Close() }
func (t *LiveTests) TestBootstrapMultiple(c *C) { t.BootstrapOnce(c) err := environs.Bootstrap(t.Env, constraints.Value{}) c.Assert(err, ErrorMatches, "environment is already bootstrapped") c.Logf("destroy env") t.Destroy(c) t.Destroy(c) // Again, should work fine and do nothing. // check that we can bootstrap after destroy t.BootstrapOnce(c) }
func (t *LiveTests) BootstrapOnce(c *C) { if t.bootstrapped { return } // We only build and upload tools if there will be a state agent that // we could connect to (actual live tests, rather than local-only) cons := constraints.MustParse("mem=2G") if t.CanOpenState { _, err := tools.Upload(t.Env.Storage(), nil, config.DefaultSeries) c.Assert(err, IsNil) } err := environs.Bootstrap(t.Env, cons) c.Assert(err, IsNil) t.bootstrapped = true }
// Run connects to the environment specified on the command line and bootstraps // a juju in that environment if none already exists. If there is as yet no environments.yaml file, // the user is informed how to create one. func (c *BootstrapCommand) Run(context *cmd.Context) error { environ, err := environs.NewFromName(c.EnvName) if err != nil { if os.IsNotExist(err) { out := context.Stderr fmt.Fprintln(out, "No juju environment configuration file exists.") fmt.Fprintln(out, "Please create a configuration by running:") fmt.Fprintln(out, " juju init -w") fmt.Fprintln(out, "then edit the file to configure your juju environment.") fmt.Fprintln(out, "You can then re-run bootstrap.") } return err } // TODO: if in verbose mode, write out to Stdout if a new cert was created. _, err = environs.EnsureCertificate(environ, environs.WriteCertAndKey) if err != nil { return err } // If we are using a local provider, always upload tools. if environ.Config().Type() == provider.Local { c.UploadTools = true } if c.UploadTools { // Force version.Current, for consistency with subsequent upgrade-juju // (see UpgradeJujuCommand). forceVersion := uploadVersion(version.Current.Number, nil) cfg := environ.Config() series := getUploadSeries(cfg, c.Series) tools, err := uploadTools(environ.Storage(), &forceVersion, series...) if err != nil { return err } cfg, err = cfg.Apply(map[string]interface{}{ "agent-version": tools.Version.Number.String(), }) if err == nil { err = environ.SetConfig(cfg) } if err != nil { return fmt.Errorf("failed to update environment configuration: %v", err) } } err = c.ensureToolsAvailability(environ, context) if err != nil { return err } return environs.Bootstrap(environ, c.Constraints) }
func (t *localServerSuite) TestStartInstanceHardwareCharacteristics(c *C) { err := environs.Bootstrap(t.env, constraints.Value{}) c.Assert(err, IsNil) series := t.env.Config().DefaultSeries() info, apiInfo, err := t.env.StateInfo() c.Assert(err, IsNil) c.Assert(info, NotNil) info.Tag = "machine-1" apiInfo.Tag = "machine-1" _, hc, err := t.env.StartInstance("1", "fake_nonce", series, constraints.MustParse("mem=1024"), 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)) }
func (cs *NewConnSuite) TestConnWithPassword(c *C) { env, err := environs.NewFromAttrs(map[string]interface{}{ "name": "erewhemos", "type": "dummy", "state-server": true, "authorized-keys": "i-am-a-key", "secret": "squirrel", "admin-secret": "nutkin", "ca-cert": coretesting.CACert, "ca-private-key": coretesting.CAKey, }) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) // Check that Bootstrap has correctly used a hash // of the admin password. info, _, err := env.StateInfo() c.Assert(err, IsNil) info.Password = utils.PasswordHash("nutkin") st, err := state.Open(info, state.DefaultDialOpts()) c.Assert(err, IsNil) st.Close() // Check that we can connect with the original environment. conn, err := juju.NewConn(env) c.Assert(err, IsNil) conn.Close() // Check that the password has now been changed to the original // admin password. info.Password = "******" st1, err := state.Open(info, state.DefaultDialOpts()) c.Assert(err, IsNil) st1.Close() // Check that we can still connect with the original // environment. conn, err = juju.NewConn(env) c.Assert(err, IsNil) defer conn.Close() // Reset the admin password so the state db can be reused. err = conn.State.SetAdminMongoPassword("") c.Assert(err, IsNil) }
func (s *JujuConnSuite) setUpConn(c *C) { if s.RootDir != "" { panic("JujuConnSuite.setUpConn without teardown") } s.RootDir = c.MkDir() s.oldHome = os.Getenv("HOME") home := filepath.Join(s.RootDir, "/home/ubuntu") err := os.MkdirAll(home, 0777) c.Assert(err, IsNil) os.Setenv("HOME", home) dataDir := filepath.Join(s.RootDir, "/var/lib/juju") err = os.MkdirAll(dataDir, 0777) c.Assert(err, IsNil) yaml := []byte(fmt.Sprintf(envConfig, version.Current.Number)) err = ioutil.WriteFile(config.JujuHomePath("environments.yaml"), yaml, 0600) c.Assert(err, IsNil) err = ioutil.WriteFile(config.JujuHomePath("dummyenv-cert.pem"), []byte(testing.CACert), 0666) c.Assert(err, IsNil) err = ioutil.WriteFile(config.JujuHomePath("dummyenv-private-key.pem"), []byte(testing.CAKey), 0600) c.Assert(err, IsNil) environ, err := environs.NewFromName("dummyenv") c.Assert(err, IsNil) // sanity check we've got the correct environment. c.Assert(environ.Name(), Equals, "dummyenv") c.Assert(environs.Bootstrap(environ, constraints.Value{}), IsNil) s.BackingState = environ.(GetStater).GetStateInAPIServer() conn, err := juju.NewConn(environ) c.Assert(err, IsNil) s.Conn = conn s.State = conn.State apiConn, err := juju.NewAPIConn(environ, api.DialOpts{}) c.Assert(err, IsNil) s.APIConn = apiConn s.APIState = apiConn.State s.environ = environ }
// If the bootstrap node is configured to require a public IP address, // bootstrapping fails if an address cannot be allocated. func (s *localServerSuite) TestBootstrapFailsWhenPublicIPError(c *C) { cleanup := s.srv.Service.Nova.RegisterControlPoint( "addFloatingIP", func(sc hook.ServiceControl, args ...interface{}) error { return fmt.Errorf("failed on purpose") }, ) defer cleanup() // Create a config that matches s.Config but with use-floating-ip set to true cfg, err := s.Env.Config().Apply(map[string]interface{}{ "use-floating-ip": true, }) c.Assert(err, IsNil) env, err := environs.New(cfg) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, ErrorMatches, "(.|\n)*cannot allocate a public IP as needed(.|\n)*") }
// 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 (s *ConnSuite) SetUpTest(c *C) { s.LoggingSuite.SetUpTest(c) s.MgoSuite.SetUpTest(c) attrs := map[string]interface{}{ "name": "erewhemos", "type": "dummy", "state-server": true, "authorized-keys": "i-am-a-key", "admin-secret": "deploy-test-secret", "ca-cert": coretesting.CACert, "ca-private-key": coretesting.CAKey, } environ, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) err = environs.Bootstrap(environ, constraints.Value{}) c.Assert(err, IsNil) s.conn, err = juju.NewConn(environ) c.Assert(err, IsNil) s.repo = &charm.LocalRepository{Path: c.MkDir()} }
func (cs *NewConnSuite) TestConnStateSecretsSideEffect(c *C) { attrs := map[string]interface{}{ "name": "erewhemos", "type": "dummy", "state-server": true, "authorized-keys": "i-am-a-key", "secret": "pork", "admin-secret": "side-effect secret", "ca-cert": coretesting.CACert, "ca-private-key": coretesting.CAKey, } env, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) info, _, err := env.StateInfo() c.Assert(err, IsNil) info.Password = utils.PasswordHash("side-effect secret") st, err := state.Open(info, state.DefaultDialOpts()) c.Assert(err, IsNil) // Verify we have no secret in the environ config cfg, err := st.EnvironConfig() c.Assert(err, IsNil) c.Assert(cfg.UnknownAttrs()["secret"], IsNil) // Make a new Conn, which will push the secrets. conn, err := juju.NewConn(env) c.Assert(err, IsNil) defer conn.Close() cfg, err = conn.State.EnvironConfig() c.Assert(err, IsNil) c.Assert(cfg.UnknownAttrs()["secret"], Equals, "pork") // Reset the admin password so the state db can be reused. err = conn.State.SetAdminMongoPassword("") c.Assert(err, IsNil) }
func (s *JujuConnSuite) setUpConn(c *C) { if s.RootDir != "" { panic("JujuConnSuite.setUpConn without teardown") } s.RootDir = c.MkDir() s.oldHome = os.Getenv("HOME") home := filepath.Join(s.RootDir, "/home/ubuntu") err := os.MkdirAll(home, 0777) c.Assert(err, IsNil) os.Setenv("HOME", home) dataDir := filepath.Join(s.RootDir, "/var/lib/juju") err = os.MkdirAll(dataDir, 0777) c.Assert(err, IsNil) err = os.Mkdir(filepath.Join(home, ".juju"), 0777) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(home, ".juju", "environments.yaml"), config, 0600) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(home, ".juju", "dummyenv-cert.pem"), []byte(testing.CACert), 0666) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(home, ".juju", "dummyenv-private-key.pem"), []byte(testing.CAKey), 0600) c.Assert(err, IsNil) environ, err := environs.NewFromName("dummyenv") c.Assert(err, IsNil) // sanity check we've got the correct environment. c.Assert(environ.Name(), Equals, "dummyenv") c.Assert(environs.Bootstrap(environ, false, panicWrite), IsNil) conn, err := juju.NewConnFromName("dummyenv") c.Assert(err, IsNil) s.Conn = conn s.State = conn.State c.Assert(err, IsNil) }
func (cs *NewConnSuite) TestConnStateDoesNotUpdateExistingSecrets(c *C) { attrs := map[string]interface{}{ "name": "erewhemos", "type": "dummy", "state-server": true, "authorized-keys": "i-am-a-key", "secret": "pork", "admin-secret": "some secret", "ca-cert": coretesting.CACert, "ca-private-key": coretesting.CAKey, } env, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) // Make a new Conn, which will push the secrets. conn, err := juju.NewConn(env) c.Assert(err, IsNil) defer conn.Close() // Make another env with a different secret. attrs["secret"] = "squirrel" env1, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) // Connect with the new env and check that the secret has not changed conn, err = juju.NewConn(env1) c.Assert(err, IsNil) defer conn.Close() cfg, err := conn.State.EnvironConfig() c.Assert(err, IsNil) c.Assert(cfg.UnknownAttrs()["secret"], Equals, "pork") // Reset the admin password so the state db can be reused. err = conn.State.SetAdminMongoPassword("") c.Assert(err, IsNil) }
func (*NewConnSuite) TestNewConnWithoutAdminSecret(c *C) { attrs := map[string]interface{}{ "name": "erewhemos", "type": "dummy", "state-server": true, "authorized-keys": "i-am-a-key", "secret": "pork", "admin-secret": "really", "ca-cert": coretesting.CACert, "ca-private-key": coretesting.CAKey, } env, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) err = environs.Bootstrap(env, constraints.Value{}) c.Assert(err, IsNil) delete(attrs, "admin-secret") env1, err := environs.NewFromAttrs(attrs) c.Assert(err, IsNil) conn, err := juju.NewConn(env1) c.Check(conn, IsNil) c.Assert(err, ErrorMatches, "cannot connect without admin-secret") }