github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/testing/environ.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testing 5 6 import ( 7 "io/ioutil" 8 "os" 9 10 gitjujutesting "github.com/juju/testing" 11 gc "launchpad.net/gocheck" 12 13 "github.com/juju/juju/environs/config" 14 "github.com/juju/juju/juju/osenv" 15 "github.com/juju/juju/utils/ssh" 16 ) 17 18 // FakeAuthKeys holds the authorized key used for testing 19 // purposes in FakeConfig. It is valid for parsing with the utils/ssh 20 // authorized-key utilities. 21 const FakeAuthKeys = `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQDP8fPSAMFm2PQGoVUks/FENVUMww1QTK6m++Y2qX9NGHm43kwEzxfoWR77wo6fhBhgFHsQ6ogE/cYLx77hOvjTchMEP74EVxSce0qtDjI7SwYbOpAButRId3g/Ef4STz8= joe@0.1.2.4` 22 23 func init() { 24 _, err := ssh.ParseAuthorisedKey(FakeAuthKeys) 25 if err != nil { 26 panic("FakeAuthKeys does not hold a valid authorized key: " + err.Error()) 27 } 28 } 29 30 const FakeDefaultSeries = "precise" 31 32 // FakeConfig() returns an environment configuration for a 33 // fake provider with all required attributes set. 34 func FakeConfig() Attrs { 35 return Attrs{ 36 "type": "someprovider", 37 "name": "testenv", 38 "authorized-keys": FakeAuthKeys, 39 "firewall-mode": config.FwInstance, 40 "admin-secret": "fish", 41 "ca-cert": CACert, 42 "ca-private-key": CAKey, 43 "ssl-hostname-verification": true, 44 "development": false, 45 "state-port": 19034, 46 "api-port": 17777, 47 "default-series": FakeDefaultSeries, 48 } 49 } 50 51 // EnvironConfig returns a default environment configuration suitable for 52 // setting in the state. 53 func EnvironConfig(c *gc.C) *config.Config { 54 return CustomEnvironConfig(c, Attrs{}) 55 } 56 57 // CustomEnvironConfig returns an environment configuration with 58 // additional specified keys added. 59 func CustomEnvironConfig(c *gc.C, extra Attrs) *config.Config { 60 attrs := FakeConfig().Merge(Attrs{ 61 "agent-version": "1.2.3", 62 }).Merge(extra).Delete("admin-secret", "ca-private-key") 63 cfg, err := config.New(config.NoDefaults, attrs) 64 c.Assert(err, gc.IsNil) 65 return cfg 66 } 67 68 const ( 69 SampleEnvName = "erewhemos" 70 EnvDefault = "default:\n " + SampleEnvName + "\n" 71 ) 72 73 const DefaultMongoPassword = "conn-from-name-secret" 74 75 // Environment names below are explicit as it makes them more readable. 76 const SingleEnvConfigNoDefault = ` 77 environments: 78 erewhemos: 79 type: dummy 80 state-server: true 81 authorized-keys: i-am-a-key 82 admin-secret: ` + DefaultMongoPassword + ` 83 ` 84 85 const SingleEnvConfig = EnvDefault + SingleEnvConfigNoDefault 86 87 const MultipleEnvConfigNoDefault = ` 88 environments: 89 erewhemos: 90 type: dummy 91 state-server: true 92 authorized-keys: i-am-a-key 93 admin-secret: ` + DefaultMongoPassword + ` 94 erewhemos-2: 95 type: dummy 96 state-server: true 97 authorized-keys: i-am-a-key 98 admin-secret: ` + DefaultMongoPassword + ` 99 ` 100 101 const MultipleEnvConfig = EnvDefault + MultipleEnvConfigNoDefault 102 103 const SampleCertName = "erewhemos" 104 105 // FakeJujuHomeSuite isolates the user's home directory and 106 // sets up a Juju home with a sample environment and certificate. 107 type FakeJujuHomeSuite struct { 108 JujuOSEnvSuite 109 gitjujutesting.FakeHomeSuite 110 oldJujuHome string 111 } 112 113 func (s *FakeJujuHomeSuite) SetUpSuite(c *gc.C) { 114 s.JujuOSEnvSuite.SetUpTest(c) 115 s.FakeHomeSuite.SetUpTest(c) 116 } 117 118 func (s *FakeJujuHomeSuite) TearDownSuite(c *gc.C) { 119 s.FakeHomeSuite.SetUpTest(c) 120 s.JujuOSEnvSuite.SetUpTest(c) 121 } 122 123 func (s *FakeJujuHomeSuite) SetUpTest(c *gc.C) { 124 s.JujuOSEnvSuite.SetUpTest(c) 125 s.FakeHomeSuite.SetUpTest(c) 126 jujuHome := gitjujutesting.HomePath(".juju") 127 err := os.Mkdir(jujuHome, 0700) 128 c.Assert(err, gc.IsNil) 129 s.oldJujuHome = osenv.SetJujuHome(jujuHome) 130 WriteEnvironments(c, SingleEnvConfig, SampleCertName) 131 } 132 133 func (s *FakeJujuHomeSuite) TearDownTest(c *gc.C) { 134 osenv.SetJujuHome(s.oldJujuHome) 135 s.FakeHomeSuite.TearDownTest(c) 136 s.JujuOSEnvSuite.TearDownTest(c) 137 } 138 139 // MakeSampleJujuHome sets up a sample Juju environment. 140 func MakeSampleJujuHome(c *gc.C) { 141 WriteEnvironments(c, SingleEnvConfig, SampleCertName) 142 } 143 144 // WriteEnvironments creates an environments file with envConfig and certs 145 // from certNames. 146 func WriteEnvironments(c *gc.C, envConfig string, certNames ...string) { 147 envs := osenv.JujuHomePath("environments.yaml") 148 err := ioutil.WriteFile(envs, []byte(envConfig), 0644) 149 c.Assert(err, gc.IsNil) 150 for _, name := range certNames { 151 err := ioutil.WriteFile(osenv.JujuHomePath(name+"-cert.pem"), []byte(CACert), 0600) 152 c.Assert(err, gc.IsNil) 153 err = ioutil.WriteFile(osenv.JujuHomePath(name+"-private-key.pem"), []byte(CAKey), 0600) 154 c.Assert(err, gc.IsNil) 155 } 156 }