github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/service/agent_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package service_test 5 6 import ( 7 "path/filepath" 8 "runtime" 9 "strings" 10 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils" 13 "github.com/juju/utils/shell" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/juju/osenv" 17 "github.com/juju/juju/service" 18 "github.com/juju/juju/service/common" 19 ) 20 21 var ( 22 cmdSuffix string 23 shquote = utils.ShQuote 24 ) 25 26 func init() { 27 if runtime.GOOS == "windows" { 28 cmdSuffix = ".exe" 29 } 30 } 31 32 type agentSuite struct { 33 service.BaseSuite 34 } 35 36 var _ = gc.Suite(&agentSuite{}) 37 38 func (*agentSuite) TestAgentConfMachineLocal(c *gc.C) { 39 // We use two distinct directories to ensure the paths don't get 40 // mixed up during the call. 41 dataDir := c.MkDir() 42 logDir := c.MkDir() 43 info := service.NewMachineAgentInfo("0", dataDir, logDir) 44 renderer, err := shell.NewRenderer("") 45 c.Assert(err, jc.ErrorIsNil) 46 conf := service.AgentConf(info, renderer) 47 48 jujud := filepath.Join(dataDir, "tools", "machine-0", "jujud"+cmdSuffix) 49 cmd := strings.Join([]string{ 50 shquote(jujud), 51 "machine", 52 "--data-dir", shquote(dataDir), 53 "--machine-id", "0", 54 "--debug", 55 }, " ") 56 serviceBinary := jujud 57 serviceArgs := []string{ 58 "machine", 59 "--data-dir", dataDir, 60 "--machine-id", "0", 61 "--debug", 62 } 63 c.Check(conf, jc.DeepEquals, common.Conf{ 64 Desc: "juju agent for machine-0", 65 ExecStart: cmd, 66 Logfile: filepath.Join(logDir, "machine-0.log"), 67 Env: osenv.FeatureFlags(), 68 Limit: expectedLimits, 69 Timeout: 300, 70 ServiceBinary: serviceBinary, 71 ServiceArgs: serviceArgs, 72 }) 73 } 74 75 func (*agentSuite) TestAgentConfMachineUbuntu(c *gc.C) { 76 dataDir := "/var/lib/juju" 77 logDir := "/var/log/juju" 78 info := service.NewMachineAgentInfo("0", dataDir, logDir) 79 renderer, err := shell.NewRenderer("ubuntu") 80 c.Assert(err, jc.ErrorIsNil) 81 conf := service.AgentConf(info, renderer) 82 83 jujud := dataDir + "/tools/machine-0/jujud" 84 cmd := strings.Join([]string{ 85 shquote(dataDir + "/tools/machine-0/jujud"), 86 "machine", 87 "--data-dir", shquote(dataDir), 88 "--machine-id", "0", 89 "--debug", 90 }, " ") 91 serviceBinary := jujud 92 serviceArgs := []string{ 93 "machine", 94 "--data-dir", dataDir, 95 "--machine-id", "0", 96 "--debug", 97 } 98 c.Check(conf, jc.DeepEquals, common.Conf{ 99 Desc: "juju agent for machine-0", 100 ExecStart: cmd, 101 Logfile: logDir + "/machine-0.log", 102 Env: osenv.FeatureFlags(), 103 Limit: expectedLimits, 104 Timeout: 300, 105 ServiceBinary: serviceBinary, 106 ServiceArgs: serviceArgs, 107 }) 108 } 109 110 func (*agentSuite) TestAgentConfMachineWindows(c *gc.C) { 111 dataDir := `C:\Juju\lib\juju` 112 logDir := `C:\Juju\logs\juju` 113 info := service.NewMachineAgentInfo("0", dataDir, logDir) 114 renderer, err := shell.NewRenderer("windows") 115 c.Assert(err, jc.ErrorIsNil) 116 conf := service.AgentConf(info, renderer) 117 118 jujud := dataDir + `\tools\machine-0\jujud.exe` 119 cmd := strings.Join([]string{ 120 shquote(jujud), 121 "machine", 122 "--data-dir", shquote(dataDir), 123 "--machine-id", "0", 124 "--debug", 125 }, " ") 126 serviceBinary := jujud 127 serviceArgs := []string{ 128 "machine", 129 "--data-dir", dataDir, 130 "--machine-id", "0", 131 "--debug", 132 } 133 c.Check(conf, jc.DeepEquals, common.Conf{ 134 Desc: "juju agent for machine-0", 135 ExecStart: cmd, 136 Logfile: logDir + `\machine-0.log`, 137 Env: osenv.FeatureFlags(), 138 Limit: expectedLimits, 139 Timeout: 300, 140 ServiceBinary: serviceBinary, 141 ServiceArgs: serviceArgs, 142 }) 143 } 144 145 func (*agentSuite) TestAgentConfUnit(c *gc.C) { 146 dataDir := c.MkDir() 147 logDir := c.MkDir() 148 info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir) 149 renderer, err := shell.NewRenderer("") 150 c.Assert(err, jc.ErrorIsNil) 151 conf := service.AgentConf(info, renderer) 152 153 jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud"+cmdSuffix) 154 cmd := strings.Join([]string{ 155 shquote(jujud), 156 "unit", 157 "--data-dir", shquote(dataDir), 158 "--unit-name", "wordpress/0", 159 "--debug", 160 }, " ") 161 serviceBinary := jujud 162 serviceArgs := []string{ 163 "unit", 164 "--data-dir", dataDir, 165 "--unit-name", "wordpress/0", 166 "--debug", 167 } 168 c.Check(conf, jc.DeepEquals, common.Conf{ 169 Desc: "juju unit agent for wordpress/0", 170 ExecStart: cmd, 171 Logfile: filepath.Join(logDir, "unit-wordpress-0.log"), 172 Env: osenv.FeatureFlags(), 173 Timeout: 300, 174 ServiceBinary: serviceBinary, 175 ServiceArgs: serviceArgs, 176 }) 177 } 178 179 func (*agentSuite) TestContainerAgentConf(c *gc.C) { 180 dataDir := c.MkDir() 181 logDir := c.MkDir() 182 info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir) 183 renderer, err := shell.NewRenderer("") 184 c.Assert(err, jc.ErrorIsNil) 185 conf := service.ContainerAgentConf(info, renderer, "cont") 186 187 jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud"+cmdSuffix) 188 cmd := strings.Join([]string{ 189 shquote(jujud), 190 "unit", 191 "--data-dir", shquote(dataDir), 192 "--unit-name", "wordpress/0", 193 "--debug", 194 }, " ") 195 serviceBinary := jujud 196 serviceArgs := []string{ 197 "unit", 198 "--data-dir", dataDir, 199 "--unit-name", "wordpress/0", 200 "--debug", 201 } 202 env := osenv.FeatureFlags() 203 env[osenv.JujuContainerTypeEnvKey] = "cont" 204 c.Check(conf, jc.DeepEquals, common.Conf{ 205 Desc: "juju unit agent for wordpress/0", 206 ExecStart: cmd, 207 Logfile: filepath.Join(logDir, "unit-wordpress-0.log"), 208 Env: env, 209 Timeout: 300, 210 ServiceBinary: serviceBinary, 211 ServiceArgs: serviceArgs, 212 }) 213 } 214 215 func (*agentSuite) TestShutdownAfterConf(c *gc.C) { 216 conf, err := service.ShutdownAfterConf("spam") 217 c.Assert(err, jc.ErrorIsNil) 218 219 c.Check(conf, jc.DeepEquals, common.Conf{ 220 Desc: "juju shutdown job", 221 Transient: true, 222 AfterStopped: "spam", 223 ExecStart: "/sbin/shutdown -h now", 224 }) 225 renderer := &shell.BashRenderer{} 226 c.Check(conf.Validate(renderer), jc.ErrorIsNil) 227 } 228 229 func (*agentSuite) TestShutdownAfterConfMissingServiceName(c *gc.C) { 230 _, err := service.ShutdownAfterConf("") 231 232 c.Check(err, gc.ErrorMatches, `.*missing "after" service name.*`) 233 } 234 235 var expectedLimits = map[string]string{ 236 "nofile": "64000", // open files 237 }