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  }