Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
da42187
agent: export secure binary upgrade installer
bcho Aug 6, 2026
5e0aab6
agent: expose secure install validation
bcho Aug 6, 2026
8173c7e
agent: harden reusable upgrade API
bcho Aug 6, 2026
72a2179
agent: use secure installer for managed upgrades
bcho Aug 6, 2026
75333be
agent: remove duplicate upgrade staging path
bcho Aug 6, 2026
10ab536
agent: address secure installer review
bcho Aug 6, 2026
d68bbe5
test: serve agent upgrades over verified HTTPS
bcho Aug 7, 2026
10efc81
test: reuse agent upgrade e2e certificate
bcho Aug 7, 2026
7e07b9a
test: update secure upgrade failure assertion
bcho Aug 7, 2026
da53b6d
test: isolate agent upgrade start limits
bcho Aug 7, 2026
adeb4e7
agent: preserve rollback state during secure upgrades
bcho Aug 7, 2026
461e739
agent: assume secure installer dependencies are valid
bcho Aug 7, 2026
075694a
agent: reuse bounded archive upgrade flow
bcho Aug 7, 2026
4b46377
Merge remote-tracking branch 'origin/main' into hbc/agent-upgrade-lib…
bcho Aug 7, 2026
b1d0a98
agent: simplify archive upgrade API
bcho Aug 7, 2026
1d82814
Merge remote-tracking branch 'origin/main' into hbc/agent-upgrade-lib…
bcho Aug 7, 2026
427e534
agent: remove unused archive install API
bcho Aug 7, 2026
3d9e93b
docs: clarify agent archive size units
bcho Aug 7, 2026
9b4b5f1
agent: make local binary install internal
bcho Aug 7, 2026
89ee938
agent: address archive installer review
bcho Aug 7, 2026
48b083b
agent: harden upgrade path alias handling
bcho Aug 7, 2026
082aadd
agent: suppress candidate verification output
bcho Aug 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 29 additions & 16 deletions cmd/agent/internal/daemon/agentupgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,15 @@ import (

const (
agentUpgradeDownloadURLParameter = "downloadURL"
agentUpgradeSHA256Parameter = "sha256"
agentUpgradeBinaryMode = 0o755
)

type agentUpgradeRequest struct {
downloadURL string
sha256 string
}

// agentUpgradeSignal is the JSON payload for pending and failure signals.
type agentUpgradeSignal struct {
OperationName string `json:"operationName"`
Expand All @@ -42,33 +48,40 @@ type fileAgentUpgradeSignalOperator struct {
path string
}

func agentUpgradeDownloadURL(parameters map[string]string) (string, error) {
downloadURL := strings.TrimSpace(parameters[agentUpgradeDownloadURLParameter])
if downloadURL == "" {
return "", fmt.Errorf("missing required parameter %q", agentUpgradeDownloadURLParameter)
func parseAgentUpgradeRequest(parameters map[string]string) (agentUpgradeRequest, error) {
request := agentUpgradeRequest{
downloadURL: strings.TrimSpace(parameters[agentUpgradeDownloadURLParameter]),
sha256: strings.TrimSpace(parameters[agentUpgradeSHA256Parameter]),
}
if request.downloadURL == "" {
return agentUpgradeRequest{}, fmt.Errorf("missing required parameter %q", agentUpgradeDownloadURLParameter)
}

return downloadURL, nil
return request, nil
}

func upgradeDaemonBinary(ctx context.Context, log *slog.Logger, downloadURL string) error {
func upgradeDaemonBinary(ctx context.Context, log *slog.Logger, request agentUpgradeRequest) error {
paths, err := goalstates.ResolvedAgentUpgradePaths()
if err != nil {
return fmt.Errorf("resolve current daemon binary symlink: %w", err)
}

targetPath := paths.NextTargetPath()
if err := agentbinary.InstallAndSwitchFromTarGz(ctx, downloadURL, paths, agentUpgradeBinaryMode); err != nil {
return err
layout := agentbinary.Layout{
BinaryPath: paths.BinaryPath,
BluePath: paths.BluePath,
GreenPath: paths.GreenPath,
CurrentPath: paths.CurrentPath,
LastGoodPath: paths.LastGoodPath,
}
_, err = agentbinary.InstallAndSwitchFromTarGz(ctx, log, layout, agentbinary.InstallOptions{
DownloadURL: request.downloadURL,
ExpectedSHA256: request.sha256,
ExpectedMember: goalstates.AgentUpgradeBinaryName,
Mode: agentUpgradeBinaryMode,
ExactMember: true,
})

log.Info("staged upgraded daemon binary",
"url", downloadURL,
"previous", paths.CurrentTargetPath,
"current", targetPath,
)

return nil
return err
}

func newAgentUpgradeSignalOperator() (agentUpgradeSignalOperator, error) {
Expand Down
Loading
Loading