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