Skip to content

Commit c254cce

Browse files
feat: support oci auth in agent types
1 parent c91c84f commit c254cce

File tree

5 files changed

+292
-3
lines changed

5 files changed

+292
-3
lines changed

agent-control/agent-type-registry/newrelic/com.newrelic.infrastructure-0.1.0.yaml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ variables:
4545
variants:
4646
ac_config_field: "oci_repository_urls"
4747
values: [ "newrelic/infrastructure-agent-artifacts" ]
48+
auth:
49+
basic:
50+
username:
51+
description: "Username for HTTP Basic authentication"
52+
type: string
53+
required: false
54+
default: null
55+
password:
56+
description: "Password for HTTP Basic authentication"
57+
type: string
58+
required: false
59+
default: null
60+
bearer:
61+
description: "Bearer token for authentication"
62+
type: string
63+
required: false
64+
default: null
4865
version:
4966
description: "Agent version"
5067
type: string
@@ -97,6 +114,23 @@ variables:
97114
variants:
98115
ac_config_field: "oci_repository_urls"
99116
values: [ "newrelic/infrastructure-agent-artifacts" ]
117+
auth:
118+
basic:
119+
username:
120+
description: "Username for HTTP Basic authentication"
121+
type: string
122+
required: false
123+
default: null
124+
password:
125+
description: "Password for HTTP Basic authentication"
126+
type: string
127+
required: false
128+
default: null
129+
bearer:
130+
description: "Bearer token for authentication"
131+
type: string
132+
required: false
133+
default: null
100134
version:
101135
description: "Agent version"
102136
type: string
@@ -186,6 +220,11 @@ deployment:
186220
repository: ${nr-var:oci.repository}
187221
version: ${nr-var:version}
188222
public_key_url: https://publickeys.newrelic.com/g/agent-control-oci/global/nrinfraagent/jwks.json
223+
auth:
224+
basic:
225+
username: ${nr-var:oci.auth.basic.username}
226+
password: ${nr-var:oci.auth.basic.password}
227+
bearer: ${nr-var:oci.auth.bearer}
189228
version:
190229
path: ${nr-sub:packages.infra-agent.dir}\\newrelic-infra.exe
191230
args:
@@ -256,6 +295,11 @@ deployment:
256295
repository: ${nr-var:oci.repository}
257296
version: ${nr-var:version}
258297
public_key_url: https://publickeys.newrelic.com/g/agent-control-oci/global/nrinfraagent/jwks.json
298+
auth:
299+
basic:
300+
username: ${nr-var:oci.auth.basic.username}
301+
password: ${nr-var:oci.auth.basic.password}
302+
bearer: ${nr-var:oci.auth.bearer}
259303
version:
260304
path: ${nr-sub:packages.infra-agent.dir}/newrelic-infra
261305
args:

agent-control/agent-type-registry/newrelic/com.newrelic.opentelemetry.collector-0.1.0.yaml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ variables:
4949
variants:
5050
ac_config_field: "oci_nrdot_registry_repositories"
5151
values: [ "newrelic/nrdot-agent-artifacts" ]
52+
auth:
53+
basic:
54+
username:
55+
description: "Username for HTTP Basic authentication"
56+
type: string
57+
required: false
58+
default: null
59+
password:
60+
description: "Password for HTTP Basic authentication"
61+
type: string
62+
required: false
63+
default: null
64+
bearer:
65+
description: "Bearer token for authentication"
66+
type: string
67+
required: false
68+
default: null
5269
version:
5370
description: "Agent version"
5471
type: string
@@ -95,6 +112,23 @@ variables:
95112
variants:
96113
ac_config_field: "oci_nrdot_registry_repositories"
97114
values: [ "newrelic/nrdot-agent-artifacts" ]
115+
auth:
116+
basic:
117+
username:
118+
description: "Username for HTTP Basic authentication"
119+
type: string
120+
required: false
121+
default: null
122+
password:
123+
description: "Password for HTTP Basic authentication"
124+
type: string
125+
required: false
126+
default: null
127+
bearer:
128+
description: "Bearer token for authentication"
129+
type: string
130+
required: false
131+
default: null
98132
version:
99133
description: "Agent version"
100134
type: string
@@ -157,6 +191,11 @@ deployment:
157191
repository: ${nr-var:oci.repository}
158192
version: ${nr-var:version}
159193
public_key_url: https://publickeys.newrelic.com/g/agent-control-oci/global/nrdot/jwks.json
194+
auth:
195+
basic:
196+
username: ${nr-var:oci.auth.basic.username}
197+
password: ${nr-var:oci.auth.basic.password}
198+
bearer: ${nr-var:oci.auth.bearer}
160199
version:
161200
path: ${nr-sub:packages.nrdot.dir}\\nrdot-collector.exe
162201
args:
@@ -190,6 +229,11 @@ deployment:
190229
repository: ${nr-var:oci.repository}
191230
version: ${nr-var:version}
192231
public_key_url: https://publickeys.newrelic.com/g/agent-control-oci/global/nrdot/jwks.json
232+
auth:
233+
basic:
234+
username: ${nr-var:oci.auth.basic.username}
235+
password: ${nr-var:oci.auth.basic.password}
236+
bearer: ${nr-var:oci.auth.bearer}
193237
health:
194238
interval: 30s
195239
initial_delay: 90s

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

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ mod tests {
106106
use crate::agent_type::variable::Variable;
107107
use crate::agent_type::variable::namespace::Namespace;
108108
use crate::checkers::health::health_checker::{HealthCheckInterval, InitialDelay};
109+
use oci_client::secrets::RegistryAuth;
110+
use rstest::rstest;
109111
use serde_yaml::Number;
110112
use std::collections::HashMap;
111113
use std::path::PathBuf;
@@ -168,6 +170,7 @@ mod tests {
168170
public_key_url: Some(TemplateableValue::from_template(
169171
"${nr-var:public-key-url}".to_string(),
170172
)),
173+
auth: package::Auth::default(),
171174
},
172175
},
173176
};
@@ -176,7 +179,7 @@ mod tests {
176179
("otel-first".to_string(), pkg.clone()),
177180
("otel-second".to_string(), pkg),
178181
]);
179-
assert_eq!(on_host.packages, expected_packages)
182+
assert_eq!(on_host.packages, expected_packages);
180183
}
181184

