launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cloudinit/sshinit/configure_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package sshinit_test
     5  
     6  import (
     7  	"regexp"
     8  
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"launchpad.net/juju-core/cloudinit"
    12  	"launchpad.net/juju-core/cloudinit/sshinit"
    13  	"launchpad.net/juju-core/constraints"
    14  	"launchpad.net/juju-core/environs"
    15  	envcloudinit "launchpad.net/juju-core/environs/cloudinit"
    16  	"launchpad.net/juju-core/environs/config"
    17  	envtools "launchpad.net/juju-core/environs/tools"
    18  	coretesting "launchpad.net/juju-core/testing"
    19  	"launchpad.net/juju-core/testing/testbase"
    20  	"launchpad.net/juju-core/tools"
    21  	"launchpad.net/juju-core/version"
    22  )
    23  
    24  type configureSuite struct {
    25  	testbase.LoggingSuite
    26  }
    27  
    28  var _ = gc.Suite(&configureSuite{})
    29  
    30  type testProvider struct {
    31  	environs.EnvironProvider
    32  }
    33  
    34  func (p *testProvider) SecretAttrs(cfg *config.Config) (map[string]string, error) {
    35  	return map[string]string{}, nil
    36  }
    37  
    38  func init() {
    39  	environs.RegisterProvider("sshinit_test", &testProvider{})
    40  }
    41  
    42  func testConfig(c *gc.C, stateServer bool, vers version.Binary) *config.Config {
    43  	testConfig, err := config.New(config.UseDefaults, coretesting.FakeConfig())
    44  	c.Assert(err, gc.IsNil)
    45  	testConfig, err = testConfig.Apply(map[string]interface{}{
    46  		"type":           "sshinit_test",
    47  		"default-series": vers.Series,
    48  		"agent-version":  vers.Number.String(),
    49  	})
    50  	c.Assert(err, gc.IsNil)
    51  	return testConfig
    52  }
    53  
    54  func (s *configureSuite) getCloudConfig(c *gc.C, stateServer bool, vers version.Binary) *cloudinit.Config {
    55  	var mcfg *envcloudinit.MachineConfig
    56  	if stateServer {
    57  		mcfg = environs.NewBootstrapMachineConfig("http://whatever/dotcom", "private-key")
    58  	} else {
    59  		mcfg = environs.NewMachineConfig("0", "ya", nil, nil)
    60  	}
    61  	mcfg.Tools = &tools.Tools{
    62  		Version: vers,
    63  		URL:     "file:///var/lib/juju/storage/" + envtools.StorageName(vers),
    64  	}
    65  	environConfig := testConfig(c, stateServer, vers)
    66  	err := environs.FinishMachineConfig(mcfg, environConfig, constraints.Value{})
    67  	c.Assert(err, gc.IsNil)
    68  	cloudcfg := cloudinit.New()
    69  	err = envcloudinit.Configure(mcfg, cloudcfg)
    70  	c.Assert(err, gc.IsNil)
    71  	return cloudcfg
    72  }
    73  
    74  var allSeries = [...]string{"precise", "quantal", "raring", "saucy"}
    75  
    76  func checkIff(checker gc.Checker, condition bool) gc.Checker {
    77  	if condition {
    78  		return checker
    79  	}
    80  	return gc.Not(checker)
    81  }
    82  
    83  var aptgetRegexp = "(.|\n)*" + regexp.QuoteMeta(sshinit.Aptget)
    84  
    85  func (s *configureSuite) TestAptSources(c *gc.C) {
    86  	for _, series := range allSeries {
    87  		vers := version.MustParseBinary("1.16.0-" + series + "-amd64")
    88  		script, err := sshinit.ConfigureScript(s.getCloudConfig(c, true, vers))
    89  		c.Assert(err, gc.IsNil)
    90  
    91  		// Only Precise requires the cloud-tools pocket.
    92  		//
    93  		// The only source we add that requires an explicitly
    94  		// specified key is cloud-tools.
    95  		needsCloudTools := series == "precise"
    96  		c.Assert(
    97  			script,
    98  			checkIff(gc.Matches, needsCloudTools),
    99  			"(.|\n)*apt-key add.*(.|\n)*",
   100  		)
   101  		c.Assert(
   102  			script,
   103  			checkIff(gc.Matches, needsCloudTools),
   104  			"(.|\n)*add-apt-repository.*cloud-tools(.|\n)*",
   105  		)
   106  		c.Assert(
   107  			script,
   108  			checkIff(gc.Matches, needsCloudTools),
   109  			"(.|\n)*Pin: release n=precise-updates/cloud-tools\nPin-Priority: 400(.|\n)*",
   110  		)
   111  		c.Assert(
   112  			script,
   113  			checkIff(gc.Matches, needsCloudTools),
   114  			"(.|\n)*install -D -m 644 /dev/null '/etc/apt/preferences.d/50-cloud-tools'(.|\n)*",
   115  		)
   116  
   117  		// Only Quantal requires the PPA (for mongo).
   118  		needsJujuPPA := series == "quantal"
   119  		c.Assert(
   120  			script,
   121  			checkIff(gc.Matches, needsJujuPPA),
   122  			"(.|\n)*add-apt-repository.*ppa:juju/stable(.|\n)*",
   123  		)
   124  
   125  		// Only install python-software-properties (add-apt-repository)
   126  		// if we need to.
   127  		c.Assert(
   128  			script,
   129  			checkIff(gc.Matches, needsCloudTools || needsJujuPPA),
   130  			aptgetRegexp+"install.*python-software-properties(.|\n)*",
   131  		)
   132  	}
   133  }
   134  
   135  func assertScriptMatches(c *gc.C, cfg *cloudinit.Config, pattern string, match bool) {
   136  	script, err := sshinit.ConfigureScript(cfg)
   137  	c.Assert(err, gc.IsNil)
   138  	checker := gc.Matches
   139  	if !match {
   140  		checker = gc.Not(checker)
   141  	}
   142  	c.Assert(script, checker, pattern)
   143  }
   144  
   145  func (s *configureSuite) TestAptUpdate(c *gc.C) {
   146  	// apt-get update is run if either AptUpdate is set,
   147  	// or apt sources are defined.
   148  	aptGetUpdatePattern := aptgetRegexp + "update(.|\n)*"
   149  	cfg := cloudinit.New()
   150  	c.Assert(cfg.AptUpdate(), gc.Equals, false)
   151  	c.Assert(cfg.AptSources(), gc.HasLen, 0)
   152  	assertScriptMatches(c, cfg, aptGetUpdatePattern, false)
   153  	cfg.SetAptUpdate(true)
   154  	assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
   155  	cfg.SetAptUpdate(false)
   156  	cfg.AddAptSource("source", "key", nil)
   157  	assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
   158  }
   159  
   160  func (s *configureSuite) TestAptUpgrade(c *gc.C) {
   161  	// apt-get upgrade is only run if AptUpgrade is set.
   162  	aptGetUpgradePattern := aptgetRegexp + "upgrade(.|\n)*"
   163  	cfg := cloudinit.New()
   164  	cfg.SetAptUpdate(true)
   165  	cfg.AddAptSource("source", "key", nil)
   166  	assertScriptMatches(c, cfg, aptGetUpgradePattern, false)
   167  	cfg.SetAptUpgrade(true)
   168  	assertScriptMatches(c, cfg, aptGetUpgradePattern, true)
   169  }