Skip to content

Commit 602dc99

Browse files
committed
e2e installer: share apt mirror hardening
1 parent 80d77fe commit 602dc99

3 files changed

Lines changed: 23 additions & 26 deletions

File tree

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,27 @@ func (h *Host) setSystemdVersion() {
8080
h.systemdVersion = version
8181
}
8282

83+
// ConfigureAptMirrors hardens apt against package-mirror outages on apt-based hosts.
84+
// It bounds apt's per-request timeout and retries so an unreachable mirror fails within
85+
// minutes instead of hanging until the CI job's 2h timeout, and on Ubuntu rewrites the apt
86+
// sources to a "mirror+file" list so apt fails over to the global archive.ubuntu.com /
87+
// ports.ubuntu.com mirrors when the regional EC2 mirror is down. This mirrors the pattern
88+
// used in Dockerfiles/agent/Dockerfile. See incident 58780.
89+
func (h *Host) ConfigureAptMirrors() {
90+
if h.pkgManager != "apt" {
91+
return
92+
}
93+
// Fail fast when a mirror is unreachable instead of retrying with long default TCP timeouts.
94+
h.remote.MustExecute(`printf 'Acquire::Retries "2";\nAcquire::http::Timeout "30";\nAcquire::https::Timeout "30";\n' | sudo tee /etc/apt/apt.conf.d/99datadog-e2e-fail-fast`)
95+
// Ubuntu EC2 AMIs point at a single regional mirror with no fallback; add global mirrors.
96+
if h.os.Flavor != e2eos.Ubuntu {
97+
return
98+
}
99+
h.remote.MustExecute(`printf 'http://us-east-1.ec2.archive.ubuntu.com/ubuntu\tpriority:1\nhttp://archive.ubuntu.com/ubuntu\n' | sudo tee /etc/apt/mirrorlist.main`)
100+
h.remote.MustExecute(`printf 'http://us-east-1.ec2.ports.ubuntu.com/ubuntu-ports\tpriority:1\nhttp://ports.ubuntu.com/ubuntu-ports\n' | sudo tee /etc/apt/mirrorlist.ports`)
101+
h.remote.MustExecute(`for f in /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources; do if [ -f "$f" ]; then sudo sed -i -e 's#http://[a-z0-9.-]*ec2\.archive\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://archive\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://security\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://[a-z0-9.-]*ec2\.ports\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.ports#g' -e 's#http://ports\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.ports#g' "$f"; fi; done`)
102+
}
103+
83104
// dockerImage returns the ECR pull-through URL for ecrPath when a registry is configured,
84105
// or publicFallback otherwise.
85106
func (h *Host) dockerImage(ecrPath, publicFallback string) string {

test/new-e2e/tests/installer/script/all_scripts_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ func (s *installerScriptBaseSuite) SetupSuite() {
136136
defer s.CleanupOnSetupFailure()
137137

138138
s.host = host.New(s.T, s.Env().RemoteHost, s.os, s.arch)
139+
s.host.ConfigureAptMirrors()
139140
}
140141

141142
type installerScriptBaseSuite struct {

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

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -168,37 +168,12 @@ func (s *packageBaseSuite) SetupSuite() {
168168
s.pipelineAgentVersion = PipelineAgentVersion(s.T())
169169
s.setupFakeIntake()
170170
s.host = host.New(s.T, s.Env().RemoteHost, s.os, s.arch)
171-
s.configureAptFailFast()
172-
s.configureAptMirrorList()
171+
s.host.ConfigureAptMirrors()
173172
s.disableUnattendedUpgrades()
174173
s.updateCurlOnUbuntu()
175174
s.updatePythonOnSuse()
176175
}
177176

178-
func (s *packageBaseSuite) configureAptFailFast() {
179-
// Bound apt's per-request timeout and retries on apt-based distributions so that
180-
// unreachable package mirrors fail within minutes instead of retrying with long
181-
// default TCP timeouts until the CI job's 2h timeout (see incident 58780).
182-
if _, err := s.Env().RemoteHost.Execute("which apt-get"); err != nil {
183-
return
184-
}
185-
s.Env().RemoteHost.MustExecute(`printf 'Acquire::Retries "2";\nAcquire::http::Timeout "30";\nAcquire::https::Timeout "30";\n' | sudo tee /etc/apt/apt.conf.d/99datadog-e2e-fail-fast`)
186-
}
187-
188-
func (s *packageBaseSuite) configureAptMirrorList() {
189-
// Ubuntu EC2 hosts use a single regional mirror (e.g. us-east-1.ec2.archive.ubuntu.com).
190-
// When it is unavailable apt has no fallback and the job hangs until the 2h timeout
191-
// (see incident 58780). Mirror the approach used in Dockerfiles/agent/Dockerfile:
192-
// rewrite the apt sources to a "mirror+file" list so apt fails over to the global
193-
// archive.ubuntu.com/ports.ubuntu.com mirrors when the regional one is down.
194-
if s.os.Flavor != e2eos.Ubuntu {
195-
return
196-
}
197-
s.Env().RemoteHost.MustExecute(`printf 'http://us-east-1.ec2.archive.ubuntu.com/ubuntu\tpriority:1\nhttp://archive.ubuntu.com/ubuntu\n' | sudo tee /etc/apt/mirrorlist.main`)
198-
s.Env().RemoteHost.MustExecute(`printf 'http://us-east-1.ec2.ports.ubuntu.com/ubuntu-ports\tpriority:1\nhttp://ports.ubuntu.com/ubuntu-ports\n' | sudo tee /etc/apt/mirrorlist.ports`)
199-
s.Env().RemoteHost.MustExecute(`for f in /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources; do if [ -f "$f" ]; then sudo sed -i -e 's#http://[a-z0-9.-]*ec2\.archive\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://archive\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://security\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.main#g' -e 's#http://[a-z0-9.-]*ec2\.ports\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.ports#g' -e 's#http://ports\.ubuntu\.com\S*#mirror+file:/etc/apt/mirrorlist.ports#g' "$f"; fi; done`)
200-
}
201-
202177
func (s *packageBaseSuite) updatePythonOnSuse() {
203178
// Suse15 comes with Python3.6 by default which is too old for injection
204179
if s.os.Flavor != e2eos.Suse {

0 commit comments

Comments
 (0)