github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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 "strings" 9 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils/v3" 13 "github.com/juju/utils/v3/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 shquote = utils.ShQuote 23 ) 24 25 type agentSuite struct { 26 testing.IsolationSuite 27 } 28 29 var _ = gc.Suite(&agentSuite{}) 30 31 func (*agentSuite) TestAgentConfMachineLocal(c *gc.C) { 32 // We use two distinct directories to ensure the paths don't get 33 // mixed up during the call. 34 dataDir := c.MkDir() 35 logDir := c.MkDir() 36 info := service.NewMachineAgentInfo("0", dataDir, logDir) 37 renderer, err := shell.NewRenderer("") 38 c.Assert(err, jc.ErrorIsNil) 39 conf := service.AgentConf(info, renderer) 40 41 jujud := filepath.Join(dataDir, "tools", "machine-0", "jujud") 42 cmd := strings.Join([]string{ 43 shquote(jujud), 44 "machine", 45 "--data-dir", shquote(dataDir), 46 "--machine-id", "0", 47 "--debug", 48 }, " ") 49 serviceBinary := jujud 50 serviceArgs := []string{ 51 "machine", 52 "--data-dir", dataDir, 53 "--machine-id", "0", 54 "--debug", 55 } 56 c.Check(conf, jc.DeepEquals, common.Conf{ 57 Desc: "juju agent for machine-0", 58 ExecStart: cmd, 59 Logfile: filepath.Join(logDir, "machine-0.log"), 60 Env: osenv.FeatureFlags(), 61 Limit: expectedLimits, 62 Timeout: 300, 63 ServiceBinary: serviceBinary, 64 ServiceArgs: serviceArgs, 65 }) 66 } 67 68 func (*agentSuite) TestAgentConfMachineUbuntu(c *gc.C) { 69 dataDir := "/var/lib/juju" 70 logDir := "/var/log/juju" 71 info := service.NewMachineAgentInfo("0", dataDir, logDir) 72 renderer, err := shell.NewRenderer("ubuntu") 73 c.Assert(err, jc.ErrorIsNil) 74 conf := service.AgentConf(info, renderer) 75 76 jujud := dataDir + "/tools/machine-0/jujud" 77 cmd := strings.Join([]string{ 78 shquote(dataDir + "/tools/machine-0/jujud"), 79 "machine", 80 "--data-dir", shquote(dataDir), 81 "--machine-id", "0", 82 "--debug", 83 }, " ") 84 serviceBinary := jujud 85 serviceArgs := []string{ 86 "machine", 87 "--data-dir", dataDir, 88 "--machine-id", "0", 89 "--debug", 90 } 91 c.Check(conf, jc.DeepEquals, common.Conf{ 92 Desc: "juju agent for machine-0", 93 ExecStart: cmd, 94 Logfile: logDir + "/machine-0.log", 95 Env: osenv.FeatureFlags(), 96 Limit: expectedLimits, 97 Timeout: 300, 98 ServiceBinary: serviceBinary, 99 ServiceArgs: serviceArgs, 100 }) 101 } 102 103 func (*agentSuite) TestAgentConfUnit(c *gc.C) { 104 dataDir := c.MkDir() 105 logDir := c.MkDir() 106 info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir) 107 renderer, err := shell.NewRenderer("") 108 c.Assert(err, jc.ErrorIsNil) 109 conf := service.AgentConf(info, renderer) 110 111 jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud") 112 cmd := strings.Join([]string{ 113 shquote(jujud), 114 "unit", 115 "--data-dir", shquote(dataDir), 116 "--unit-name", "wordpress/0", 117 "--debug", 118 }, " ") 119 serviceBinary := jujud 120 serviceArgs := []string{ 121 "unit", 122 "--data-dir", dataDir, 123 "--unit-name", "wordpress/0", 124 "--debug", 125 } 126 c.Check(conf, jc.DeepEquals, common.Conf{ 127 Desc: "juju unit agent for wordpress/0", 128 ExecStart: cmd, 129 Logfile: filepath.Join(logDir, "unit-wordpress-0.log"), 130 Env: osenv.FeatureFlags(), 131 Timeout: 300, 132 ServiceBinary: serviceBinary, 133 ServiceArgs: serviceArgs, 134 }) 135 } 136 137 func (*agentSuite) TestContainerAgentConf(c *gc.C) { 138 dataDir := c.MkDir() 139 logDir := c.MkDir() 140 info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir) 141 renderer, err := shell.NewRenderer("") 142 c.Assert(err, jc.ErrorIsNil) 143 conf := service.ContainerAgentConf(info, renderer, "cont") 144 145 jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud") 146 cmd := strings.Join([]string{ 147 shquote(jujud), 148 "unit", 149 "--data-dir", shquote(dataDir), 150 "--unit-name", "wordpress/0", 151 "--debug", 152 }, " ") 153 serviceBinary := jujud 154 serviceArgs := []string{ 155 "unit", 156 "--data-dir", dataDir, 157 "--unit-name", "wordpress/0", 158 "--debug", 159 } 160 env := osenv.FeatureFlags() 161 env[osenv.JujuContainerTypeEnvKey] = "cont" 162 c.Check(conf, jc.DeepEquals, common.Conf{ 163 Desc: "juju unit agent for wordpress/0", 164 ExecStart: cmd, 165 Logfile: filepath.Join(logDir, "unit-wordpress-0.log"), 166 Env: env, 167 Timeout: 300, 168 ServiceBinary: serviceBinary, 169 ServiceArgs: serviceArgs, 170 }) 171 } 172 173 func (*agentSuite) TestShutdownAfterConf(c *gc.C) { 174 conf, err := service.ShutdownAfterConf("spam") 175 c.Assert(err, jc.ErrorIsNil) 176 177 c.Check(conf, jc.DeepEquals, common.Conf{ 178 Desc: "juju shutdown job", 179 Transient: true, 180 AfterStopped: "spam", 181 ExecStart: "/sbin/shutdown -h now", 182 }) 183 renderer := &shell.BashRenderer{} 184 c.Check(conf.Validate(renderer), jc.ErrorIsNil) 185 } 186 187 func (*agentSuite) TestShutdownAfterConfMissingServiceName(c *gc.C) { 188 _, err := service.ShutdownAfterConf("") 189 190 c.Check(err, gc.ErrorMatches, `.*missing "after" service name.*`) 191 } 192 193 var expectedLimits = map[string]string{ 194 "nofile": "64000", // open files 195 }