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  }