github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/service/agentconf_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // The test cases in this file do not pertain to a specific command.
     5  
     6  package service_test
     7  
     8  import (
     9  	"os"
    10  	"path"
    11  
    12  	"github.com/juju/errors"
    13  	"github.com/juju/names/v5"
    14  	jc "github.com/juju/testing/checkers"
    15  	"go.uber.org/mock/gomock"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/agent"
    19  	"github.com/juju/juju/service"
    20  	"github.com/juju/juju/service/common"
    21  	"github.com/juju/juju/service/mocks"
    22  	"github.com/juju/juju/testing"
    23  	jujuversion "github.com/juju/juju/version"
    24  )
    25  
    26  type agentConfSuite struct {
    27  	testing.BaseSuite
    28  
    29  	agentConf           agent.Config
    30  	dataDir             string
    31  	machineName         string
    32  	unitNames           []string
    33  	systemdDir          string
    34  	systemdMultiUserDir string
    35  	systemdDataDir      string // service.SystemdDataDir
    36  	manager             service.SystemdServiceManager
    37  
    38  	services []*mocks.MockService
    39  }
    40  
    41  func (s *agentConfSuite) SetUpSuite(c *gc.C) {
    42  	s.BaseSuite.SetUpSuite(c)
    43  }
    44  
    45  func (s *agentConfSuite) SetUpTest(c *gc.C) {
    46  	s.BaseSuite.SetUpTest(c)
    47  
    48  	s.dataDir = c.MkDir()
    49  	s.systemdDir = path.Join(s.dataDir, "etc", "systemd", "system")
    50  	s.systemdMultiUserDir = path.Join(s.systemdDir, "multi-user.target.wants")
    51  	c.Assert(os.MkdirAll(s.systemdMultiUserDir, os.ModeDir|os.ModePerm), jc.ErrorIsNil)
    52  	s.systemdDataDir = path.Join(s.dataDir, "lib", "systemd", "system")
    53  
    54  	s.machineName = "machine-0"
    55  	s.unitNames = []string{"unit-ubuntu-0", "unit-mysql-0"}
    56  
    57  	s.manager = service.NewServiceManager(
    58  		func() bool { return true },
    59  		s.newService,
    60  	)
    61  
    62  	s.assertSetupAgentsForTest(c)
    63  	s.setUpAgentConf(c)
    64  }
    65  
    66  func (s *agentConfSuite) TearDownTest(c *gc.C) {
    67  	s.services = nil
    68  	s.BaseSuite.TearDownTest(c)
    69  }
    70  
    71  var _ = gc.Suite(&agentConfSuite{})
    72  
    73  func (s *agentConfSuite) setUpAgentConf(c *gc.C) {
    74  	configParams := agent.AgentConfigParams{
    75  		Paths:             agent.Paths{DataDir: s.dataDir},
    76  		Tag:               names.NewMachineTag("0"),
    77  		UpgradedToVersion: jujuversion.Current,
    78  		APIAddresses:      []string{"localhost:17070"},
    79  		CACert:            testing.CACert,
    80  		Password:          "fake",
    81  		Controller:        testing.ControllerTag,
    82  		Model:             testing.ModelTag,
    83  	}
    84  
    85  	agentConf, err := agent.NewAgentConfig(configParams)
    86  	c.Assert(err, jc.ErrorIsNil)
    87  
    88  	err = agentConf.Write()
    89  	c.Assert(err, jc.ErrorIsNil)
    90  
    91  	s.agentConf = agentConf
    92  }
    93  
    94  func (s *agentConfSuite) setUpServices(ctrl *gomock.Controller) {
    95  	s.addService(ctrl, "jujud-"+s.machineName)
    96  }
    97  
    98  func (s *agentConfSuite) addService(ctrl *gomock.Controller, name string) {
    99  	svc := mocks.NewMockService(ctrl)
   100  	svc.EXPECT().Name().Return(name).AnyTimes()
   101  	s.services = append(s.services, svc)
   102  }
   103  
   104  func (s *agentConfSuite) newService(name string, _ common.Conf) (service.Service, error) {
   105  	for _, svc := range s.services {
   106  		if svc.Name() == name {
   107  			return svc, nil
   108  		}
   109  	}
   110  	return nil, errors.NotFoundf("service %q", name)
   111  }
   112  
   113  func (s *agentConfSuite) assertSetupAgentsForTest(c *gc.C) {
   114  	agentsDir := path.Join(s.dataDir, "agents")
   115  	err := os.MkdirAll(path.Join(agentsDir, s.machineName), os.ModeDir|os.ModePerm)
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	for _, unit := range s.unitNames {
   118  		err = os.Mkdir(path.Join(agentsDir, unit), os.ModeDir|os.ModePerm)
   119  		c.Assert(err, jc.ErrorIsNil)
   120  	}
   121  }
   122  
   123  func (s *agentConfSuite) TestFindAgents(c *gc.C) {
   124  	machineAgent, unitAgents, errAgents, err := s.manager.FindAgents(s.dataDir)
   125  	c.Assert(err, jc.ErrorIsNil)
   126  
   127  	c.Assert(machineAgent, gc.Equals, s.machineName)
   128  	c.Assert(unitAgents, jc.SameContents, s.unitNames)
   129  	c.Assert(errAgents, gc.HasLen, 0)
   130  }
   131  
   132  func (s *agentConfSuite) TestFindAgentsUnexpectedTagType(c *gc.C) {
   133  	unexpectedAgent := names.NewApplicationTag("failme").String()
   134  	unexpectedAgentDir := path.Join(s.dataDir, "agents", unexpectedAgent)
   135  	err := os.MkdirAll(unexpectedAgentDir, os.ModeDir|os.ModePerm)
   136  	c.Assert(err, jc.ErrorIsNil)
   137  
   138  	machineAgent, unitAgents, unexpectedAgents, err := s.manager.FindAgents(s.dataDir)
   139  	c.Assert(err, jc.ErrorIsNil)
   140  	c.Assert(machineAgent, gc.Equals, s.machineName)
   141  	c.Assert(unitAgents, jc.SameContents, s.unitNames)
   142  	c.Assert(unexpectedAgents, gc.DeepEquals, []string{unexpectedAgent})
   143  }
   144  
   145  func (s *agentConfSuite) TestCreateAgentConfDesc(c *gc.C) {
   146  	conf, err := s.manager.CreateAgentConf("machine-2", s.dataDir)
   147  	c.Assert(err, jc.ErrorIsNil)
   148  	// Spot check Conf
   149  	c.Assert(conf.Desc, gc.Equals, "juju agent for machine-2")
   150  }
   151  
   152  func (s *agentConfSuite) TestCreateAgentConfLogPath(c *gc.C) {
   153  	conf, err := s.manager.CreateAgentConf("machine-2", s.dataDir)
   154  	c.Assert(err, jc.ErrorIsNil)
   155  	c.Assert(conf.Logfile, gc.Equals, "/var/log/juju/machine-2.log")
   156  }
   157  
   158  func (s *agentConfSuite) TestCreateAgentConfFailAgentKind(c *gc.C) {
   159  	_, err := s.manager.CreateAgentConf("application-fail", s.dataDir)
   160  	c.Assert(err, gc.ErrorMatches, `agent "application-fail" is neither a machine nor a unit`)
   161  }
   162  
   163  func (s *agentConfSuite) TestWriteSystemdAgent(c *gc.C) {
   164  	ctrl := gomock.NewController(c)
   165  	defer ctrl.Finish()
   166  
   167  	s.setUpServices(ctrl)
   168  	s.services[0].EXPECT().WriteService().Return(nil)
   169  
   170  	err := s.manager.WriteSystemdAgent(
   171  		s.machineName, s.systemdDataDir, s.systemdMultiUserDir)
   172  	c.Assert(err, jc.ErrorIsNil)
   173  }
   174  
   175  func (s *agentConfSuite) TestWriteSystemdAgentSystemdNotRunning(c *gc.C) {
   176  	ctrl := gomock.NewController(c)
   177  	defer ctrl.Finish()
   178  
   179  	s.setUpServices(ctrl)
   180  	s.services[0].EXPECT().WriteService().Return(nil)
   181  
   182  	s.manager = service.NewServiceManager(
   183  		func() bool { return false },
   184  		s.newService,
   185  	)
   186  
   187  	err := s.manager.WriteSystemdAgent(
   188  		s.machineName, s.systemdDataDir, s.systemdMultiUserDir)
   189  	c.Assert(err, jc.ErrorIsNil)
   190  }
   191  
   192  func (s *agentConfSuite) TestWriteSystemdAgentWriteServiceFail(c *gc.C) {
   193  	ctrl := gomock.NewController(c)
   194  	defer ctrl.Finish()
   195  
   196  	s.setUpServices(ctrl)
   197  	s.services[0].EXPECT().WriteService().Return(errors.New("fail me"))
   198  
   199  	err := s.manager.WriteSystemdAgent(
   200  		s.machineName, s.systemdDataDir, s.systemdMultiUserDir)
   201  	c.Assert(err, gc.ErrorMatches, "fail me")
   202  }