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  }