182185
#[test]
@@ -716,6 +719,81 @@ executables:
716719
);
717720
}
718721

722+
struct AuthCredentials {
723+
username: &'static str,
724+
password: &'static str,
725+
bearer: &'static str,
726+
}
727+
728+
impl AuthCredentials {
729+
const NONE: Self = Self {
730+
username: "",
731+
password: "",
732+
bearer: "",
733+
};
734+
const BASIC: Self = Self {
735+
username: "user",
736+
password: "pass",
737+
bearer: "",
738+
};
739+
const BEARER: Self = Self {
740+
username: "",
741+
password: "",
742+
bearer: "token",
743+
};
744+
const ALL: Self = Self {
745+
username: "user",
746+
password: "pass",
747+
bearer: "token",
748+
};
749+
}
750+
751+
#[rstest]
752+
// This case checks backwards compatibility with old agent types not defining auth.
753+
#[case::no_auth(PACKAGES_NO_AUTH, AuthCredentials::NONE, RegistryAuth::Anonymous)]
754+
#[case::no_credentials(PACKAGES, AuthCredentials::NONE, RegistryAuth::Anonymous)]
755+
#[case::basic_credentials(PACKAGES, AuthCredentials::BASIC, RegistryAuth::Basic("user".to_string(), "pass".to_string()))]
756+
#[case::bearer_credentials(PACKAGES, AuthCredentials::BEARER, RegistryAuth::Bearer("token".to_string()))]
757+
#[case::all_credentials(PACKAGES, AuthCredentials::ALL, RegistryAuth::Basic("user".to_string(), "pass".to_string()))]
758+
fn test_auth_parsing(
759+
#[case] yaml: &str,
760+
#[case] creds: AuthCredentials,
761+
#[case] expected_auth: RegistryAuth,
762+
) {
763+
let on_host: OnHost = serde_yaml::from_str(yaml).unwrap();
764+
765+
let mut vars = Variables::new();
766+
vars.insert(
767+
Namespace::SubAgent.namespaced_name(AgentAttributes::VARIABLE_FILESYSTEM_AGENT_DIR),
768+
Variable::new_final_string_variable("/filesystem".to_string()),
769+
);
770+
vars.insert(
771+
Namespace::SubAgent.namespaced_name(AgentAttributes::VARIABLE_REMOTE_DIR),
772+
Variable::new_final_string_variable("remote".to_string()),
773+
);
774+
vars.insert(
775+
Namespace::SubAgent.namespaced_name(AgentAttributes::VARIABLE_SUB_AGENT_ID),
776+
Variable::new_final_string_variable("agent-id".to_string()),
777+
);
778+
vars.insert(
779+
"nr-var:oci.auth.basic.username".to_string(),
780+
Variable::new_final_string_variable(creds.username.to_string()),
781+
);
782+
vars.insert(
783+
"nr-var:oci.auth.basic.password".to_string(),
784+
Variable::new_final_string_variable(creds.password.to_string()),
785+
);
786+
vars.insert(
787+
"nr-var:oci.auth.bearer".to_string(),
788+
Variable::new_final_string_variable(creds.bearer.to_string()),
789+
);
790+
791+
let rendered = on_host.template_with(&vars).unwrap();
792+
let pkg = rendered.packages.get("infra-agent").unwrap();
793+
794+
assert_eq!(pkg.download.oci.auth, expected_auth);
795+
}
796+
719797
pub const AGENT_GIVEN_YAML: &str = r#"
720798
health:
721799
interval: 3s
@@ -763,4 +841,29 @@ packages:
763841
version: ${nr-var:version}
764842
public_key_url: ${nr-var:public-key-url}
765843
"#;
844+
845+
const PACKAGES_NO_AUTH: &str = r#"
846+
packages:
847+
infra-agent:
848+
download:
849+
oci:
850+
registry: docker.io
851+
repository: repo/image
852+
version: 0.0.1
853+
"#;
854+
855+
const PACKAGES: &str = r#"
856+
packages:
857+
infra-agent:
858+
download:
859+
oci:
860+
registry: docker.io
861+
repository: repo/image
862+
version: 0.0.1
863+
auth:
864+
basic:
865+
username: ${nr-var:oci.auth.basic.username}
866+
password: ${nr-var:oci.auth.basic.password}
867+
bearer: ${nr-var:oci.auth.bearer}
868+
"#;
766869
}

0 commit comments

Comments
 (0)