Skip to content

Commit afcae14

Browse files
committed
feat: add postdownload script support for agent types
1 parent c264741 commit afcae14

18 files changed

Lines changed: 776 additions & 96 deletions

File tree

.github/workflows/poc_ebpf.yml

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
name: eBPF PoC Pipeline
2+
3+
# Runs on push to feat/poc_ebpf_package branch and can be triggered manually
4+
5+
on:
6+
workflow_dispatch:
7+
push:
8+
branches:
9+
- feat/poc_ebpf_package
10+
- main
11+
pull_request:
12+
branches:
13+
- feat/poc_ebpf_package
14+
- main
15+
schedule:
16+
# Scheduled to run at 4 a.m on every day-of-week from Monday through Friday.
17+
- cron: "0 4 * * 1-5"
18+
19+
permissions:
20+
contents: read
21+
22+
jobs:
23+
build-packages:
24+
name: Build packages
25+
uses: ./.github/workflows/component_packages.yml
26+
with:
27+
pre-release: false
28+
tag_name: 0.100.${{ github.run_id }}
29+
secrets:
30+
gh_token: ${{ secrets.GITHUB_TOKEN }}
31+
gpg_private_key_base64: ${{ secrets.OHAI_GPG_PRIVATE_KEY_BASE64 }}
32+
gpg_passphrase: ${{ secrets.OHAI_GPG_PASSPHRASE }}
33+
pfx_certificate_base64: ${{ secrets.OHAI_PFX_CERTIFICATE_BASE64 }}
34+
pfx_passphrase: ${{ secrets.OHAI_PFX_PASSPHRASE }}
35+
36+
build-image:
37+
name: Build and Push nightly image
38+
uses: ./.github/workflows/component_image.yml
39+
with:
40+
# the packages are created with 0.100.run_id, however we still push the image with nightly
41+
image-tag: nightly
42+
ac-version: nightly
43+
push: true
44+
secrets: inherit
45+
46+
security-image:
47+
name: Security scan
48+
needs: [ build-image ]
49+
uses: ./.github/workflows/component_image_security.yml
50+
with:
51+
# the packages are created with 0.100.run_id, however we still push the image with nightly
52+
image-tag: nightly
53+
secrets: inherit
54+
55+
security-source-code:
56+
uses: ./.github/workflows/component_security.yml
57+
58+
# This is currently required for canaries
59+
upload-packages-s3:
60+
runs-on: ubuntu-latest
61+
needs: [ build-packages ]
62+
name: Upload packages to testing bucket
63+
steps:
64+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
65+
with:
66+
fetch-depth: 0
67+
68+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
69+
with:
70+
name: built-binaries-0.100.${{ github.run_id }}
71+
path: ./
72+
73+
- name: Publish deb to S3 action
74+
uses: newrelic/infrastructure-publish-action@26d9d8604b2cf2e7343dc287c958e8bbc1a3f750 # v1
75+
with:
76+
tag: 0.100.${{ github.run_id }}
77+
app_name: "newrelic-agent-control"
78+
repo_name: ${{ github.repository }}
79+
schema: "custom-local"
80+
schema_path: "/srv/build/upload-schema-linux-deb-nightly.yml"
81+
aws_access_key_id: ${{ secrets.OHAI_AWS_ACCESS_KEY_ID_TESTING }}
82+
aws_secret_access_key: ${{ secrets.OHAI_AWS_SECRET_ACCESS_KEY_TESTING }}
83+
aws_s3_bucket_name: "nr-downloads-ohai-testing"
84+
aws_s3_lock_bucket_name: "onhost-ci-lock-testing"
85+
access_point_host: "testing"
86+
run_id: ${{ github.run_id }}
87+
aws_region: "us-east-1"
88+
aws_role_session_name: ${{ secrets.OHAI_AWS_ROLE_SESSION_NAME_TESTING }}
89+
aws_role_arn: ${{ secrets.OHAI_AWS_ROLE_ARN_TESTING }}
90+
# used for signing package stuff
91+
gpg_passphrase: ${{ secrets.OHAI_GPG_PASSPHRASE }}
92+
gpg_private_key_base64: ${{ secrets.OHAI_GPG_PRIVATE_KEY_BASE64 }} # base64 encoded
93+
disable_lock: false
94+
dest_prefix: "poc_ebpf/"
95+
local_packages_path: "/srv/dist/"
96+
apt_skip_mirror: true
97+

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Remember that the keywords that you can use are the following:
1616

