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 }