Skip to content

Commit fcd78a2

Browse files
authored
(fleet) fix agent install without a pre-populated config (#25833)
* (fleet) fix agent install without a pre-populated config * nice to haves * align logic with the postinst * remove check that is no longer needed * oops * fix filemode for the datadog.yaml
1 parent eab5383 commit fcd78a2

File tree

6 files changed

+38
-31
lines changed

6 files changed

+38
-31
lines changed

pkg/fleet/installer/service/datadog_agent.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,51 +63,57 @@ func SetupAgent(ctx context.Context) (err error) {
6363

6464
for _, unit := range stableUnits {
6565
if err = loadUnit(ctx, unit); err != nil {
66-
return
66+
return err
6767
}
6868
}
6969
for _, unit := range experimentalUnits {
7070
if err = loadUnit(ctx, unit); err != nil {
71-
return
71+
return err
7272
}
7373
}
7474
if err = os.MkdirAll("/etc/datadog-agent", 0755); err != nil {
75-
return
75+
return err
7676
}
7777
ddAgentUID, ddAgentGID, err := getAgentIDs()
7878
if err != nil {
7979
return fmt.Errorf("error getting dd-agent user and group IDs: %w", err)
8080
}
8181

8282
if err = os.Chown("/etc/datadog-agent", ddAgentUID, ddAgentGID); err != nil {
83-
return
83+
return err
8484
}
8585

8686
if err = systemdReload(ctx); err != nil {
87-
return
87+
return err
8888
}
8989

9090
for _, unit := range stableUnits {
9191
if err = enableUnit(ctx, unit); err != nil {
92-
return
93-
}
94-
}
95-
for _, unit := range stableUnits {
96-
if err = startUnit(ctx, unit); err != nil {
97-
return
92+
return err
9893
}
9994
}
10095
if err = exec.CommandContext(ctx, "ln", "-sf", "/opt/datadog-packages/datadog-agent/stable/bin/agent/agent", agentSymlink).Run(); err != nil {
101-
return
96+
return err
10297
}
10398

10499
// write installinfo before start, or the agent could write it
105100
// TODO: add installer version properly
106101
if err = installinfo.WriteInstallInfo("installer_package", "manual_update"); err != nil {
107-
return
102+
return err
108103
}
109104

110-
return
105+
_, err = os.Stat("/etc/datadog-agent/datadog.yaml")
106+
if err != nil && !os.IsNotExist(err) {
107+
return err
108+
}
109+
// this is expected during a fresh install with the install script / asible / chef / etc...
110+
// the config is populated afterwards by the install method and the agent is restarted
111+
if !os.IsNotExist(err) {
112+
if err = startUnit(ctx, agentUnit); err != nil {
113+
return err
114+
}
115+
}
116+
return nil
111117
}
112118

113119
// RemoveAgent stops and removes the agent
@@ -152,7 +158,7 @@ func RemoveAgent(ctx context.Context) {
152158

153159
// StartAgentExperiment starts the agent experiment
154160
func StartAgentExperiment(ctx context.Context) error {
155-
return startUnit(ctx, agentExp)
161+
return startUnit(ctx, agentExp, "--no-block")
156162
}
157163

158164
// StopAgentExperiment stops the agent experiment

pkg/fleet/installer/service/datadog_installer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func RemoveInstaller(ctx context.Context) {
212212

213213
// StartInstallerExperiment installs the experimental systemd units for the installer
214214
func StartInstallerExperiment(ctx context.Context) error {
215-
return startUnit(ctx, installerUnitExp)
215+
return startUnit(ctx, installerUnitExp, "--no-block")
216216
}
217217

218218
// StopInstallerExperiment starts the stable systemd units for the installer

pkg/fleet/installer/service/systemd.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,20 @@ func findSystemdPath() (systemdPath string) {
3838
return debSystemdPath
3939
}
4040

41-
func stopUnit(ctx context.Context, unit string) error {
41+
func stopUnit(ctx context.Context, unit string, args ...string) error {
4242
span, _ := tracer.StartSpanFromContext(ctx, "stop_unit")
4343
defer span.Finish()
4444
span.SetTag("unit", unit)
45-
return exec.CommandContext(ctx, "systemctl", "stop", unit, "--no-block").Run()
45+
args = append([]string{"stop", unit}, args...)
46+
return exec.CommandContext(ctx, "systemctl", args...).Run()
4647
}
4748

48-
func startUnit(ctx context.Context, unit string) error {
49+
func startUnit(ctx context.Context, unit string, args ...string) error {
4950
span, _ := tracer.StartSpanFromContext(ctx, "start_unit")
5051
defer span.Finish()
5152
span.SetTag("unit", unit)
52-
return exec.CommandContext(ctx, "systemctl", "start", unit, "--no-block").Run()
53+
args = append([]string{"start", unit}, args...)
54+
return exec.CommandContext(ctx, "systemctl", args...).Run()
5355
}
5456

5557
func enableUnit(ctx context.Context, unit string) error {

test/new-e2e/tests/installer/all_packages_test.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ var (
6464
var packagesConfig = []testPackageConfig{
6565
{name: "datadog-installer", defaultVersion: fmt.Sprintf("pipeline-%v", os.Getenv("CI_PIPELINE_ID")), registry: "669783387624.dkr.ecr.us-east-1.amazonaws.com", auth: "ecr"},
6666
{name: "datadog-agent", defaultVersion: fmt.Sprintf("pipeline-%v", os.Getenv("CI_PIPELINE_ID")), registry: "669783387624.dkr.ecr.us-east-1.amazonaws.com", auth: "ecr"},
67-
{name: "datadog-apm-inject", defaultVersion: "latest", registry: "gcr.io/datadoghq", auth: "docker"},
67+
{name: "datadog-apm-inject", defaultVersion: "latest"},
6868
{name: "datadog-apm-library-java", defaultVersion: "latest"},
6969
{name: "datadog-apm-library-ruby", defaultVersion: "latest"},
7070
{name: "datadog-apm-library-js", defaultVersion: "latest"},
@@ -145,7 +145,7 @@ func (s *packageBaseSuite) ProvisionerOptions() []awshost.ProvisionerOption {
145145

146146
func (s *packageBaseSuite) SetupSuite() {
147147
s.BaseSuite.SetupSuite()
148-
s.setupGlobalEnv()
148+
s.setupFakeIntake()
149149
s.host = host.New(s.T(), s.Env().RemoteHost, s.os, s.arch)
150150
}
151151

@@ -168,14 +168,10 @@ func (s *packageBaseSuite) Purge() {
168168
s.Env().RemoteHost.MustExecute("sudo apt-get remove -y --purge datadog-installer || sudo yum remove -y datadog-installer")
169169
}
170170

171-
// setupGlobalEnv sets up the global environment variables for the agent processes
171+
// setupFakeIntake sets up the fake intake for the agent and trace agent.
172172
// This is done with SystemD environment files overrides to avoid having to touch the agent configuration files
173173
// and potentially interfere with the tests.
174-
func (s *packageBaseSuite) setupGlobalEnv() {
175-
// FIXME: this should be done in the installer
176-
s.Env().RemoteHost.MustExecute("sudo mkdir -p /etc/datadog-agent")
177-
s.Env().RemoteHost.MustExecute(`echo "api_key: deadbeefdeadbeefdeadbeefdeadbeef" | sudo tee /etc/datadog-agent/datadog.yaml`)
178-
174+
func (s *packageBaseSuite) setupFakeIntake() {
179175
var env []string
180176
if s.Env().FakeIntake != nil {
181177
env = append(env, []string{
@@ -189,8 +185,8 @@ func (s *packageBaseSuite) setupGlobalEnv() {
189185
}
190186
s.Env().RemoteHost.MustExecute("sudo mkdir -p /etc/systemd/system/datadog-agent.service.d")
191187
s.Env().RemoteHost.MustExecute("sudo mkdir -p /etc/systemd/system/datadog-agent-trace.service.d")
192-
s.Env().RemoteHost.MustExecute(`printf "[Service]\nEnvironmentFile=-/etc/environment\n" | sudo tee /etc/systemd/system/datadog-agent-trace.service.d/inject.conf`)
193-
s.Env().RemoteHost.MustExecute(`printf "[Service]\nEnvironmentFile=-/etc/environment\n" | sudo tee /etc/systemd/system/datadog-agent-trace.service.d/inject.conf`)
188+
s.Env().RemoteHost.MustExecute(`printf "[Service]\nEnvironmentFile=-/etc/environment\n" | sudo tee /etc/systemd/system/datadog-agent-trace.service.d/fake-intake.conf`)
189+
s.Env().RemoteHost.MustExecute(`printf "[Service]\nEnvironmentFile=-/etc/environment\n" | sudo tee /etc/systemd/system/datadog-agent-trace.service.d/fake-intake.conf`)
194190
s.Env().RemoteHost.MustExecute("sudo systemctl daemon-reload")
195191
}
196192

test/new-e2e/tests/installer/host/host.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/DataDog/datadog-agent/test/new-e2e/pkg/utils/e2e/client"
2222
e2eos "github.com/DataDog/test-infra-definitions/components/os"
2323
"github.com/stretchr/testify/assert"
24+
"github.com/stretchr/testify/require"
2425
)
2526

2627
// Host is a remote host environment.
@@ -88,7 +89,8 @@ func (h *Host) DeletePath(path string) {
8889
// WaitForUnitActive waits for a systemd unit to be active
8990
func (h *Host) WaitForUnitActive(units ...string) {
9091
for _, unit := range units {
91-
h.remote.MustExecute(fmt.Sprintf("timeout=30; unit=%s; while ! systemctl is-active --quiet $unit && [ $timeout -gt 0 ]; do sleep 1; ((timeout--)); done; [ $timeout -ne 0 ]", unit))
92+
_, err := h.remote.Execute(fmt.Sprintf("timeout=30; unit=%s; while ! systemctl is-active --quiet $unit && [ $timeout -gt 0 ]; do sleep 1; ((timeout--)); done; [ $timeout -ne 0 ]", unit))
93+
require.NoError(h.t, err, "unit %s did not become active", unit)
9294
}
9395
}
9496

test/new-e2e/tests/installer/package_agent_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func (s *packageAgentSuite) TestInstall() {
3434
state.AssertUnitsDead("datadog-agent-sysprobe.service", "datadog-agent-security.service")
3535

3636
state.AssertFileExists("/etc/datadog-agent/install_info", 0644, "root", "root")
37+
state.AssertFileExists("/etc/datadog-agent/datadog.yaml", 0640, "dd-agent", "dd-agent")
3738
// FIXME: this file is either dd-agent or root depending on the OS for some reason
3839
// state.AssertFileExists("/etc/datadog-agent/install.json", 0644, "dd-agent", "dd-agent")
3940
}

0 commit comments

Comments
 (0)