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 }