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 }