Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add file artifact inspect API do APIC #885

Merged
merged 10 commits into from Jul 17, 2023

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions api/golang/core/lib/enclaves/enclave_context.go
Expand Up @@ -345,6 +345,20 @@ func (enclaveCtx *EnclaveContext) DownloadFilesArtifact(ctx context.Context, art
return fileContent, nil
}

func (enclaveCtx *EnclaveContext) InspectFilesArtifact(ctx context.Context, artifactName services.FileArtifactName) (*kurtosis_core_rpc_api_bindings.InspectFilesArtifactContentsResponse, error) {
// TODO(vcolombo): Add a more intuitive return type to this call instead of returning the RPC response
response, err := enclaveCtx.client.InspectFilesArtifactContents(ctx, &kurtosis_core_rpc_api_bindings.InspectFilesArtifactContentsRequest{
victorcolombo marked this conversation as resolved.
Show resolved Hide resolved
FileNamesAndUuid: &kurtosis_core_rpc_api_bindings.FilesArtifactNameAndUuid{
FileName: string(artifactName),
FileUuid: "",
},
})
if err != nil {
return nil, stacktrace.Propagate(err, "An error occurred inspecting file artifacts")
}
return response, nil
}

// Docs available at https://docs.kurtosis.com/sdk#getexistingandhistoricalserviceidentifiers---serviceidentifiers-serviceidentifiers
func (enclaveCtx *EnclaveContext) GetExistingAndHistoricalServiceIdentifiers(ctx context.Context) (*services.ServiceIdentifiers, error) {
response, err := enclaveCtx.client.GetExistingAndHistoricalServiceIdentifiers(ctx, &emptypb.Empty{})
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions api/protobuf/core/api_container_service.proto
Expand Up @@ -45,6 +45,8 @@ service ApiContainerService {
rpc StoreFilesArtifactFromService(StoreFilesArtifactFromServiceArgs) returns (StoreFilesArtifactFromServiceResponse) {}

rpc ListFilesArtifactNamesAndUuids(google.protobuf.Empty) returns (ListFilesArtifactNamesAndUuidsResponse) {}

rpc InspectFilesArtifactContents(InspectFilesArtifactContentsRequest) returns (InspectFilesArtifactContentsResponse) {}
}

// ==============================================================================================
Expand Down Expand Up @@ -428,3 +430,24 @@ message FilesArtifactNameAndUuid {
message ListFilesArtifactNamesAndUuidsResponse {
repeated FilesArtifactNameAndUuid file_names_and_uuids = 1;
}

// ==============================================================================================
// Inspect Files Artifact Contents
// ==============================================================================================

message InspectFilesArtifactContentsRequest {
FilesArtifactNameAndUuid file_names_and_uuid = 1;
}

message InspectFilesArtifactContentsResponse {
repeated FileArtifactContentsFileDescription file_descriptions = 1;
}

message FileArtifactContentsFileDescription {
// Path relative to the file artifact
string path = 1;
victorcolombo marked this conversation as resolved.
Show resolved Hide resolved
// Size of the file, in bytes
uint64 size = 2;
// A bit of text content, if the file allows (similar to UNIX's 'head')
optional string text_preview = 3;
}
113 changes: 113 additions & 0 deletions api/rust/src/api_container_api.rs
Expand Up @@ -533,6 +533,31 @@ pub struct ListFilesArtifactNamesAndUuidsResponse {
#[prost(message, repeated, tag = "1")]
pub file_names_and_uuids: ::prost::alloc::vec::Vec<FilesArtifactNameAndUuid>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct InspectFilesArtifactContentsRequest {
#[prost(message, optional, tag = "1")]
pub file_names_and_uuid: ::core::option::Option<FilesArtifactNameAndUuid>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct InspectFilesArtifactContentsResponse {
#[prost(message, repeated, tag = "1")]
pub file_descriptions: ::prost::alloc::vec::Vec<FileArtifactContentsFileDescription>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct FileArtifactContentsFileDescription {
/// Path relative to the file artifact
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
/// Size of the file, in bytes
#[prost(uint64, tag = "2")]
pub size: u64,
/// A bit of text content, if the file allows (similar to UNIX's 'head')
#[prost(string, optional, tag = "3")]
pub text_preview: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum KurtosisFeatureFlag {
Expand Down Expand Up @@ -1038,6 +1063,36 @@ pub mod api_container_service_client {
);
self.inner.unary(req, path, codec).await
}
pub async fn inspect_files_artifact_contents(
&mut self,
request: impl tonic::IntoRequest<super::InspectFilesArtifactContentsRequest>,
) -> std::result::Result<
tonic::Response<super::InspectFilesArtifactContentsResponse>,
tonic::Status,
> {
self.inner
.ready()
.await
.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/api_container_api.ApiContainerService/InspectFilesArtifactContents",
);
let mut req = request.into_request();
req.extensions_mut()
.insert(
GrpcMethod::new(
"api_container_api.ApiContainerService",
"InspectFilesArtifactContents",
),
);
self.inner.unary(req, path, codec).await
}
}
}
/// Generated server implementations.
Expand Down Expand Up @@ -1159,6 +1214,13 @@ pub mod api_container_service_server {
tonic::Response<super::ListFilesArtifactNamesAndUuidsResponse>,
tonic::Status,
>;
async fn inspect_files_artifact_contents(
&self,
request: tonic::Request<super::InspectFilesArtifactContentsRequest>,
) -> std::result::Result<
tonic::Response<super::InspectFilesArtifactContentsResponse>,
tonic::Status,
>;
}
#[derive(Debug)]
pub struct ApiContainerServiceServer<T: ApiContainerService> {
Expand Down Expand Up @@ -1867,6 +1929,57 @@ pub mod api_container_service_server {
};
Box::pin(fut)
}
"/api_container_api.ApiContainerService/InspectFilesArtifactContents" => {
#[allow(non_camel_case_types)]
struct InspectFilesArtifactContentsSvc<T: ApiContainerService>(
pub Arc<T>,
);
impl<
T: ApiContainerService,
> tonic::server::UnaryService<
super::InspectFilesArtifactContentsRequest,
> for InspectFilesArtifactContentsSvc<T> {
type Response = super::InspectFilesArtifactContentsResponse;
type Future = BoxFuture<
tonic::Response<Self::Response>,
tonic::Status,
>;
fn call(
&mut self,
request: tonic::Request<
super::InspectFilesArtifactContentsRequest,
>,
) -> Self::Future {
let inner = Arc::clone(&self.0);
let fut = async move {
(*inner).inspect_files_artifact_contents(request).await
};
Box::pin(fut)
}
}
let accept_compression_encodings = self.accept_compression_encodings;
let send_compression_encodings = self.send_compression_encodings;
let max_decoding_message_size = self.max_decoding_message_size;
let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone();
let fut = async move {
let inner = inner.0;
let method = InspectFilesArtifactContentsSvc(inner);
let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec)
.apply_compression_config(
accept_compression_encodings,
send_compression_encodings,
)
.apply_max_message_size_config(
max_decoding_message_size,
max_encoding_message_size,
);
let res = grpc.unary(method, req).await;
Ok(res)
};
Box::pin(fut)
}
_ => {
Box::pin(async move {
Ok(
Expand Down
Expand Up @@ -21,6 +21,7 @@ interface IApiContainerServiceService extends grpc.ServiceDefinition<grpc.Untype
storeWebFilesArtifact: grpc.MethodDefinition<api_container_service_pb.StoreWebFilesArtifactArgs, api_container_service_pb.StoreWebFilesArtifactResponse>;
storeFilesArtifactFromService: grpc.MethodDefinition<api_container_service_pb.StoreFilesArtifactFromServiceArgs, api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
listFilesArtifactNamesAndUuids: grpc.MethodDefinition<google_protobuf_empty_pb.Empty, api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>;
inspectFilesArtifactContents: grpc.MethodDefinition<api_container_service_pb.InspectFilesArtifactContentsRequest, api_container_service_pb.InspectFilesArtifactContentsResponse>;
}

export const ApiContainerServiceService: IApiContainerServiceService;
Expand All @@ -39,6 +40,7 @@ export interface IApiContainerServiceServer extends grpc.UntypedServiceImplement
storeWebFilesArtifact: grpc.handleUnaryCall<api_container_service_pb.StoreWebFilesArtifactArgs, api_container_service_pb.StoreWebFilesArtifactResponse>;
storeFilesArtifactFromService: grpc.handleUnaryCall<api_container_service_pb.StoreFilesArtifactFromServiceArgs, api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
listFilesArtifactNamesAndUuids: grpc.handleUnaryCall<google_protobuf_empty_pb.Empty, api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>;
inspectFilesArtifactContents: grpc.handleUnaryCall<api_container_service_pb.InspectFilesArtifactContentsRequest, api_container_service_pb.InspectFilesArtifactContentsResponse>;
}

export class ApiContainerServiceClient extends grpc.Client {
Expand Down Expand Up @@ -79,4 +81,7 @@ export class ApiContainerServiceClient extends grpc.Client {
listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
inspectFilesArtifactContents(argument: api_container_service_pb.InspectFilesArtifactContentsRequest, callback: grpc.requestCallback<api_container_service_pb.InspectFilesArtifactContentsResponse>): grpc.ClientUnaryCall;
inspectFilesArtifactContents(argument: api_container_service_pb.InspectFilesArtifactContentsRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.InspectFilesArtifactContentsResponse>): grpc.ClientUnaryCall;
inspectFilesArtifactContents(argument: api_container_service_pb.InspectFilesArtifactContentsRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.InspectFilesArtifactContentsResponse>): grpc.ClientUnaryCall;
}