github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	"github.com/juju/juju/cloudinit"
    12  	"github.com/juju/juju/cloudinit/sshinit"
    13  	"github.com/juju/juju/constraints"
    14  	"github.com/juju/juju/environs"
    15  	envcloudinit "github.com/juju/juju/environs/cloudinit"
    16  	"github.com/juju/juju/environs/config"
    17  	envtools "github.com/juju/juju/environs/tools"
    18  	"github.com/juju/juju/state/api/params"
    19  	coretesting "github.com/juju/juju/testing"
    20  	"github.com/juju/juju/tools"
    21  	"github.com/juju/juju/version"
    22  )
    23  
    24  type configureSuite struct {
    25  	coretesting.BaseSuite
    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("private-key")
    58  		mcfg.InstanceId = "instance-id"
    59  		mcfg.Jobs = []params.MachineJob{params.JobManageEnviron, params.JobHostUnits}
    60  	} else {
    61  		mcfg = environs.NewMachineConfig("0", "ya", nil, 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 install python-software-properties (add-apt-repository)
   121  		// if we need to.
   122  		c.Assert(
   123  			script,
   124  			checkIff(gc.Matches, needsCloudTools),
   125  			aptgetRegexp+"install.*python-software-properties(.|\n)*",
   126  		)
   127  	}
   128  }
   129  
   130  func assertScriptMatches(c *gc.C, cfg *cloudinit.Config, pattern string, match bool) {
   131  	script, err := sshinit.ConfigureScript(cfg)
   132  	c.Assert(err, gc.IsNil)
   133  	checker := gc.Matches
   134  	if !match {
   135  		checker = gc.Not(checker)
   136  	}
   137  	c.Assert(script, checker, pattern)
   138  }
   139  
   140  func (s *configureSuite) TestAptUpdate(c *gc.C) {
   141  	// apt-get update is run if either AptUpdate is set,
   142  	// or apt sources are defined.
   143  	aptGetUpdatePattern := aptgetRegexp + "update(.|\n)*"
   144  	cfg := cloudinit.New()
   145  	c.Assert(cfg.AptUpdate(), gc.Equals, false)
   146  	c.Assert(cfg.AptSources(), gc.HasLen, 0)
   147  	assertScriptMatches(c, cfg, aptGetUpdatePattern, false)
   148  	cfg.SetAptUpdate(true)
   149  	assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
   150  	cfg.SetAptUpdate(false)
   151  	cfg.AddAptSource("source", "key", nil)
   152  	assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
   153  }
   154  
   155  func (s *configureSuite) TestAptUpgrade(c *gc.C) {
   156  	// apt-get upgrade is only run if AptUpgrade is set.
   157  	aptGetUpgradePattern := aptgetRegexp + "upgrade(.|\n)*"
   158  	cfg := cloudinit.New()
   159  	cfg.SetAptUpdate(true)
   160  	cfg.AddAptSource("source", "key", nil)
   161  	assertScriptMatches(c, cfg, aptGetUpgradePattern, false)
   162  	cfg.SetAptUpgrade(true)
   163  	assertScriptMatches(c, cfg, aptGetUpgradePattern, true)
   164  }