1717
### enhancement
1818
- Added support for JP endpoints.
19+
- add post-download script support for OCI packages.
1920
- Agent type definitions now use a flat per-platform schema (one YAML file per `(platform, operating_system)` pair).
2021
Agent type FQNs and configuration values are unchanged, so this is **not a breaking change** for end users.
2122
Internal authors of custom agent type definitions need to migrate their YAMLs — see [docs/INTEGRATING_AGENTS.md](docs/INTEGRATING_AGENTS.md).

agent-control/agent-type-registry/newrelic/host-linux-com.newrelic.ebpf-0.1.0.yaml

Lines changed: 73 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -204,103 +204,83 @@ variables:
204204
type: bool
205205
required: false
206206
default: false
207+
oci:
208+
repository:
209+
description: "OCI package repository name"
210+
type: string
211+
required: false
212+
default: vjripoll/newrelic-agent-control-poc
213+
variants:
214+
ac_config_field: "oci_repository_urls"
215+
values: [ "vjripoll/newrelic-agent-control-poc" ]
216+
version:
217+
description: "eBPF Agent package version"
218+
type: string
219+
required: true
207220
deployment:
221+
packages:
222+
ebpf-agent:
223+
download:
224+
oci:
225+
repository: ${nr-var:oci.repository}
226+
version: ${nr-var:version}
227+
postdownload:
228+
args:
229+
- "/bin/bash"
230+
- "postdownload.sh"
231+
env:
232+
PACKAGE_VERSION: "${nr-var:version}"
233+
timeout: "300s"
208234
enable_file_logging: ${nr-var:enable_file_logging}
209235
version:
210-
path: /usr/bin/nr-ebpf-agent-client
236+
path: ${nr-sub:packages.ebpf-agent.dir}/lib/newrelic-ebpf-agent/bin/nr-ebpf-agent
211237
args:
212238
- --version
213239
regex: \d+\.\d+\.\d+
214240
executables:
215-
- id: nr-ebpf-agent-client
216-
path: /usr/bin/nr-ebpf-agent-client
217-
env:
218-
NEW_RELIC_LICENSE_KEY: "${nr-env:NEW_RELIC_LICENSE_KEY}"
219-
DEPLOYMENT_NAME: "${nr-var:config_agent.DEPLOYMENT_NAME}"
220-
OTLP_ENDPOINT: "${nr-var:config_agent.OTLP_ENDPOINT}"
221-
NEW_RELIC_LOG_LEVEL: "${nr-var:config_agent.LOG_LEVEL}"
222-
NEW_RELIC_LOG_FILE_PATH: "${nr-var:config_agent.LOG_FILE_PATH}"
223-
DROP_DATA_FOR_ENTITY: "${nr-var:config_agent.DROP_DATA_FOR_ENTITY}"
224-
TLS_ENABLED: "${nr-var:config_agent.TLS_ENABLED}"
225-
TLS_AUTOGENERATE_CERT_ENABLED: "${nr-var:config_agent.TLS_AUTOGENERATE_CERT_ENABLED}"
226-
TLS_CERT_PATH: "${nr-var:config_agent.TLS_CERT_PATH}"
227-
TLS_CERT_FILE: "${nr-var:config_agent.TLS_CERT_FILE}"
228-
TLS_KEY_FILE: "${nr-var:config_agent.TLS_KEY_FILE}"
229-
TLS_CA_FILE: "${nr-var:config_agent.TLS_CA_FILE}"
230-
TABLE_STORE_DATA_LIMIT_MB: "${nr-var:config_agent.TABLE_STORE_DATA_LIMIT_MB}"
231-
PROTOCOLS_HTTP_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_ENABLED}"
232-
PROTOCOLS_HTTP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_ENABLED}"
233-
PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY}"
234-
PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE}"
235-
PROTOCOLS_MYSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_ENABLED}"
236-
PROTOCOLS_MYSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_ENABLED}"
237-
PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY}"
238-
PROTOCOLS_PGSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_ENABLED}"
239-
PROTOCOLS_PGSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_ENABLED}"
240-
PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY}"
241-
PROTOCOLS_CASS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_ENABLED}"
242-
PROTOCOLS_CASS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_ENABLED}"
243-
PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY}"
244-
PROTOCOLS_REDIS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_ENABLED}"
245-
PROTOCOLS_REDIS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_ENABLED}"
246-
PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY}"
247-
PROTOCOLS_MONGODB_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_ENABLED}"
248-
PROTOCOLS_MONGODB_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_ENABLED}"
249-
PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY}"
250-
PROTOCOLS_KAFKA_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_ENABLED}"
251-
PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY}"
252-
PROTOCOLS_AMQP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_ENABLED}"
253-
PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY}"
254-
PROTOCOLS_DNS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_ENABLED}"
255-
PROTOCOLS_DNS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_ENABLED}"
256-
PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY}"
257-
restart_policy:
258-
backoff_strategy:
259-
type: fixed
260-
backoff_delay: ${nr-var:backoff_delay}
261-
- id: nr-ebpf-agent
262-
path: /usr/bin/nr-ebpf-agent
263-
env:
264-
NEW_RELIC_LICENSE_KEY: "${nr-env:NEW_RELIC_LICENSE_KEY}"
265-
DEPLOYMENT_NAME: "${nr-var:config_agent.DEPLOYMENT_NAME}"
266-
OTLP_ENDPOINT: "${nr-var:config_agent.OTLP_ENDPOINT}"
267-
NEW_RELIC_LOG_LEVEL: "${nr-var:config_agent.LOG_LEVEL}"
268-
NEW_RELIC_LOG_FILE_PATH: "${nr-var:config_agent.LOG_FILE_PATH}"
269-
DROP_DATA_FOR_ENTITY: "${nr-var:config_agent.DROP_DATA_FOR_ENTITY}"
270-
TLS_ENABLED: "${nr-var:config_agent.TLS_ENABLED}"
271-
TLS_AUTOGENERATE_CERT_ENABLED: "${nr-var:config_agent.TLS_AUTOGENERATE_CERT_ENABLED}"
272-
TLS_CERT_PATH: "${nr-var:config_agent.TLS_CERT_PATH}"
273-
TLS_CERT_FILE: "${nr-var:config_agent.TLS_CERT_FILE}"
274-
TLS_KEY_FILE: "${nr-var:config_agent.TLS_KEY_FILE}"
275-
TLS_CA_FILE: "${nr-var:config_agent.TLS_CA_FILE}"
276-
TABLE_STORE_DATA_LIMIT_MB: "${nr-var:config_agent.TABLE_STORE_DATA_LIMIT_MB}"
277-
PROTOCOLS_HTTP_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_ENABLED}"
278-
PROTOCOLS_HTTP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_ENABLED}"
279-
PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY}"
280-
PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE}"
281-
PROTOCOLS_MYSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_ENABLED}"
282-
PROTOCOLS_MYSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_ENABLED}"
283-
PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY}"
284-
PROTOCOLS_PGSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_ENABLED}"
285-
PROTOCOLS_PGSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_ENABLED}"
286-
PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY}"
287-
PROTOCOLS_CASS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_ENABLED}"
288-
PROTOCOLS_CASS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_ENABLED}"
289-
PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY}"
290-
PROTOCOLS_REDIS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_ENABLED}"
291-
PROTOCOLS_REDIS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_ENABLED}"
292-
PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY}"
293-
PROTOCOLS_MONGODB_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_ENABLED}"
294-
PROTOCOLS_MONGODB_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_ENABLED}"
295-
PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY}"
296-
PROTOCOLS_KAFKA_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_ENABLED}"
297-
PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY}"
298-
PROTOCOLS_AMQP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_ENABLED}"
299-
PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY}"
300-
PROTOCOLS_DNS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_ENABLED}"
301-
PROTOCOLS_DNS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_ENABLED}"
302-
PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY}"
303-
restart_policy:
304-
backoff_strategy:
305-
type: fixed
306-
backoff_delay: ${nr-var:backoff_delay}
241+
- id: nr-ebpf-agent
242+
path: ${nr-sub:packages.ebpf-agent.dir}/lib/newrelic-ebpf-agent/bin/nr-ebpf-agent
243+
env:
244+
NEW_RELIC_LICENSE_KEY: "${nr-env:NEW_RELIC_LICENSE_KEY}"
245+
DEPLOYMENT_NAME: "${nr-var:config_agent.DEPLOYMENT_NAME}"
246+
OTLP_ENDPOINT: "${nr-var:config_agent.OTLP_ENDPOINT}"
247+
NEW_RELIC_LOG_LEVEL: "${nr-var:config_agent.LOG_LEVEL}"
248+
NEW_RELIC_LOG_FILE_PATH: "${nr-var:config_agent.LOG_FILE_PATH}"
249+
DROP_DATA_FOR_ENTITY: "${nr-var:config_agent.DROP_DATA_FOR_ENTITY}"
250+
TLS_ENABLED: "${nr-var:config_agent.TLS_ENABLED}"
251+
TLS_AUTOGENERATE_CERT_ENABLED: "${nr-var:config_agent.TLS_AUTOGENERATE_CERT_ENABLED}"
252+
TLS_CERT_PATH: "${nr-var:config_agent.TLS_CERT_PATH}"
253+
TLS_CERT_FILE: "${nr-var:config_agent.TLS_CERT_FILE}"
254+
TLS_KEY_FILE: "${nr-var:config_agent.TLS_KEY_FILE}"
255+
TLS_CA_FILE: "${nr-var:config_agent.TLS_CA_FILE}"
256+
TABLE_STORE_DATA_LIMIT_MB: "${nr-var:config_agent.TABLE_STORE_DATA_LIMIT_MB}"
257+
PROTOCOLS_HTTP_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_ENABLED}"
258+
PROTOCOLS_HTTP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_ENABLED}"
259+
PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_LATENCY}"
260+
PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE: "${nr-var:config_agent.PROTOCOLS_HTTP_SPANS_SAMPLING_ERROR_RATE}"
261+
PROTOCOLS_MYSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_ENABLED}"
262+
PROTOCOLS_MYSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_ENABLED}"
263+
PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MYSQL_SPANS_SAMPLING_LATENCY}"
264+
PROTOCOLS_PGSQL_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_ENABLED}"
265+
PROTOCOLS_PGSQL_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_ENABLED}"
266+
PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_PGSQL_SPANS_SAMPLING_LATENCY}"
267+
PROTOCOLS_CASS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_ENABLED}"
268+
PROTOCOLS_CASS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_ENABLED}"
269+
PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_CASS_SPANS_SAMPLING_LATENCY}"
270+
PROTOCOLS_REDIS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_ENABLED}"
271+
PROTOCOLS_REDIS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_ENABLED}"
272+
PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_REDIS_SPANS_SAMPLING_LATENCY}"
273+
PROTOCOLS_MONGODB_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_ENABLED}"
274+
PROTOCOLS_MONGODB_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_ENABLED}"
275+
PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_MONGODB_SPANS_SAMPLING_LATENCY}"
276+
PROTOCOLS_KAFKA_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_ENABLED}"
277+
PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_KAFKA_SPANS_SAMPLING_LATENCY}"
278+
PROTOCOLS_AMQP_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_ENABLED}"
279+
PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_AMQP_SPANS_SAMPLING_LATENCY}"
280+
PROTOCOLS_DNS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_ENABLED}"
281+
PROTOCOLS_DNS_SPANS_ENABLED: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_ENABLED}"
282+
PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY: "${nr-var:config_agent.PROTOCOLS_DNS_SPANS_SAMPLING_LATENCY}"
283+
restart_policy:
284+
backoff_strategy:
285+
type: fixed
286+
backoff_delay: ${nr-var:backoff_delay}

