diff options
| author | Stefan Boberg <[email protected]> | 2026-03-18 11:27:07 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-03-18 11:27:07 +0100 |
| commit | e64d76ae1b6993582bf161a61049f0771414a779 (patch) | |
| tree | 083f3df42cc9e2c7ddbee225708b4848eb217d11 /src/zencompute/testing/mockimds.cpp | |
| parent | Compute batching (#849) (diff) | |
| download | zen-e64d76ae1b6993582bf161a61049f0771414a779.tar.xz zen-e64d76ae1b6993582bf161a61049f0771414a779.zip | |
Simple S3 client (#836)
This functionality is intended to be used to manage datasets for test cases, but may be useful elsewhere in the future.
- **Add S3 client with AWS Signature V4 (SigV4) signing** — new `S3Client` in `zenutil/cloud/` supporting `GetObject`, `PutObject`, `DeleteObject`, `HeadObject`, and `ListObjects` operations
- **Add EC2 IMDS credential provider** — automatically fetches and refreshes temporary AWS credentials from the EC2 Instance Metadata Service (IMDSv2) for use by the S3 client
- **Add SigV4 signing library** — standalone implementation of AWS Signature Version 4 request signing (headers and query-string presigning)
- **Add path-style addressing support** — enables compatibility with S3-compatible stores like MinIO (in addition to virtual-hosted style)
- **Add S3 integration tests** — includes a `MinioProcess` test helper that spins up a local MinIO server, plus integration tests exercising the S3 client end-to-end
- **Add S3-backed `HttpObjectStoreService` tests** — integration tests verifying the zenserver object store works against an S3 backend
- **Refactor mock IMDS into `zenutil/cloud/`** — moved and generalized the mock IMDS server from `zencompute` so it can be reused by both compute and S3 credential tests
Diffstat (limited to 'src/zencompute/testing/mockimds.cpp')
| -rw-r--r-- | src/zencompute/testing/mockimds.cpp | 205 |
1 files changed, 1 insertions, 204 deletions
diff --git a/src/zencompute/testing/mockimds.cpp b/src/zencompute/testing/mockimds.cpp index dd09312df..5415f48f3 100644 --- a/src/zencompute/testing/mockimds.cpp +++ b/src/zencompute/testing/mockimds.cpp @@ -1,205 +1,2 @@ // Copyright Epic Games, Inc. All Rights Reserved. - -#include <zencompute/mockimds.h> - -#include <zencore/fmtutils.h> - -#if ZEN_WITH_TESTS - -namespace zen::compute { - -const char* -MockImdsService::BaseUri() const -{ - return "/"; -} - -void -MockImdsService::HandleRequest(HttpServerRequest& Request) -{ - std::string_view Uri = Request.RelativeUri(); - - // AWS endpoints live under /latest/ - if (Uri.starts_with("latest/")) - { - if (ActiveProvider == CloudProvider::AWS) - { - HandleAwsRequest(Request); - return; - } - Request.WriteResponse(HttpResponseCode::NotFound); - return; - } - - // Azure endpoints live under /metadata/ - if (Uri.starts_with("metadata/")) - { - if (ActiveProvider == CloudProvider::Azure) - { - HandleAzureRequest(Request); - return; - } - Request.WriteResponse(HttpResponseCode::NotFound); - return; - } - - // GCP endpoints live under /computeMetadata/ - if (Uri.starts_with("computeMetadata/")) - { - if (ActiveProvider == CloudProvider::GCP) - { - HandleGcpRequest(Request); - return; - } - Request.WriteResponse(HttpResponseCode::NotFound); - return; - } - - Request.WriteResponse(HttpResponseCode::NotFound); -} - -// --------------------------------------------------------------------------- -// AWS -// --------------------------------------------------------------------------- - -void -MockImdsService::HandleAwsRequest(HttpServerRequest& Request) -{ - std::string_view Uri = Request.RelativeUri(); - - // IMDSv2 token acquisition (PUT only) - if (Uri == "latest/api/token" && Request.RequestVerb() == HttpVerb::kPut) - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.Token); - return; - } - - // Instance identity - if (Uri == "latest/meta-data/instance-id") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.InstanceId); - return; - } - - if (Uri == "latest/meta-data/placement/availability-zone") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.AvailabilityZone); - return; - } - - if (Uri == "latest/meta-data/instance-life-cycle") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.LifeCycle); - return; - } - - // Autoscaling lifecycle state — 404 when not in an ASG - if (Uri == "latest/meta-data/autoscaling/target-lifecycle-state") - { - if (Aws.AutoscalingState.empty()) - { - Request.WriteResponse(HttpResponseCode::NotFound); - return; - } - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.AutoscalingState); - return; - } - - // Spot interruption notice — 404 when no interruption pending - if (Uri == "latest/meta-data/spot/instance-action") - { - if (Aws.SpotAction.empty()) - { - Request.WriteResponse(HttpResponseCode::NotFound); - return; - } - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Aws.SpotAction); - return; - } - - Request.WriteResponse(HttpResponseCode::NotFound); -} - -// --------------------------------------------------------------------------- -// Azure -// --------------------------------------------------------------------------- - -void -MockImdsService::HandleAzureRequest(HttpServerRequest& Request) -{ - std::string_view Uri = Request.RelativeUri(); - - // Instance metadata (single JSON document) - if (Uri == "metadata/instance") - { - std::string Json = fmt::format(R"({{"compute":{{"vmId":"{}","location":"{}","priority":"{}","vmScaleSetName":"{}"}}}})", - Azure.VmId, - Azure.Location, - Azure.Priority, - Azure.VmScaleSetName); - - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Json); - return; - } - - // Scheduled events for termination monitoring - if (Uri == "metadata/scheduledevents") - { - std::string Json; - if (Azure.ScheduledEventType.empty()) - { - Json = R"({"Events":[]})"; - } - else - { - Json = fmt::format(R"({{"Events":[{{"EventType":"{}","EventStatus":"{}"}}]}})", - Azure.ScheduledEventType, - Azure.ScheduledEventStatus); - } - - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Json); - return; - } - - Request.WriteResponse(HttpResponseCode::NotFound); -} - -// --------------------------------------------------------------------------- -// GCP -// --------------------------------------------------------------------------- - -void -MockImdsService::HandleGcpRequest(HttpServerRequest& Request) -{ - std::string_view Uri = Request.RelativeUri(); - - if (Uri == "computeMetadata/v1/instance/id") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Gcp.InstanceId); - return; - } - - if (Uri == "computeMetadata/v1/instance/zone") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Gcp.Zone); - return; - } - - if (Uri == "computeMetadata/v1/instance/scheduling/preemptible") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Gcp.Preemptible); - return; - } - - if (Uri == "computeMetadata/v1/instance/maintenance-event") - { - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Gcp.MaintenanceEvent); - return; - } - - Request.WriteResponse(HttpResponseCode::NotFound); -} - -} // namespace zen::compute - -#endif // ZEN_WITH_TESTS +// Moved to zenutil/cloud/mockimds.cpp |