Skip to content

Commit 7b3817a

Browse files
committed
wire agent install source at startup
1 parent 76d1df6 commit 7b3817a

File tree

4 files changed

+64
-16
lines changed

4 files changed

+64
-16
lines changed

internal/pkg/agent/application/application.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"go.elastic.co/apm/v2"
1414

15+
v1 "github.com/elastic/elastic-agent/pkg/api/v1"
1516
"github.com/elastic/elastic-agent/pkg/utils/install"
1617
"github.com/elastic/go-ucfg"
1718

@@ -64,7 +65,7 @@ func New(
6465
fleetInitTimeout time.Duration,
6566
disableMonitoring bool,
6667
override CfgOverrider,
67-
initialUpgradeDetails *details.Details,
68+
initialUpdateMarker *upgrade.UpdateMarker,
6869
modifiers ...component.PlatformModifier,
6970
) (*coordinator.Coordinator, coordinator.ConfigManager, composable.Controller, error) {
7071

@@ -124,9 +125,39 @@ func New(
124125
override(cfg)
125126
}
126127

128+
var installDescriptorSource *install.FileDescriptorSource = nil
129+
130+
installDescriptorSource = install.NewFileDescriptorSource(filepath.Join(paths.Top(), paths.MarkerFileName))
131+
if platform.OS != component.Container {
132+
if initialUpdateMarker != nil && initialUpdateMarker.Details != nil && initialUpdateMarker.Details.State == details.StateRollback {
133+
// Take the versionedHome of the version we rolledback from and remove it from the installation lists
134+
_, removeInstallDescErr := installDescriptorSource.RemoveAgentInstallDesc(initialUpdateMarker.VersionedHome /* there should be the versionedHome from the upgrade marker here*/)
135+
if removeInstallDescErr != nil {
136+
log.Warnf("Error removing rolled back version %s installed in %s: %v", initialUpdateMarker.VersionedHome, initialUpdateMarker.VersionedHome, removeInstallDescErr)
137+
}
138+
139+
currentVersionedHome, _ := filepath.Rel(paths.Top(), paths.Home())
140+
// Set the current version as active and all the others as inactive
141+
_, updateInstallDescErr := installDescriptorSource.ModifyInstallDesc(func(desc *v1.AgentInstallDesc) error {
142+
if desc.VersionedHome == currentVersionedHome {
143+
// set the current version as active and make sure it doesn't have a TTL
144+
desc.Active = true
145+
desc.TTL = nil
146+
} else {
147+
// any other install is not the active one
148+
desc.Active = false
149+
}
150+
return nil
151+
})
152+
if updateInstallDescErr != nil {
153+
log.Warnf("Error removing rolled back version %s installed in %s")
154+
}
155+
}
156+
}
157+
127158
// monitoring is not supported in bootstrap mode https://github.com/elastic/elastic-agent/issues/1761
128159
isMonitoringSupported := !disableMonitoring && cfg.Settings.V1MonitoringEnabled
129-
upgrader, err := upgrade.NewUpgrader(log, cfg.Settings.DownloadConfig, cfg.Settings.Upgrade, agentInfo, new(upgrade.AgentWatcherHelper), install.NewFileDescriptorSource(filepath.Join(paths.Top(), paths.MarkerFileName)))
160+
upgrader, err := upgrade.NewUpgrader(log, cfg.Settings.DownloadConfig, cfg.Settings.Upgrade, agentInfo, new(upgrade.AgentWatcherHelper), installDescriptorSource)
130161
if err != nil {
131162
return nil, nil, nil, fmt.Errorf("failed to create upgrader: %w", err)
132163
}
@@ -144,6 +175,12 @@ func New(
144175
return nil, nil, nil, fmt.Errorf("failed to initialize runtime manager: %w", err)
145176
}
146177

178+
// prepare initialUpgradeDetails for injecting it in coordinator later on
179+
var initialUpgradeDetails *details.Details
180+
if initialUpdateMarker != nil && initialUpdateMarker.Details != nil {
181+
initialUpgradeDetails = initialUpdateMarker.Details
182+
}
183+
147184
var configMgr coordinator.ConfigManager
148185
var managed *managedConfigManager
149186
var compModifiers = []coordinator.ComponentsModifier{InjectAPMConfig}

internal/pkg/agent/application/upgrade/upgrade.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -460,15 +460,30 @@ func (u *Upgrader) Upgrade(ctx context.Context, version string, rollback bool, s
460460
return nil, goerrors.Join(err, rollbackErr)
461461
}
462462

463-
//FIXME make it nicer
463+
rollbackWindow := time.Duration(0)
464+
if u.upgradeSettings != nil && u.upgradeSettings.Rollback != nil {
465+
rollbackWindow = u.upgradeSettings.Rollback.Window
466+
}
467+
468+
var currentInstallTTL *time.Time = nil
469+
if rollbackWindow > 0 {
470+
currentInstallTTLVar := time.Now().Add(rollbackWindow)
471+
currentInstallTTL = &currentInstallTTLVar
472+
}
473+
464474
_, err = u.installDescriptorSource.ModifyInstallDesc(
465475
func(desc *v1.AgentInstallDesc) error {
466476
if desc.VersionedHome == unpackRes.VersionedHome {
467477
desc.Active = true
468478
return nil
479+
} else {
480+
desc.Active = false
481+
}
482+
483+
if desc.VersionedHome == currentVersionedHome {
484+
desc.TTL = currentInstallTTL
469485
}
470486

471-
desc.Active = false
472487
return nil
473488
},
474489
)
@@ -501,10 +516,7 @@ func (u *Upgrader) Upgrade(ctx context.Context, version string, rollback bool, s
501516
hash: release.Commit(),
502517
versionedHome: currentVersionedHome,
503518
}
504-
rollbackWindow := time.Duration(0)
505-
if u.upgradeSettings != nil && u.upgradeSettings.Rollback != nil {
506-
rollbackWindow = u.upgradeSettings.Rollback.Window
507-
}
519+
508520
if err := u.markUpgrade(u.log,
509521
paths.Data(), // data dir to place the marker in
510522
time.Now(),

internal/pkg/agent/cmd/run.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import (
4141
"github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
4242
"github.com/elastic/elastic-agent/internal/pkg/agent/application/secret"
4343
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
44-
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
4544
"github.com/elastic/elastic-agent/internal/pkg/agent/configuration"
4645
"github.com/elastic/elastic-agent/internal/pkg/agent/errors"
4746
"github.com/elastic/elastic-agent/internal/pkg/agent/install"
@@ -141,7 +140,7 @@ func run(override application.CfgOverrider, testingMode bool, fleetInitTimeout t
141140
defer cancel()
142141
go service.ProcessWindowsControlEvents(stopBeat)
143142

144-
upgradeDetailsFromMarker, err := handleUpgrade()
143+
initialUpdateMarker, err := handleUpgrade()
145144
if err != nil {
146145
return fmt.Errorf("error checking for and handling upgrade: %w", err)
147146
}
@@ -154,7 +153,7 @@ func run(override application.CfgOverrider, testingMode bool, fleetInitTimeout t
154153
_ = locker.Unlock()
155154
}()
156155

157-
return runElasticAgent(ctx, cancel, override, stop, testingMode, fleetInitTimeout, upgradeDetailsFromMarker, modifiers...)
156+
return runElasticAgent(ctx, cancel, override, stop, testingMode, fleetInitTimeout, initialUpdateMarker, modifiers...)
158157
}
159158

160159
func logReturn(l *logger.Logger, err error) error {
@@ -171,7 +170,7 @@ func runElasticAgent(
171170
stop chan bool,
172171
testingMode bool,
173172
fleetInitTimeout time.Duration,
174-
upgradeDetailsFromMarker *details.Details,
173+
initialUpgradeMarker *upgrade.UpdateMarker,
175174
modifiers ...component.PlatformModifier,
176175
) error {
177176
err := coordinator.RestoreConfig()
@@ -296,7 +295,7 @@ func runElasticAgent(
296295

297296
isBootstrap := configuration.IsFleetServerBootstrap(cfg.Fleet)
298297
coord, configMgr, _, err := application.New(ctx, l, baseLogger, logLvl, agentInfo, rex, tracer, testingMode,
299-
fleetInitTimeout, isBootstrap, override, upgradeDetailsFromMarker, modifiers...)
298+
fleetInitTimeout, isBootstrap, override, initialUpgradeMarker, modifiers...)
300299
if err != nil {
301300
return logReturn(l, err)
302301
}
@@ -680,7 +679,7 @@ func setupMetrics(
680679
// handleUpgrade checks if agent is being run as part of an
681680
// ongoing upgrade operation, i.e. being re-exec'd and performs
682681
// any upgrade-specific work, if needed.
683-
func handleUpgrade() (*details.Details, error) {
682+
func handleUpgrade() (*upgrade.UpdateMarker, error) {
684683
upgradeMarker, err := upgrade.LoadMarker(paths.Data())
685684
if err != nil {
686685
return nil, fmt.Errorf("unable to load upgrade marker to check if Agent is being upgraded: %w", err)
@@ -699,7 +698,7 @@ func handleUpgrade() (*details.Details, error) {
699698
return nil, err
700699
}
701700

702-
return upgradeMarker.Details, nil
701+
return upgradeMarker, nil
703702
}
704703

705704
func ensureInstallMarkerPresent() error {

internal/pkg/agent/install/install.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func Install(cfgFile, topPath string, unprivileged bool, log *logp.Logger, pt *p
7373

7474
targetVersionedHome := filepath.FromSlash(pathMapper.Map(manifest.Package.VersionedHome))
7575

76-
err = setupInstallPath(topPath, ownership, targetVersionedHome, manifest.Package.Version, flavor)
76+
err = setupInstallPath(topPath, ownership, targetVersionedHome, manifestutils.GetFullVersion(manifest), flavor)
7777
if err != nil {
7878
return utils.FileOwner{}, fmt.Errorf("error setting up install path: %w", err)
7979
}

0 commit comments

Comments
 (0)