agent-control/src/agent_control/version_updater/on_host.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ where
136136
version: new_version,
137137
public_key_url: Some(self.pub_key_url.clone()),
138138
},
139+
postdownload: None,
139140
}
140141
}
141142
}

agent-control/src/agent_type/definition.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ pub fn include_packages_variables(
303303
let package_data = PackageData {
304304
id: package_id.to_string(),
305305
oci: package.download.oci.clone(),
306+
postdownload: package.postdownload.clone(),
306307
};
307308
let path =
308309
get_package_path(Path::new(remote_dir), &agent_id, &package_data).map_err(|e| {

agent-control/src/agent_type/runtime_config/on_host.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ mod tests {
169169
)),
170170
},
171171
},
172+
postdownload: None,
172173
};
173174

174175
let expected_packages = HashMap::from([

agent-control/src/agent_type/runtime_config/on_host/package.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ pub mod rendered;
1414
pub(super) struct Package {
1515
/// Download defines the supported repository sources for the packages.
1616
pub download: Download,
17+
/// Postdownload script to execute after downloading and extracting the package.
18+
/// All validations, checks, and installation steps should go here.
19+
pub postdownload: Option<Postdownload>,
1720
}
1821

1922
pub type PackageID = String;
@@ -35,11 +38,37 @@ pub struct Oci {
3538
pub public_key_url: Option<TemplateableValue<String>>,
3639
}
3740

41+
#[derive(Debug, Deserialize, Clone, PartialEq)]
42+
pub struct Postdownload {
43+
/// Arguments where first element is the command/executable (e.g., "bash", "sh", "python3"),
44+
/// second element is the script path, followed by additional arguments.
45+
/// Example: ["bash", "postdownload.sh", "--verbose"]
46+
pub args: Vec<TemplateableValue<String>>,
47+
48+
/// Environmental variables passed to the process.
49+
#[serde(default)]
50+
pub env: std::collections::HashMap<String, TemplateableValue<String>>,
51+
52+
/// Maximum time to wait for the script to complete.
53+
#[serde(default = "default_postdownload_timeout")]
54+
pub timeout: TemplateableValue<String>,
55+
}
56+
57+
fn default_postdownload_timeout() -> TemplateableValue<String> {
58+
TemplateableValue::new("300s".to_string())
59+
}
60+
3861
impl Templateable for Package {
3962
type Output = rendered::Package;
4063
fn template_with(self, variables: &Variables) -> Result<Self::Output, AgentTypeError> {
64+
let postdownload = self
65+
.postdownload
66+
.map(|pd| pd.template_with(variables))
67+
.transpose()?;
68+
4169
Ok(Self::Output {
4270
download: self.download.template_with(variables)?,
71+
postdownload,
4372
})
4473
}
4574
}
@@ -86,6 +115,38 @@ impl Templateable for Oci {
86115
}
87116
}
88117

118+
impl Templateable for Postdownload {
119+
type Output = rendered::Postdownload;
120+
fn template_with(self, variables: &Variables) -> Result<Self::Output, AgentTypeError> {
121+
let timeout_str = self.timeout.template_with(variables)?;
122+
123+
let args: Vec<String> = self
124+
.args
125+
.into_iter()
126+
.map(|arg| arg.template_with(variables))
127+
.collect::<Result<Vec<String>, AgentTypeError>>()?;
128+
129+
if args.len() < 2 {
130+
return Err(AgentTypeError::OCIReferenceParsingError(
131+
"postdownload args must have at least 2 elements: command and script path"
132+
.to_string(),
133+
));
134+
}
135+
136+
let env: std::collections::HashMap<String, String> = self
137+
.env
138+
.into_iter()
139+
.map(|(k, v)| v.template_with(variables).map(|templated| (k, templated)))
140+
.collect::<Result<std::collections::HashMap<_, _>, AgentTypeError>>()?;
141+
142+
let timeout = duration_str::parse(&timeout_str).map_err(|err| {
143+
AgentTypeError::OCIReferenceParsingError(format!("invalid timeout format: {err}"))
144+
})?;
145+
146+
Ok(Self::Output { args, env, timeout })
147+
}
148+
}
149+
89150
#[cfg(test)]
90151
mod tests {
91152
use std::str::FromStr;

0 commit comments

Comments
 (0)