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 }