github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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: map[string]int{
    69  			"nofile": 20000,
    70  		},
    71  		Timeout:       300,
    72  		ServiceBinary: serviceBinary,
    73  		ServiceArgs:   serviceArgs,
    74  	})
    75  }
    76  
    77  func (*agentSuite) TestAgentConfMachineUbuntu(c *gc.C) {
    78  	dataDir := "/var/lib/juju"
    79  	logDir := "/var/log/juju"
    80  	info := service.NewMachineAgentInfo("0", dataDir, logDir)
    81  	renderer, err := shell.NewRenderer("ubuntu")
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	conf := service.AgentConf(info, renderer)
    84  
    85  	jujud := dataDir + "/tools/machine-0/jujud"
    86  	cmd := strings.Join([]string{
    87  		shquote(dataDir + "/tools/machine-0/jujud"),
    88  		"machine",
    89  		"--data-dir", shquote(dataDir),
    90  		"--machine-id", "0",
    91  		"--debug",
    92  	}, " ")
    93  	serviceBinary := jujud
    94  	serviceArgs := []string{
    95  		"machine",
    96  		"--data-dir", dataDir,
    97  		"--machine-id", "0",
    98  		"--debug",
    99  	}
   100  	c.Check(conf, jc.DeepEquals, common.Conf{
   101  		Desc:      "juju agent for machine-0",
   102  		ExecStart: cmd,
   103  		Logfile:   logDir + "/machine-0.log",
   104  		Env:       osenv.FeatureFlags(),
   105  		Limit: map[string]int{
   106  			"nofile": 20000,
   107  		},
   108  		Timeout:       300,
   109  		ServiceBinary: serviceBinary,
   110  		ServiceArgs:   serviceArgs,
   111  	})
   112  }
   113  
   114  func (*agentSuite) TestAgentConfMachineWindows(c *gc.C) {
   115  	dataDir := `C:\Juju\lib\juju`
   116  	logDir := `C:\Juju\logs\juju`
   117  	info := service.NewMachineAgentInfo("0", dataDir, logDir)
   118  	renderer, err := shell.NewRenderer("windows")
   119  	c.Assert(err, jc.ErrorIsNil)
   120  	conf := service.AgentConf(info, renderer)
   121  
   122  	jujud := dataDir + `\tools\machine-0\jujud.exe`
   123  	cmd := strings.Join([]string{
   124  		shquote(jujud),
   125  		"machine",
   126  		"--data-dir", shquote(dataDir),
   127  		"--machine-id", "0",
   128  		"--debug",
   129  	}, " ")
   130  	serviceBinary := jujud
   131  	serviceArgs := []string{
   132  		"machine",
   133  		"--data-dir", dataDir,
   134  		"--machine-id", "0",
   135  		"--debug",
   136  	}
   137  	c.Check(conf, jc.DeepEquals, common.Conf{
   138  		Desc:      "juju agent for machine-0",
   139  		ExecStart: cmd,
   140  		Logfile:   logDir + `\machine-0.log`,
   141  		Env:       osenv.FeatureFlags(),
   142  		Limit: map[string]int{
   143  			"nofile": 20000,
   144  		},
   145  		Timeout:       300,
   146  		ServiceBinary: serviceBinary,
   147  		ServiceArgs:   serviceArgs,
   148  	})
   149  }
   150  
   151  func (*agentSuite) TestAgentConfUnit(c *gc.C) {
   152  	dataDir := c.MkDir()
   153  	logDir := c.MkDir()
   154  	info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir)
   155  	renderer, err := shell.NewRenderer("")
   156  	c.Assert(err, jc.ErrorIsNil)
   157  	conf := service.AgentConf(info, renderer)
   158  
   159  	jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud"+cmdSuffix)
   160  	cmd := strings.Join([]string{
   161  		shquote(jujud),
   162  		"unit",
   163  		"--data-dir", shquote(dataDir),
   164  		"--unit-name", "wordpress/0",
   165  		"--debug",
   166  	}, " ")
   167  	serviceBinary := jujud
   168  	serviceArgs := []string{
   169  		"unit",
   170  		"--data-dir", dataDir,
   171  		"--unit-name", "wordpress/0",
   172  		"--debug",
   173  	}
   174  	c.Check(conf, jc.DeepEquals, common.Conf{
   175  		Desc:          "juju unit agent for wordpress/0",
   176  		ExecStart:     cmd,
   177  		Logfile:       filepath.Join(logDir, "unit-wordpress-0.log"),
   178  		Env:           osenv.FeatureFlags(),
   179  		Timeout:       300,
   180  		ServiceBinary: serviceBinary,
   181  		ServiceArgs:   serviceArgs,
   182  	})
   183  }
   184  
   185  func (*agentSuite) TestContainerAgentConf(c *gc.C) {
   186  	dataDir := c.MkDir()
   187  	logDir := c.MkDir()
   188  	info := service.NewUnitAgentInfo("wordpress/0", dataDir, logDir)
   189  	renderer, err := shell.NewRenderer("")
   190  	c.Assert(err, jc.ErrorIsNil)
   191  	conf := service.ContainerAgentConf(info, renderer, "cont")
   192  
   193  	jujud := filepath.Join(dataDir, "tools", "unit-wordpress-0", "jujud"+cmdSuffix)
   194  	cmd := strings.Join([]string{
   195  		shquote(jujud),
   196  		"unit",
   197  		"--data-dir", shquote(dataDir),
   198  		"--unit-name", "wordpress/0",
   199  		"--debug",
   200  	}, " ")
   201  	serviceBinary := jujud
   202  	serviceArgs := []string{
   203  		"unit",
   204  		"--data-dir", dataDir,
   205  		"--unit-name", "wordpress/0",
   206  		"--debug",
   207  	}
   208  	env := osenv.FeatureFlags()
   209  	env[osenv.JujuContainerTypeEnvKey] = "cont"
   210  	c.Check(conf, jc.DeepEquals, common.Conf{
   211  		Desc:          "juju unit agent for wordpress/0",
   212  		ExecStart:     cmd,
   213  		Logfile:       filepath.Join(logDir, "unit-wordpress-0.log"),
   214  		Env:           env,
   215  		Timeout:       300,
   216  		ServiceBinary: serviceBinary,
   217  		ServiceArgs:   serviceArgs,
   218  	})
   219  }
   220  
   221  func (*agentSuite) TestShutdownAfterConf(c *gc.C) {
   222  	conf, err := service.ShutdownAfterConf("spam")
   223  	c.Assert(err, jc.ErrorIsNil)
   224  
   225  	c.Check(conf, jc.DeepEquals, common.Conf{
   226  		Desc:         "juju shutdown job",
   227  		Transient:    true,
   228  		AfterStopped: "spam",
   229  		ExecStart:    "/sbin/shutdown -h now",
   230  	})
   231  	renderer := &shell.BashRenderer{}
   232  	c.Check(conf.Validate(renderer), jc.ErrorIsNil)
   233  }
   234  
   235  func (*agentSuite) TestShutdownAfterConfMissingServiceName(c *gc.C) {
   236  	_, err := service.ShutdownAfterConf("")
   237  
   238  	c.Check(err, gc.ErrorMatches, `.*missing "after" service name.*`)
   239  }