Skip to content

Commit 9d6ebbc

Browse files
committed
feat: authenticating when using remote archive
Add `auth-token` option to the CLI that allows configuring authentication when fetching registry from a remote archive. `auth-token` is passed and handled separately from the virtual directory path string as the usual `@` character separating userinfo portion of the URL from the host is reserved for the `refspec`. Taking the token from the userinfo portion of the URL would be an alternative to the approach in this commit but would make the parsing a little bit more cumbersome. I am open to both approach and happy to adjust the code to whatever the OpenTelemetry team deems better. Fixes: #430
1 parent 8462991 commit 9d6ebbc

File tree

17 files changed

+68
-27
lines changed

17 files changed

+68
-27
lines changed

crates/weaver_codegen_test/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ fn main() {
4343
let registry_path = VirtualDirectoryPath::LocalFolder {
4444
path: SEMCONV_REGISTRY_PATH.into(),
4545
};
46-
let registry_repo =
47-
RegistryRepo::try_new("main", &registry_path).unwrap_or_else(|e| process_error(&logger, e));
46+
let registry_repo = RegistryRepo::try_new("main", &registry_path, None)
47+
.unwrap_or_else(|e| process_error(&logger, e));
4848
let semconv_specs = SchemaResolver::load_semconv_specs(&registry_repo, true, FOLLOW_SYMLINKS)
4949
.ignore(|e| matches!(e.severity(), Some(miette::Severity::Warning)))
5050
.into_result_failing_non_fatal()

crates/weaver_common/src/vdir.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,10 @@ impl VirtualDirectory {
276276
/// - Extracting local archives.
277277
///
278278
/// Returns an [`Error`] if any operation fails (e.g. network issues, invalid paths, extraction failures).
279-
pub fn try_new(vdir_path: &VirtualDirectoryPath) -> Result<Self, Error> {
279+
pub fn try_new(
280+
vdir_path: &VirtualDirectoryPath,
281+
auth_token: Option<&String>,
282+
) -> Result<Self, Error> {
280283
let vdir_path_repr = vdir_path.to_string();
281284
let vdir = match vdir_path {
282285
LocalFolder { path } => Ok(Self {
@@ -297,7 +300,13 @@ impl VirtualDirectory {
297300
// Create a temporary directory for the virtual directory that will be deleted
298301
// when the `VirtualDirectory` goes out of scope.
299302
let tmp_dir = Self::create_tmp_repo()?;
300-
Self::try_from_remote_archive(url, sub_folder.as_ref(), tmp_dir, vdir_path_repr)
303+
Self::try_from_remote_archive(
304+
url,
305+
sub_folder.as_ref(),
306+
tmp_dir,
307+
vdir_path_repr,
308+
auth_token,
309+
)
301310
}
302311
};
303312
vdir
@@ -593,6 +602,7 @@ impl VirtualDirectory {
593602
/// The sub_folder is used to filter the entries inside the archive to unpack.
594603
/// The temporary directory is created in the `.weaver/vdir_cache`.
595604
/// The temporary directory is deleted when the [`VirtualDirectory`] goes out of scope.
605+
/// The auth_token is used to authenticate with the remote using Bearer schema.
596606
///
597607
/// Arguments:
598608
/// - `id`: The unique identifier for the registry.
@@ -605,11 +615,18 @@ impl VirtualDirectory {
605615
sub_folder: Option<&String>,
606616
target_dir: TempDir,
607617
vdir_path: String,
618+
auth_token: Option<&String>,
608619
) -> Result<Self, Error> {
609620
let tmp_path = target_dir.path().to_path_buf();
610621

622+
let mut req = ureq::get(url);
623+
624+
if let Some(auth_token) = auth_token {
625+
req = req.set("Authorization", format!("Bearer {}", auth_token).as_str());
626+
};
627+
611628
// Download the archive from the URL
612-
let response = ureq::get(url).call().map_err(|e| InvalidRegistryArchive {
629+
let response = req.call().map_err(|e| InvalidRegistryArchive {
613630
archive: url.to_owned(),
614631
error: e.to_string(),
615632
})?;
@@ -845,7 +862,7 @@ mod tests {
845862
let vdir_path = VirtualDirectoryPath::LocalFolder {
846863
path: "../../crates/weaver_codegen_test/semconv_registry".to_owned(),
847864
};
848-
let repo = VirtualDirectory::try_new(&vdir_path).unwrap();
865+
let repo = VirtualDirectory::try_new(&vdir_path, None).unwrap();
849866
let repo_path = repo.path().to_path_buf();
850867
assert!(repo_path.exists());
851868
assert!(
@@ -859,7 +876,7 @@ mod tests {
859876
}
860877

861878
fn check_archive(vdir_path: VirtualDirectoryPath, file_to_check: Option<&str>) {
862-
let repo = VirtualDirectory::try_new(&vdir_path).unwrap();
879+
let repo = VirtualDirectory::try_new(&vdir_path, None).unwrap();
863880
let repo_path = repo.path().to_path_buf();
864881
// At this point, the repo should be cloned into a temporary directory.
865882
assert!(repo_path.exists());

crates/weaver_resolver/src/lib.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,11 @@ impl SchemaResolver {
449449
}))
450450
} else {
451451
let dependency = &dependencies[0];
452-
match RegistryRepo::try_new(&dependency.name, &dependency.registry_path) {
452+
match RegistryRepo::try_new(
453+
&dependency.name,
454+
&dependency.registry_path,
455+
None,
456+
) {
453457
Ok(registry_repo_dep) => Some(Self::load_semconv_specs_with_depth(
454458
&registry_repo_dep,
455459
true,
@@ -660,7 +664,7 @@ mod tests {
660664
let registry_path = VirtualDirectoryPath::LocalFolder {
661665
path: "data/multi-registry/custom_registry".to_owned(),
662666
};
663-
let registry_repo = RegistryRepo::try_new("main", &registry_path)?;
667+
let registry_repo = RegistryRepo::try_new("main", &registry_path, None)?;
664668
let result = SchemaResolver::load_semconv_specs(&registry_repo, true, true);
665669
match result {
666670
WResult::Ok(semconv_specs) => {
@@ -692,7 +696,7 @@ mod tests {
692696
let registry_path = VirtualDirectoryPath::LocalFolder {
693697
path: "data/multi-registry/app_registry".to_owned(),
694698
};
695-
let registry_repo = RegistryRepo::try_new("app", &registry_path)?;
699+
let registry_repo = RegistryRepo::try_new("app", &registry_path, None)?;
696700
let result = SchemaResolver::load_semconv_specs(&registry_repo, true, true);
697701

698702
match result {
@@ -814,7 +818,7 @@ mod tests {
814818
let registry_path = VirtualDirectoryPath::LocalFolder {
815819
path: "data/multi-registry/app_registry".to_owned(),
816820
};
817-
let registry_repo = RegistryRepo::try_new("app", &registry_path)?;
821+
let registry_repo = RegistryRepo::try_new("app", &registry_path, None)?;
818822

819823
// Try with depth limit of 1 - should fail at acme->otel transition
820824
let mut visited_registries = HashSet::new();
@@ -850,7 +854,7 @@ mod tests {
850854
let registry_path = VirtualDirectoryPath::LocalFolder {
851855
path: "data/circular-registry-test/registry_a".to_owned(),
852856
};
853-
let registry_repo = RegistryRepo::try_new("registry_a", &registry_path)?;
857+
let registry_repo = RegistryRepo::try_new("registry_a", &registry_path, None)?;
854858
let result = SchemaResolver::load_semconv_specs(&registry_repo, true, true);
855859

856860
match result {

crates/weaver_semconv/src/registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ mod tests {
389389
let registry_path = VirtualDirectoryPath::LocalFolder {
390390
path: "data".to_owned(),
391391
};
392-
let registry_repo = RegistryRepo::try_new("test", &registry_path).unwrap();
392+
let registry_repo = RegistryRepo::try_new("test", &registry_path, None).unwrap();
393393
let registry = SemConvRegistry::from_semconv_specs(&registry_repo, semconv_specs).unwrap();
394394
assert_eq!(registry.id(), "test");
395395
assert_eq!(registry.semconv_spec_count(), 2);

crates/weaver_semconv/src/registry_repo.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ impl RegistryRepo {
3636
pub fn try_new(
3737
registry_id_if_no_manifest: &str,
3838
registry_path: &VirtualDirectoryPath,
39+
auth_token: Option<&String>,
3940
) -> Result<Self, Error> {
4041
let mut registry_repo = Self {
4142
id: Arc::from(registry_id_if_no_manifest),
42-
registry: VirtualDirectory::try_new(registry_path)
43+
registry: VirtualDirectory::try_new(registry_path, auth_token)
4344
.map_err(Error::VirtualDirectoryError)?,
4445
manifest: None,
4546
};
@@ -115,7 +116,7 @@ mod tests {
115116
let registry_path = VirtualDirectoryPath::LocalFolder {
116117
path: "../../crates/weaver_codegen_test/semconv_registry".to_owned(),
117118
};
118-
let repo = RegistryRepo::try_new("main", &registry_path).unwrap();
119+
let repo = RegistryRepo::try_new("main", &registry_path, None).unwrap();
119120
let repo_path = repo.path().to_path_buf();
120121
assert!(repo_path.exists());
121122
assert!(

crates/weaver_semconv_gen/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ mod tests {
403403
path: "data".to_owned(),
404404
};
405405
let mut diag_msgs = DiagnosticMessages::empty();
406-
let registry_repo = RegistryRepo::try_new("main", &registry_path)?;
406+
let registry_repo = RegistryRepo::try_new("main", &registry_path, None)?;
407407
let generator = SnippetGenerator::try_from_registry_repo(
408408
&registry_repo,
409409
template,

src/registry/check.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub(crate) fn command(args: &RegistryCheckArgs) -> Result<ExitDirectives, Diagno
5252

5353
// Initialize the baseline registry if provided.
5454
let baseline_registry_repo = if let Some(baseline_registry) = &args.baseline_registry {
55-
Some(RegistryRepo::try_new("baseline", baseline_registry)?)
55+
Some(RegistryRepo::try_new("baseline", baseline_registry, None)?)
5656
} else {
5757
None
5858
};
@@ -142,6 +142,7 @@ mod tests {
142142
},
143143
follow_symlinks: false,
144144
include_unreferenced: false,
145+
auth_token: None,
145146
},
146147
baseline_registry: None,
147148
policy: PolicyArgs {
@@ -171,6 +172,7 @@ mod tests {
171172
},
172173
follow_symlinks: false,
173174
include_unreferenced: false,
175+
auth_token: None,
174176
},
175177
baseline_registry: None,
176178
policy: PolicyArgs {
@@ -198,6 +200,7 @@ mod tests {
198200
},
199201
follow_symlinks: false,
200202
include_unreferenced: false,
203+
auth_token: None,
201204
},
202205
baseline_registry: None,
203206
policy: PolicyArgs {

src/registry/diff.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ pub(crate) fn command(args: &RegistryDiffArgs) -> Result<ExitDirectives, Diagnos
8888
info!("Checking registry `{}`", args.registry.registry);
8989

9090
let registry_path = args.registry.registry.clone();
91-
let main_registry_repo = RegistryRepo::try_new("main", &registry_path)?;
92-
let baseline_registry_repo = RegistryRepo::try_new("baseline", &args.baseline_registry)?;
91+
let main_registry_repo = RegistryRepo::try_new("main", &registry_path, None)?;
92+
let baseline_registry_repo = RegistryRepo::try_new("baseline", &args.baseline_registry, None)?;
9393
let main_semconv_specs = load_semconv_specs(&main_registry_repo, args.registry.follow_symlinks)
9494
.capture_non_fatal_errors(&mut diag_msgs)?;
9595
let baseline_semconv_specs =
@@ -167,6 +167,7 @@ mod tests {
167167
},
168168
follow_symlinks: false,
169169
include_unreferenced: false,
170+
auth_token: None,
170171
},
171172
baseline_registry: VirtualDirectoryPath::LocalFolder {
172173
path: "tests/diff/registry_baseline/".to_owned(),
@@ -196,6 +197,7 @@ mod tests {
196197
},
197198
follow_symlinks: false,
198199
include_unreferenced: false,
200+
auth_token: None,
199201
},
200202
baseline_registry: VirtualDirectoryPath::LocalFolder {
201203
path: "tests/diff/registry_baseline/".to_owned(),

src/registry/emit.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ mod tests {
9898
},
9999
follow_symlinks: false,
100100
include_unreferenced: false,
101+
auth_token: None,
101102
},
102103
policy: PolicyArgs {
103104
policies: vec![],

src/registry/generate.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub(crate) fn command(args: &RegistryGenerateArgs) -> Result<ExitDirectives, Dia
9696

9797
let params = generate_params(args)?;
9898
let templates_dir =
99-
VirtualDirectory::try_new(&args.templates).map_err(|e| Error::InvalidParams {
99+
VirtualDirectory::try_new(&args.templates, None).map_err(|e| Error::InvalidParams {
100100
params_file: PathBuf::from(args.templates.to_string()),
101101
error: e.to_string(),
102102
})?;
@@ -211,6 +211,7 @@ mod tests {
211211
},
212212
follow_symlinks: false,
213213
include_unreferenced: false,
214+
auth_token: None,
214215
},
215216
policy: PolicyArgs {
216217
policies: vec![],
@@ -289,6 +290,7 @@ mod tests {
289290
},
290291
follow_symlinks: false,
291292
include_unreferenced: false,
293+
auth_token: None,
292294
},
293295
policy: PolicyArgs {
294296
policies: vec![],
@@ -338,6 +340,7 @@ mod tests {
338340
},
339341
follow_symlinks: false,
340342
include_unreferenced: false,
343+
auth_token: None,
341344
},
342345
policy: PolicyArgs {
343346
policies: vec![],
@@ -446,6 +449,7 @@ mod tests {
446449
},
447450
follow_symlinks,
448451
include_unreferenced: false,
452+
auth_token: None,
449453
},
450454
policy: PolicyArgs {
451455
policies: vec![],

0 commit comments

Comments
 (0)