diff --git a/Makefile b/Makefile index 5e08dc2a5..ed49a7167 100644 --- a/Makefile +++ b/Makefile @@ -558,7 +558,7 @@ IS_UBUNTU_24_OR_NEWER := $(shell \ RUN_NETLAUNCH_TRIDENT_BIN ?= $(if $(filter yes,$(IS_UBUNTU_24_OR_NEWER)),bin/trident-azl3,bin/trident) -.PHONY: run-netlaunch run-netlaunch-stream +.PHONY: run-netlaunch run-netlaunch-stream run-netlaunch-proxy run-netlaunch: $(NETLAUNCH_CONFIG) $(TRIDENT_CONFIG) $(NETLAUNCH_ISO) bin/netlaunch validate artifacts/osmodifier $(RUN_NETLAUNCH_TRIDENT_BIN) @echo "Using trident binary: $(RUN_NETLAUNCH_TRIDENT_BIN)" @mkdir -p artifacts/test-image @@ -584,20 +584,34 @@ run-netlaunch-stream: $(NETLAUNCH_CONFIG) $(TRIDENT_CONFIG) $(NETLAUNCH_ISO) bin @cp $(RUN_NETLAUNCH_TRIDENT_BIN) artifacts/test-image/trident @cp artifacts/osmodifier artifacts/test-image/ @bin/netlaunch \ - --stream-image \ --trident-binary $(RUN_NETLAUNCH_TRIDENT_BIN) \ --osmodifier-binary artifacts/osmodifier \ - --rcp-agent-mode cli \ + --rcp-agent-mode grpc-stream \ --iso $(NETLAUNCH_ISO) \ $(if $(NETLAUNCH_PORT),--port $(NETLAUNCH_PORT)) \ --config $(NETLAUNCH_CONFIG) \ --trident $(TRIDENT_CONFIG) \ - --logstream \ --remoteaddress remote-addr \ --servefolder artifacts/test-image \ --trace-file trident-metrics.jsonl \ $(if $(LOG_TRACE),--log-trace) +run-netlaunch-proxy: $(NETLAUNCH_CONFIG) $(NETLAUNCH_ISO) bin/netlaunch artifacts/osmodifier $(RUN_NETLAUNCH_TRIDENT_BIN) + @echo "Using trident binary: $(RUN_NETLAUNCH_TRIDENT_BIN)" + @mkdir -p artifacts/test-image + @cp $(RUN_NETLAUNCH_TRIDENT_BIN) artifacts/test-image/trident + @cp artifacts/osmodifier artifacts/test-image/ + @bin/netlaunch \ + --trident-binary $(RUN_NETLAUNCH_TRIDENT_BIN) \ + --osmodifier-binary artifacts/osmodifier \ + --rcp-agent-mode grpc-local-proxy \ + --iso $(NETLAUNCH_ISO) \ + $(if $(NETLAUNCH_PORT),--port $(NETLAUNCH_PORT)) \ + --config $(NETLAUNCH_CONFIG) \ + --servefolder artifacts/test-image \ + --trace-file trident-metrics.jsonl \ + $(if $(LOG_TRACE),--log-trace) + # To run this, VM requires at least 11 GiB of memory (virt-deploy create --mem 11). .PHONY: run-netlaunch-container-images run-netlaunch-container-images: \ diff --git a/tools/cmd/bpatest/bpapb/gen/bmiprepagent.pb.go b/tools/cmd/bpatest/bpapb/gen/bmiprepagent.pb.go new file mode 100644 index 000000000..fcb67bbb7 --- /dev/null +++ b/tools/cmd/bpatest/bpapb/gen/bmiprepagent.pb.go @@ -0,0 +1,2722 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v6.33.4 +// source: bmiprepagent.proto + +package bpapb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ErrorCode int32 + +const ( + // Service + ErrorCode_SERVICE_NOT_IDLE ErrorCode = 0 + ErrorCode_SERVICE_INCORRECT_STATE ErrorCode = 1 + ErrorCode_SERVICE_ERROR ErrorCode = 2 + ErrorCode_SERVICE_IO_ERROR ErrorCode = 3 + ErrorCode_SERVICE_NO_RESPONSE ErrorCode = 4 + ErrorCode_BLOCK_DEVICE_NOT_FOUND ErrorCode = 101 + ErrorCode_NOT_A_BLOCK_DEVICE ErrorCode = 102 + ErrorCode_FILE_ERROR ErrorCode = 200 + ErrorCode_CONVERT_OS_ERROR ErrorCode = 300 + ErrorCode_FLASH_FAILED ErrorCode = 400 +) + +// Enum value maps for ErrorCode. +var ( + ErrorCode_name = map[int32]string{ + 0: "SERVICE_NOT_IDLE", + 1: "SERVICE_INCORRECT_STATE", + 2: "SERVICE_ERROR", + 3: "SERVICE_IO_ERROR", + 4: "SERVICE_NO_RESPONSE", + 101: "BLOCK_DEVICE_NOT_FOUND", + 102: "NOT_A_BLOCK_DEVICE", + 200: "FILE_ERROR", + 300: "CONVERT_OS_ERROR", + 400: "FLASH_FAILED", + } + ErrorCode_value = map[string]int32{ + "SERVICE_NOT_IDLE": 0, + "SERVICE_INCORRECT_STATE": 1, + "SERVICE_ERROR": 2, + "SERVICE_IO_ERROR": 3, + "SERVICE_NO_RESPONSE": 4, + "BLOCK_DEVICE_NOT_FOUND": 101, + "NOT_A_BLOCK_DEVICE": 102, + "FILE_ERROR": 200, + "CONVERT_OS_ERROR": 300, + "FLASH_FAILED": 400, + } +) + +func (x ErrorCode) Enum() *ErrorCode { + p := new(ErrorCode) + *p = x + return p +} + +func (x ErrorCode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ErrorCode) Descriptor() protoreflect.EnumDescriptor { + return file_bmiprepagent_proto_enumTypes[0].Descriptor() +} + +func (ErrorCode) Type() protoreflect.EnumType { + return &file_bmiprepagent_proto_enumTypes[0] +} + +func (x ErrorCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ErrorCode.Descriptor instead. +func (ErrorCode) EnumDescriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{0} +} + +type TelemetryType int32 + +const ( + TelemetryType_HEARTBEAT TelemetryType = 0 + TelemetryType_DMESG TelemetryType = 1 + TelemetryType_JOURNAL TelemetryType = 2 +) + +// Enum value maps for TelemetryType. +var ( + TelemetryType_name = map[int32]string{ + 0: "HEARTBEAT", + 1: "DMESG", + 2: "JOURNAL", + } + TelemetryType_value = map[string]int32{ + "HEARTBEAT": 0, + "DMESG": 1, + "JOURNAL": 2, + } +) + +func (x TelemetryType) Enum() *TelemetryType { + p := new(TelemetryType) + *p = x + return p +} + +func (x TelemetryType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TelemetryType) Descriptor() protoreflect.EnumDescriptor { + return file_bmiprepagent_proto_enumTypes[1].Descriptor() +} + +func (TelemetryType) Type() protoreflect.EnumType { + return &file_bmiprepagent_proto_enumTypes[1] +} + +func (x TelemetryType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TelemetryType.Descriptor instead. +func (TelemetryType) EnumDescriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{1} +} + +type PrepOsVersionRequestType int32 + +const ( + // Request all versions in the PrepOS versioning file + PrepOsVersionRequestType_ALL_VERSIONS PrepOsVersionRequestType = 0 + // Request specific JSON fields + PrepOsVersionRequestType_SPECIFIC_VERSIONS PrepOsVersionRequestType = 1 +) + +// Enum value maps for PrepOsVersionRequestType. +var ( + PrepOsVersionRequestType_name = map[int32]string{ + 0: "ALL_VERSIONS", + 1: "SPECIFIC_VERSIONS", + } + PrepOsVersionRequestType_value = map[string]int32{ + "ALL_VERSIONS": 0, + "SPECIFIC_VERSIONS": 1, + } +) + +func (x PrepOsVersionRequestType) Enum() *PrepOsVersionRequestType { + p := new(PrepOsVersionRequestType) + *p = x + return p +} + +func (x PrepOsVersionRequestType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PrepOsVersionRequestType) Descriptor() protoreflect.EnumDescriptor { + return file_bmiprepagent_proto_enumTypes[2].Descriptor() +} + +func (PrepOsVersionRequestType) Type() protoreflect.EnumType { + return &file_bmiprepagent_proto_enumTypes[2] +} + +func (x PrepOsVersionRequestType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PrepOsVersionRequestType.Descriptor instead. +func (PrepOsVersionRequestType) EnumDescriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{2} +} + +type ChecksumType int32 + +const ( + ChecksumType_DEFAULT ChecksumType = 0 + ChecksumType_CRC32 ChecksumType = 1 + ChecksumType_SHA256 ChecksumType = 2 +) + +// Enum value maps for ChecksumType. +var ( + ChecksumType_name = map[int32]string{ + 0: "DEFAULT", + 1: "CRC32", + 2: "SHA256", + } + ChecksumType_value = map[string]int32{ + "DEFAULT": 0, + "CRC32": 1, + "SHA256": 2, + } +) + +func (x ChecksumType) Enum() *ChecksumType { + p := new(ChecksumType) + *p = x + return p +} + +func (x ChecksumType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ChecksumType) Descriptor() protoreflect.EnumDescriptor { + return file_bmiprepagent_proto_enumTypes[3].Descriptor() +} + +func (ChecksumType) Type() protoreflect.EnumType { + return &file_bmiprepagent_proto_enumTypes[3] +} + +func (x ChecksumType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ChecksumType.Descriptor instead. +func (ChecksumType) EnumDescriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{3} +} + +// Extended error information that will be serialized into Status::detail for errors. +// This follows the provider service pattern for structured error information. +type ExtendedErrorInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Some specific error code - can have policy to define retry and fault parameters based on this error code + ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + // IcM routing path for the team that can look into the error + EscalateTo string `protobuf:"bytes,2,opt,name=escalate_to,json=escalateTo,proto3" json:"escalate_to,omitempty"` + // Arbitrary key/value strings that can be logged + ExtendedDetails map[string]string `protobuf:"bytes,3,rep,name=extended_details,json=extendedDetails,proto3" json:"extended_details,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExtendedErrorInfo) Reset() { + *x = ExtendedErrorInfo{} + mi := &file_bmiprepagent_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExtendedErrorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtendedErrorInfo) ProtoMessage() {} + +func (x *ExtendedErrorInfo) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtendedErrorInfo.ProtoReflect.Descriptor instead. +func (*ExtendedErrorInfo) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{0} +} + +func (x *ExtendedErrorInfo) GetErrorCode() int32 { + if x != nil { + return x.ErrorCode + } + return 0 +} + +func (x *ExtendedErrorInfo) GetEscalateTo() string { + if x != nil { + return x.EscalateTo + } + return "" +} + +func (x *ExtendedErrorInfo) GetExtendedDetails() map[string]string { + if x != nil { + return x.ExtendedDetails + } + return nil +} + +type PingRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PingRequest) Reset() { + *x = PingRequest{} + mi := &file_bmiprepagent_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingRequest) ProtoMessage() {} + +func (x *PingRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. +func (*PingRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{1} +} + +type PingResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PingResponse) Reset() { + *x = PingResponse{} + mi := &file_bmiprepagent_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingResponse) ProtoMessage() {} + +func (x *PingResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingResponse.ProtoReflect.Descriptor instead. +func (*PingResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{2} +} + +type StartUploadOsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileId string `protobuf:"bytes,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + FileSize uint64 `protobuf:"varint,2,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartUploadOsRequest) Reset() { + *x = StartUploadOsRequest{} + mi := &file_bmiprepagent_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartUploadOsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartUploadOsRequest) ProtoMessage() {} + +func (x *StartUploadOsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartUploadOsRequest.ProtoReflect.Descriptor instead. +func (*StartUploadOsRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{3} +} + +func (x *StartUploadOsRequest) GetFileId() string { + if x != nil { + return x.FileId + } + return "" +} + +func (x *StartUploadOsRequest) GetFileSize() uint64 { + if x != nil { + return x.FileSize + } + return 0 +} + +type StartUploadOsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *StartUploadOsResponse_Success + // *StartUploadOsResponse_Failure + Response isStartUploadOsResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartUploadOsResponse) Reset() { + *x = StartUploadOsResponse{} + mi := &file_bmiprepagent_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartUploadOsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartUploadOsResponse) ProtoMessage() {} + +func (x *StartUploadOsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartUploadOsResponse.ProtoReflect.Descriptor instead. +func (*StartUploadOsResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{4} +} + +func (x *StartUploadOsResponse) GetResponse() isStartUploadOsResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *StartUploadOsResponse) GetSuccess() *StartUploadOsSuccessResponse { + if x != nil { + if x, ok := x.Response.(*StartUploadOsResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *StartUploadOsResponse) GetFailure() *StartUploadOsFailureResponse { + if x != nil { + if x, ok := x.Response.(*StartUploadOsResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isStartUploadOsResponse_Response interface { + isStartUploadOsResponse_Response() +} + +type StartUploadOsResponse_Success struct { + Success *StartUploadOsSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type StartUploadOsResponse_Failure struct { + Failure *StartUploadOsFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*StartUploadOsResponse_Success) isStartUploadOsResponse_Response() {} + +func (*StartUploadOsResponse_Failure) isStartUploadOsResponse_Response() {} + +type StartUploadOsSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartUploadOsSuccessResponse) Reset() { + *x = StartUploadOsSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartUploadOsSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartUploadOsSuccessResponse) ProtoMessage() {} + +func (x *StartUploadOsSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartUploadOsSuccessResponse.ProtoReflect.Descriptor instead. +func (*StartUploadOsSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{5} +} + +type StartUploadOsFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartUploadOsFailureResponse) Reset() { + *x = StartUploadOsFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartUploadOsFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartUploadOsFailureResponse) ProtoMessage() {} + +func (x *StartUploadOsFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartUploadOsFailureResponse.ProtoReflect.Descriptor instead. +func (*StartUploadOsFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{6} +} + +func (x *StartUploadOsFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +type UploadOsChunkRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileId string `protobuf:"bytes,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + Offset uint64 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` + Length uint64 `protobuf:"varint,3,opt,name=length,proto3" json:"length,omitempty"` + Content []byte `protobuf:"bytes,4,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UploadOsChunkRequest) Reset() { + *x = UploadOsChunkRequest{} + mi := &file_bmiprepagent_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UploadOsChunkRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadOsChunkRequest) ProtoMessage() {} + +func (x *UploadOsChunkRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UploadOsChunkRequest.ProtoReflect.Descriptor instead. +func (*UploadOsChunkRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{7} +} + +func (x *UploadOsChunkRequest) GetFileId() string { + if x != nil { + return x.FileId + } + return "" +} + +func (x *UploadOsChunkRequest) GetOffset() uint64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *UploadOsChunkRequest) GetLength() uint64 { + if x != nil { + return x.Length + } + return 0 +} + +func (x *UploadOsChunkRequest) GetContent() []byte { + if x != nil { + return x.Content + } + return nil +} + +type UploadOsChunkResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *UploadOsChunkResponse_Success + // *UploadOsChunkResponse_Failure + Response isUploadOsChunkResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UploadOsChunkResponse) Reset() { + *x = UploadOsChunkResponse{} + mi := &file_bmiprepagent_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UploadOsChunkResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadOsChunkResponse) ProtoMessage() {} + +func (x *UploadOsChunkResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UploadOsChunkResponse.ProtoReflect.Descriptor instead. +func (*UploadOsChunkResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{8} +} + +func (x *UploadOsChunkResponse) GetResponse() isUploadOsChunkResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *UploadOsChunkResponse) GetSuccess() *UploadOsChunkSuccessResponse { + if x != nil { + if x, ok := x.Response.(*UploadOsChunkResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *UploadOsChunkResponse) GetFailure() *UploadOsChunkFailureResponse { + if x != nil { + if x, ok := x.Response.(*UploadOsChunkResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isUploadOsChunkResponse_Response interface { + isUploadOsChunkResponse_Response() +} + +type UploadOsChunkResponse_Success struct { + Success *UploadOsChunkSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type UploadOsChunkResponse_Failure struct { + Failure *UploadOsChunkFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*UploadOsChunkResponse_Success) isUploadOsChunkResponse_Response() {} + +func (*UploadOsChunkResponse_Failure) isUploadOsChunkResponse_Response() {} + +type UploadOsChunkSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UploadOsChunkSuccessResponse) Reset() { + *x = UploadOsChunkSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UploadOsChunkSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadOsChunkSuccessResponse) ProtoMessage() {} + +func (x *UploadOsChunkSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UploadOsChunkSuccessResponse.ProtoReflect.Descriptor instead. +func (*UploadOsChunkSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{9} +} + +type UploadOsChunkFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UploadOsChunkFailureResponse) Reset() { + *x = UploadOsChunkFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UploadOsChunkFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadOsChunkFailureResponse) ProtoMessage() {} + +func (x *UploadOsChunkFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UploadOsChunkFailureResponse.ProtoReflect.Descriptor instead. +func (*UploadOsChunkFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{10} +} + +func (x *UploadOsChunkFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +type FinishUploadOsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileId string `protobuf:"bytes,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FinishUploadOsRequest) Reset() { + *x = FinishUploadOsRequest{} + mi := &file_bmiprepagent_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FinishUploadOsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FinishUploadOsRequest) ProtoMessage() {} + +func (x *FinishUploadOsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FinishUploadOsRequest.ProtoReflect.Descriptor instead. +func (*FinishUploadOsRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{11} +} + +func (x *FinishUploadOsRequest) GetFileId() string { + if x != nil { + return x.FileId + } + return "" +} + +type FinishUploadOsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *FinishUploadOsResponse_Success + // *FinishUploadOsResponse_Failure + Response isFinishUploadOsResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FinishUploadOsResponse) Reset() { + *x = FinishUploadOsResponse{} + mi := &file_bmiprepagent_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FinishUploadOsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FinishUploadOsResponse) ProtoMessage() {} + +func (x *FinishUploadOsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FinishUploadOsResponse.ProtoReflect.Descriptor instead. +func (*FinishUploadOsResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{12} +} + +func (x *FinishUploadOsResponse) GetResponse() isFinishUploadOsResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *FinishUploadOsResponse) GetSuccess() *FinishUploadOsSuccessResponse { + if x != nil { + if x, ok := x.Response.(*FinishUploadOsResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *FinishUploadOsResponse) GetFailure() *FinishUploadOsFailureResponse { + if x != nil { + if x, ok := x.Response.(*FinishUploadOsResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isFinishUploadOsResponse_Response interface { + isFinishUploadOsResponse_Response() +} + +type FinishUploadOsResponse_Success struct { + Success *FinishUploadOsSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type FinishUploadOsResponse_Failure struct { + Failure *FinishUploadOsFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*FinishUploadOsResponse_Success) isFinishUploadOsResponse_Response() {} + +func (*FinishUploadOsResponse_Failure) isFinishUploadOsResponse_Response() {} + +type FinishUploadOsSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ChecksumValue string `protobuf:"bytes,1,opt,name=checksumValue,proto3" json:"checksumValue,omitempty"` + ChecksumType ChecksumType `protobuf:"varint,2,opt,name=checksumType,proto3,enum=bmiprepagent.ChecksumType" json:"checksumType,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FinishUploadOsSuccessResponse) Reset() { + *x = FinishUploadOsSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FinishUploadOsSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FinishUploadOsSuccessResponse) ProtoMessage() {} + +func (x *FinishUploadOsSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FinishUploadOsSuccessResponse.ProtoReflect.Descriptor instead. +func (*FinishUploadOsSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{13} +} + +func (x *FinishUploadOsSuccessResponse) GetChecksumValue() string { + if x != nil { + return x.ChecksumValue + } + return "" +} + +func (x *FinishUploadOsSuccessResponse) GetChecksumType() ChecksumType { + if x != nil { + return x.ChecksumType + } + return ChecksumType_DEFAULT +} + +type FinishUploadOsFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FinishUploadOsFailureResponse) Reset() { + *x = FinishUploadOsFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FinishUploadOsFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FinishUploadOsFailureResponse) ProtoMessage() {} + +func (x *FinishUploadOsFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FinishUploadOsFailureResponse.ProtoReflect.Descriptor instead. +func (*FinishUploadOsFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{14} +} + +func (x *FinishUploadOsFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +type ConvertOsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileId string `protobuf:"bytes,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConvertOsRequest) Reset() { + *x = ConvertOsRequest{} + mi := &file_bmiprepagent_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConvertOsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConvertOsRequest) ProtoMessage() {} + +func (x *ConvertOsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConvertOsRequest.ProtoReflect.Descriptor instead. +func (*ConvertOsRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{15} +} + +func (x *ConvertOsRequest) GetFileId() string { + if x != nil { + return x.FileId + } + return "" +} + +type ConvertOsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *ConvertOsResponse_Success + // *ConvertOsResponse_Failure + Response isConvertOsResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConvertOsResponse) Reset() { + *x = ConvertOsResponse{} + mi := &file_bmiprepagent_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConvertOsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConvertOsResponse) ProtoMessage() {} + +func (x *ConvertOsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConvertOsResponse.ProtoReflect.Descriptor instead. +func (*ConvertOsResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{16} +} + +func (x *ConvertOsResponse) GetResponse() isConvertOsResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *ConvertOsResponse) GetSuccess() *ConvertOsSuccessResponse { + if x != nil { + if x, ok := x.Response.(*ConvertOsResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *ConvertOsResponse) GetFailure() *ConvertOsFailureResponse { + if x != nil { + if x, ok := x.Response.(*ConvertOsResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isConvertOsResponse_Response interface { + isConvertOsResponse_Response() +} + +type ConvertOsResponse_Success struct { + Success *ConvertOsSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type ConvertOsResponse_Failure struct { + Failure *ConvertOsFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*ConvertOsResponse_Success) isConvertOsResponse_Response() {} + +func (*ConvertOsResponse_Failure) isConvertOsResponse_Response() {} + +type ConvertOsSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ChecksumValue string `protobuf:"bytes,1,opt,name=checksumValue,proto3" json:"checksumValue,omitempty"` + ChecksumType ChecksumType `protobuf:"varint,2,opt,name=checksumType,proto3,enum=bmiprepagent.ChecksumType" json:"checksumType,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConvertOsSuccessResponse) Reset() { + *x = ConvertOsSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConvertOsSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConvertOsSuccessResponse) ProtoMessage() {} + +func (x *ConvertOsSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConvertOsSuccessResponse.ProtoReflect.Descriptor instead. +func (*ConvertOsSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{17} +} + +func (x *ConvertOsSuccessResponse) GetChecksumValue() string { + if x != nil { + return x.ChecksumValue + } + return "" +} + +func (x *ConvertOsSuccessResponse) GetChecksumType() ChecksumType { + if x != nil { + return x.ChecksumType + } + return ChecksumType_DEFAULT +} + +type ConvertOsFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConvertOsFailureResponse) Reset() { + *x = ConvertOsFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConvertOsFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConvertOsFailureResponse) ProtoMessage() {} + +func (x *ConvertOsFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConvertOsFailureResponse.ProtoReflect.Descriptor instead. +func (*ConvertOsFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{18} +} + +func (x *ConvertOsFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +type FlashOsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileId string `protobuf:"bytes,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FlashOsRequest) Reset() { + *x = FlashOsRequest{} + mi := &file_bmiprepagent_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FlashOsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlashOsRequest) ProtoMessage() {} + +func (x *FlashOsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlashOsRequest.ProtoReflect.Descriptor instead. +func (*FlashOsRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{19} +} + +func (x *FlashOsRequest) GetFileId() string { + if x != nil { + return x.FileId + } + return "" +} + +type FlashOsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *FlashOsResponse_Success + // *FlashOsResponse_Failure + Response isFlashOsResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FlashOsResponse) Reset() { + *x = FlashOsResponse{} + mi := &file_bmiprepagent_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FlashOsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlashOsResponse) ProtoMessage() {} + +func (x *FlashOsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlashOsResponse.ProtoReflect.Descriptor instead. +func (*FlashOsResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{20} +} + +func (x *FlashOsResponse) GetResponse() isFlashOsResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *FlashOsResponse) GetSuccess() *FlashOsSuccessResponse { + if x != nil { + if x, ok := x.Response.(*FlashOsResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *FlashOsResponse) GetFailure() *FlashOsFailureResponse { + if x != nil { + if x, ok := x.Response.(*FlashOsResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isFlashOsResponse_Response interface { + isFlashOsResponse_Response() +} + +type FlashOsResponse_Success struct { + Success *FlashOsSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type FlashOsResponse_Failure struct { + Failure *FlashOsFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*FlashOsResponse_Success) isFlashOsResponse_Response() {} + +func (*FlashOsResponse_Failure) isFlashOsResponse_Response() {} + +type FlashOsSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ChecksumValue string `protobuf:"bytes,1,opt,name=checksumValue,proto3" json:"checksumValue,omitempty"` + ChecksumType ChecksumType `protobuf:"varint,2,opt,name=checksumType,proto3,enum=bmiprepagent.ChecksumType" json:"checksumType,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FlashOsSuccessResponse) Reset() { + *x = FlashOsSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FlashOsSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlashOsSuccessResponse) ProtoMessage() {} + +func (x *FlashOsSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlashOsSuccessResponse.ProtoReflect.Descriptor instead. +func (*FlashOsSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{21} +} + +func (x *FlashOsSuccessResponse) GetChecksumValue() string { + if x != nil { + return x.ChecksumValue + } + return "" +} + +func (x *FlashOsSuccessResponse) GetChecksumType() ChecksumType { + if x != nil { + return x.ChecksumType + } + return ChecksumType_DEFAULT +} + +type FlashOsFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FlashOsFailureResponse) Reset() { + *x = FlashOsFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FlashOsFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlashOsFailureResponse) ProtoMessage() {} + +func (x *FlashOsFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlashOsFailureResponse.ProtoReflect.Descriptor instead. +func (*FlashOsFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{22} +} + +func (x *FlashOsFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +// Command request from BMI-Helper, used to implement sanitization and other workflows +type SanitizeHostRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + FullCommand string `protobuf:"bytes,1,opt,name=full_command,json=fullCommand,proto3" json:"full_command,omitempty"` + CommandString string `protobuf:"bytes,2,opt,name=command_string,json=commandString,proto3" json:"command_string,omitempty"` + Arguments []string `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SanitizeHostRequest) Reset() { + *x = SanitizeHostRequest{} + mi := &file_bmiprepagent_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SanitizeHostRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SanitizeHostRequest) ProtoMessage() {} + +func (x *SanitizeHostRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SanitizeHostRequest.ProtoReflect.Descriptor instead. +func (*SanitizeHostRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{23} +} + +func (x *SanitizeHostRequest) GetFullCommand() string { + if x != nil { + return x.FullCommand + } + return "" +} + +func (x *SanitizeHostRequest) GetCommandString() string { + if x != nil { + return x.CommandString + } + return "" +} + +func (x *SanitizeHostRequest) GetArguments() []string { + if x != nil { + return x.Arguments + } + return nil +} + +// Command response from BPA to BMI-Helper, used to see the result of a generic command +type SanitizeHostResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + ResultStdout string `protobuf:"bytes,2,opt,name=result_stdout,json=resultStdout,proto3" json:"result_stdout,omitempty"` + ResultStderror string `protobuf:"bytes,3,opt,name=result_stderror,json=resultStderror,proto3" json:"result_stderror,omitempty"` + ExitCode string `protobuf:"bytes,4,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SanitizeHostResponse) Reset() { + *x = SanitizeHostResponse{} + mi := &file_bmiprepagent_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SanitizeHostResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SanitizeHostResponse) ProtoMessage() {} + +func (x *SanitizeHostResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SanitizeHostResponse.ProtoReflect.Descriptor instead. +func (*SanitizeHostResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{24} +} + +func (x *SanitizeHostResponse) GetCommand() string { + if x != nil { + return x.Command + } + return "" +} + +func (x *SanitizeHostResponse) GetResultStdout() string { + if x != nil { + return x.ResultStdout + } + return "" +} + +func (x *SanitizeHostResponse) GetResultStderror() string { + if x != nil { + return x.ResultStderror + } + return "" +} + +func (x *SanitizeHostResponse) GetExitCode() string { + if x != nil { + return x.ExitCode + } + return "" +} + +type FetchLogsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchLogsRequest) Reset() { + *x = FetchLogsRequest{} + mi := &file_bmiprepagent_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchLogsRequest) ProtoMessage() {} + +func (x *FetchLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchLogsRequest.ProtoReflect.Descriptor instead. +func (*FetchLogsRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{25} +} + +type FetchLogsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *FetchLogsResponse_Success + // *FetchLogsResponse_Failure + Response isFetchLogsResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchLogsResponse) Reset() { + *x = FetchLogsResponse{} + mi := &file_bmiprepagent_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchLogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchLogsResponse) ProtoMessage() {} + +func (x *FetchLogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchLogsResponse.ProtoReflect.Descriptor instead. +func (*FetchLogsResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{26} +} + +func (x *FetchLogsResponse) GetResponse() isFetchLogsResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *FetchLogsResponse) GetSuccess() *FetchLogsSuccessResponse { + if x != nil { + if x, ok := x.Response.(*FetchLogsResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *FetchLogsResponse) GetFailure() *FetchLogsFailureResponse { + if x != nil { + if x, ok := x.Response.(*FetchLogsResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isFetchLogsResponse_Response interface { + isFetchLogsResponse_Response() +} + +type FetchLogsResponse_Success struct { + Success *FetchLogsSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type FetchLogsResponse_Failure struct { + Failure *FetchLogsFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*FetchLogsResponse_Success) isFetchLogsResponse_Response() {} + +func (*FetchLogsResponse_Failure) isFetchLogsResponse_Response() {} + +type FetchLogsSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Log string `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchLogsSuccessResponse) Reset() { + *x = FetchLogsSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchLogsSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchLogsSuccessResponse) ProtoMessage() {} + +func (x *FetchLogsSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchLogsSuccessResponse.ProtoReflect.Descriptor instead. +func (*FetchLogsSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{27} +} + +func (x *FetchLogsSuccessResponse) GetLog() string { + if x != nil { + return x.Log + } + return "" +} + +type FetchLogsFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails map[string]string `protobuf:"bytes,1,rep,name=errorDetails,proto3" json:"errorDetails,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchLogsFailureResponse) Reset() { + *x = FetchLogsFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchLogsFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchLogsFailureResponse) ProtoMessage() {} + +func (x *FetchLogsFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchLogsFailureResponse.ProtoReflect.Descriptor instead. +func (*FetchLogsFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{28} +} + +func (x *FetchLogsFailureResponse) GetErrorDetails() map[string]string { + if x != nil { + return x.ErrorDetails + } + return nil +} + +type FetchTelemetryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + DmesgFiltCfg *DmesgFilterConfig `protobuf:"bytes,1,opt,name=dmesg_filt_cfg,json=dmesgFiltCfg,proto3" json:"dmesg_filt_cfg,omitempty"` + JournFiltCfg *JournalFilterConfig `protobuf:"bytes,2,opt,name=journ_filt_cfg,json=journFiltCfg,proto3" json:"journ_filt_cfg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchTelemetryRequest) Reset() { + *x = FetchTelemetryRequest{} + mi := &file_bmiprepagent_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchTelemetryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchTelemetryRequest) ProtoMessage() {} + +func (x *FetchTelemetryRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchTelemetryRequest.ProtoReflect.Descriptor instead. +func (*FetchTelemetryRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{29} +} + +func (x *FetchTelemetryRequest) GetDmesgFiltCfg() *DmesgFilterConfig { + if x != nil { + return x.DmesgFiltCfg + } + return nil +} + +func (x *FetchTelemetryRequest) GetJournFiltCfg() *JournalFilterConfig { + if x != nil { + return x.JournFiltCfg + } + return nil +} + +type JournalFilterConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + SendJourn bool `protobuf:"varint,1,opt,name=send_journ,json=sendJourn,proto3" json:"send_journ,omitempty"` + JournFlushCount uint32 `protobuf:"varint,2,opt,name=journ_flush_count,json=journFlushCount,proto3" json:"journ_flush_count,omitempty"` + JournFilters []*JournalFilterEntry `protobuf:"bytes,3,rep,name=journ_filters,json=journFilters,proto3" json:"journ_filters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JournalFilterConfig) Reset() { + *x = JournalFilterConfig{} + mi := &file_bmiprepagent_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JournalFilterConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JournalFilterConfig) ProtoMessage() {} + +func (x *JournalFilterConfig) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JournalFilterConfig.ProtoReflect.Descriptor instead. +func (*JournalFilterConfig) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{30} +} + +func (x *JournalFilterConfig) GetSendJourn() bool { + if x != nil { + return x.SendJourn + } + return false +} + +func (x *JournalFilterConfig) GetJournFlushCount() uint32 { + if x != nil { + return x.JournFlushCount + } + return 0 +} + +func (x *JournalFilterConfig) GetJournFilters() []*JournalFilterEntry { + if x != nil { + return x.JournFilters + } + return nil +} + +type JournalFilterEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + FilterKey string `protobuf:"bytes,1,opt,name=filter_key,json=filterKey,proto3" json:"filter_key,omitempty"` + FilterValRegex string `protobuf:"bytes,2,opt,name=filter_val_regex,json=filterValRegex,proto3" json:"filter_val_regex,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JournalFilterEntry) Reset() { + *x = JournalFilterEntry{} + mi := &file_bmiprepagent_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JournalFilterEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JournalFilterEntry) ProtoMessage() {} + +func (x *JournalFilterEntry) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JournalFilterEntry.ProtoReflect.Descriptor instead. +func (*JournalFilterEntry) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{31} +} + +func (x *JournalFilterEntry) GetFilterKey() string { + if x != nil { + return x.FilterKey + } + return "" +} + +func (x *JournalFilterEntry) GetFilterValRegex() string { + if x != nil { + return x.FilterValRegex + } + return "" +} + +type DmesgFilterConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + SendDmesg bool `protobuf:"varint,1,opt,name=send_dmesg,json=sendDmesg,proto3" json:"send_dmesg,omitempty"` + DmesgFilters []*DmesgFilterEntry `protobuf:"bytes,2,rep,name=dmesg_filters,json=dmesgFilters,proto3" json:"dmesg_filters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DmesgFilterConfig) Reset() { + *x = DmesgFilterConfig{} + mi := &file_bmiprepagent_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DmesgFilterConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DmesgFilterConfig) ProtoMessage() {} + +func (x *DmesgFilterConfig) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DmesgFilterConfig.ProtoReflect.Descriptor instead. +func (*DmesgFilterConfig) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{32} +} + +func (x *DmesgFilterConfig) GetSendDmesg() bool { + if x != nil { + return x.SendDmesg + } + return false +} + +func (x *DmesgFilterConfig) GetDmesgFilters() []*DmesgFilterEntry { + if x != nil { + return x.DmesgFilters + } + return nil +} + +type DmesgFilterEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + FilterValRegex string `protobuf:"bytes,1,opt,name=filter_val_regex,json=filterValRegex,proto3" json:"filter_val_regex,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DmesgFilterEntry) Reset() { + *x = DmesgFilterEntry{} + mi := &file_bmiprepagent_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DmesgFilterEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DmesgFilterEntry) ProtoMessage() {} + +func (x *DmesgFilterEntry) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DmesgFilterEntry.ProtoReflect.Descriptor instead. +func (*DmesgFilterEntry) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{33} +} + +func (x *DmesgFilterEntry) GetFilterValRegex() string { + if x != nil { + return x.FilterValRegex + } + return "" +} + +type FetchTelemetryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + TelemType TelemetryType `protobuf:"varint,1,opt,name=telemType,proto3,enum=bmiprepagent.TelemetryType" json:"telemType,omitempty"` + LogMsg string `protobuf:"bytes,2,opt,name=log_msg,json=logMsg,proto3" json:"log_msg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchTelemetryResponse) Reset() { + *x = FetchTelemetryResponse{} + mi := &file_bmiprepagent_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchTelemetryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchTelemetryResponse) ProtoMessage() {} + +func (x *FetchTelemetryResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchTelemetryResponse.ProtoReflect.Descriptor instead. +func (*FetchTelemetryResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{34} +} + +func (x *FetchTelemetryResponse) GetTelemType() TelemetryType { + if x != nil { + return x.TelemType + } + return TelemetryType_HEARTBEAT +} + +func (x *FetchTelemetryResponse) GetLogMsg() string { + if x != nil { + return x.LogMsg + } + return "" +} + +type PrepOsVersionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RequestType PrepOsVersionRequestType `protobuf:"varint,1,opt,name=request_type,json=requestType,proto3,enum=bmiprepagent.PrepOsVersionRequestType" json:"request_type,omitempty"` + // If requestType is SPECIFIC_VERSIONS, this field contains the specific JSON fields to + // request in a format like "PrepOS.PrepOS_Version" or "PrepoOS.Downloads.LinuxMOS" + JsonVersFields []string `protobuf:"bytes,2,rep,name=json_vers_fields,json=jsonVersFields,proto3" json:"json_vers_fields,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepOsVersionRequest) Reset() { + *x = PrepOsVersionRequest{} + mi := &file_bmiprepagent_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepOsVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepOsVersionRequest) ProtoMessage() {} + +func (x *PrepOsVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[35] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrepOsVersionRequest.ProtoReflect.Descriptor instead. +func (*PrepOsVersionRequest) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{35} +} + +func (x *PrepOsVersionRequest) GetRequestType() PrepOsVersionRequestType { + if x != nil { + return x.RequestType + } + return PrepOsVersionRequestType_ALL_VERSIONS +} + +func (x *PrepOsVersionRequest) GetJsonVersFields() []string { + if x != nil { + return x.JsonVersFields + } + return nil +} + +type PrepOsVersionResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: + // + // *PrepOsVersionResponse_Success + // *PrepOsVersionResponse_Failure + Response isPrepOsVersionResponse_Response `protobuf_oneof:"response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepOsVersionResponse) Reset() { + *x = PrepOsVersionResponse{} + mi := &file_bmiprepagent_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepOsVersionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepOsVersionResponse) ProtoMessage() {} + +func (x *PrepOsVersionResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrepOsVersionResponse.ProtoReflect.Descriptor instead. +func (*PrepOsVersionResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{36} +} + +func (x *PrepOsVersionResponse) GetResponse() isPrepOsVersionResponse_Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *PrepOsVersionResponse) GetSuccess() *PrepOsVersionSuccessResponse { + if x != nil { + if x, ok := x.Response.(*PrepOsVersionResponse_Success); ok { + return x.Success + } + } + return nil +} + +func (x *PrepOsVersionResponse) GetFailure() *PrepOsVersionFailureResponse { + if x != nil { + if x, ok := x.Response.(*PrepOsVersionResponse_Failure); ok { + return x.Failure + } + } + return nil +} + +type isPrepOsVersionResponse_Response interface { + isPrepOsVersionResponse_Response() +} + +type PrepOsVersionResponse_Success struct { + Success *PrepOsVersionSuccessResponse `protobuf:"bytes,1,opt,name=success,proto3,oneof"` +} + +type PrepOsVersionResponse_Failure struct { + Failure *PrepOsVersionFailureResponse `protobuf:"bytes,2,opt,name=failure,proto3,oneof"` +} + +func (*PrepOsVersionResponse_Success) isPrepOsVersionResponse_Response() {} + +func (*PrepOsVersionResponse_Failure) isPrepOsVersionResponse_Response() {} + +type PrepOsVersionSuccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + JsonVersMap map[string]string `protobuf:"bytes,1,rep,name=json_vers_map,json=jsonVersMap,proto3" json:"json_vers_map,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Contains the JSON strings for the requested fields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepOsVersionSuccessResponse) Reset() { + *x = PrepOsVersionSuccessResponse{} + mi := &file_bmiprepagent_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepOsVersionSuccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepOsVersionSuccessResponse) ProtoMessage() {} + +func (x *PrepOsVersionSuccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrepOsVersionSuccessResponse.ProtoReflect.Descriptor instead. +func (*PrepOsVersionSuccessResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{37} +} + +func (x *PrepOsVersionSuccessResponse) GetJsonVersMap() map[string]string { + if x != nil { + return x.JsonVersMap + } + return nil +} + +type PrepOsVersionFailureResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorDetails string `protobuf:"bytes,1,opt,name=error_details,json=errorDetails,proto3" json:"error_details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepOsVersionFailureResponse) Reset() { + *x = PrepOsVersionFailureResponse{} + mi := &file_bmiprepagent_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepOsVersionFailureResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepOsVersionFailureResponse) ProtoMessage() {} + +func (x *PrepOsVersionFailureResponse) ProtoReflect() protoreflect.Message { + mi := &file_bmiprepagent_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrepOsVersionFailureResponse.ProtoReflect.Descriptor instead. +func (*PrepOsVersionFailureResponse) Descriptor() ([]byte, []int) { + return file_bmiprepagent_proto_rawDescGZIP(), []int{38} +} + +func (x *PrepOsVersionFailureResponse) GetErrorDetails() string { + if x != nil { + return x.ErrorDetails + } + return "" +} + +var File_bmiprepagent_proto protoreflect.FileDescriptor + +const file_bmiprepagent_proto_rawDesc = "" + + "\n" + + "\x12bmiprepagent.proto\x12\fbmiprepagent\"\xf8\x01\n" + + "\x11ExtendedErrorInfo\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\x05R\terrorCode\x12\x1f\n" + + "\vescalate_to\x18\x02 \x01(\tR\n" + + "escalateTo\x12_\n" + + "\x10extended_details\x18\x03 \x03(\v24.bmiprepagent.ExtendedErrorInfo.ExtendedDetailsEntryR\x0fextendedDetails\x1aB\n" + + "\x14ExtendedDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\r\n" + + "\vPingRequest\"\x0e\n" + + "\fPingResponse\"J\n" + + "\x14StartUploadOsRequest\x12\x16\n" + + "\x06fileId\x18\x01 \x01(\tR\x06fileId\x12\x1a\n" + + "\bfileSize\x18\x02 \x01(\x04R\bfileSize\"\xb3\x01\n" + + "\x15StartUploadOsResponse\x12F\n" + + "\asuccess\x18\x01 \x01(\v2*.bmiprepagent.StartUploadOsSuccessResponseH\x00R\asuccess\x12F\n" + + "\afailure\x18\x02 \x01(\v2*.bmiprepagent.StartUploadOsFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"\x1e\n" + + "\x1cStartUploadOsSuccessResponse\"\xc1\x01\n" + + "\x1cStartUploadOsFailureResponse\x12`\n" + + "\ferrorDetails\x18\x01 \x03(\v2<.bmiprepagent.StartUploadOsFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"x\n" + + "\x14UploadOsChunkRequest\x12\x16\n" + + "\x06fileId\x18\x01 \x01(\tR\x06fileId\x12\x16\n" + + "\x06offset\x18\x02 \x01(\x04R\x06offset\x12\x16\n" + + "\x06length\x18\x03 \x01(\x04R\x06length\x12\x18\n" + + "\acontent\x18\x04 \x01(\fR\acontent\"\xb3\x01\n" + + "\x15UploadOsChunkResponse\x12F\n" + + "\asuccess\x18\x01 \x01(\v2*.bmiprepagent.UploadOsChunkSuccessResponseH\x00R\asuccess\x12F\n" + + "\afailure\x18\x02 \x01(\v2*.bmiprepagent.UploadOsChunkFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"\x1e\n" + + "\x1cUploadOsChunkSuccessResponse\"\xc1\x01\n" + + "\x1cUploadOsChunkFailureResponse\x12`\n" + + "\ferrorDetails\x18\x01 \x03(\v2<.bmiprepagent.UploadOsChunkFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"/\n" + + "\x15FinishUploadOsRequest\x12\x16\n" + + "\x06fileId\x18\x01 \x01(\tR\x06fileId\"\xb6\x01\n" + + "\x16FinishUploadOsResponse\x12G\n" + + "\asuccess\x18\x01 \x01(\v2+.bmiprepagent.FinishUploadOsSuccessResponseH\x00R\asuccess\x12G\n" + + "\afailure\x18\x02 \x01(\v2+.bmiprepagent.FinishUploadOsFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"\x85\x01\n" + + "\x1dFinishUploadOsSuccessResponse\x12$\n" + + "\rchecksumValue\x18\x01 \x01(\tR\rchecksumValue\x12>\n" + + "\fchecksumType\x18\x02 \x01(\x0e2\x1a.bmiprepagent.ChecksumTypeR\fchecksumType\"\xc3\x01\n" + + "\x1dFinishUploadOsFailureResponse\x12a\n" + + "\ferrorDetails\x18\x01 \x03(\v2=.bmiprepagent.FinishUploadOsFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"*\n" + + "\x10ConvertOsRequest\x12\x16\n" + + "\x06fileId\x18\x01 \x01(\tR\x06fileId\"\xa7\x01\n" + + "\x11ConvertOsResponse\x12B\n" + + "\asuccess\x18\x01 \x01(\v2&.bmiprepagent.ConvertOsSuccessResponseH\x00R\asuccess\x12B\n" + + "\afailure\x18\x02 \x01(\v2&.bmiprepagent.ConvertOsFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"\x80\x01\n" + + "\x18ConvertOsSuccessResponse\x12$\n" + + "\rchecksumValue\x18\x01 \x01(\tR\rchecksumValue\x12>\n" + + "\fchecksumType\x18\x02 \x01(\x0e2\x1a.bmiprepagent.ChecksumTypeR\fchecksumType\"\xb9\x01\n" + + "\x18ConvertOsFailureResponse\x12\\\n" + + "\ferrorDetails\x18\x01 \x03(\v28.bmiprepagent.ConvertOsFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"(\n" + + "\x0eFlashOsRequest\x12\x16\n" + + "\x06fileId\x18\x01 \x01(\tR\x06fileId\"\xa1\x01\n" + + "\x0fFlashOsResponse\x12@\n" + + "\asuccess\x18\x01 \x01(\v2$.bmiprepagent.FlashOsSuccessResponseH\x00R\asuccess\x12@\n" + + "\afailure\x18\x02 \x01(\v2$.bmiprepagent.FlashOsFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"~\n" + + "\x16FlashOsSuccessResponse\x12$\n" + + "\rchecksumValue\x18\x01 \x01(\tR\rchecksumValue\x12>\n" + + "\fchecksumType\x18\x02 \x01(\x0e2\x1a.bmiprepagent.ChecksumTypeR\fchecksumType\"\xb5\x01\n" + + "\x16FlashOsFailureResponse\x12Z\n" + + "\ferrorDetails\x18\x01 \x03(\v26.bmiprepagent.FlashOsFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"}\n" + + "\x13SanitizeHostRequest\x12!\n" + + "\ffull_command\x18\x01 \x01(\tR\vfullCommand\x12%\n" + + "\x0ecommand_string\x18\x02 \x01(\tR\rcommandString\x12\x1c\n" + + "\targuments\x18\x03 \x03(\tR\targuments\"\x9b\x01\n" + + "\x14SanitizeHostResponse\x12\x18\n" + + "\acommand\x18\x01 \x01(\tR\acommand\x12#\n" + + "\rresult_stdout\x18\x02 \x01(\tR\fresultStdout\x12'\n" + + "\x0fresult_stderror\x18\x03 \x01(\tR\x0eresultStderror\x12\x1b\n" + + "\texit_code\x18\x04 \x01(\tR\bexitCode\"\x12\n" + + "\x10FetchLogsRequest\"\xa7\x01\n" + + "\x11FetchLogsResponse\x12B\n" + + "\asuccess\x18\x01 \x01(\v2&.bmiprepagent.FetchLogsSuccessResponseH\x00R\asuccess\x12B\n" + + "\afailure\x18\x02 \x01(\v2&.bmiprepagent.FetchLogsFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\",\n" + + "\x18FetchLogsSuccessResponse\x12\x10\n" + + "\x03log\x18\x01 \x01(\tR\x03log\"\xb9\x01\n" + + "\x18FetchLogsFailureResponse\x12\\\n" + + "\ferrorDetails\x18\x01 \x03(\v28.bmiprepagent.FetchLogsFailureResponse.ErrorDetailsEntryR\ferrorDetails\x1a?\n" + + "\x11ErrorDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xa7\x01\n" + + "\x15FetchTelemetryRequest\x12E\n" + + "\x0edmesg_filt_cfg\x18\x01 \x01(\v2\x1f.bmiprepagent.DmesgFilterConfigR\fdmesgFiltCfg\x12G\n" + + "\x0ejourn_filt_cfg\x18\x02 \x01(\v2!.bmiprepagent.JournalFilterConfigR\fjournFiltCfg\"\xa7\x01\n" + + "\x13JournalFilterConfig\x12\x1d\n" + + "\n" + + "send_journ\x18\x01 \x01(\bR\tsendJourn\x12*\n" + + "\x11journ_flush_count\x18\x02 \x01(\rR\x0fjournFlushCount\x12E\n" + + "\rjourn_filters\x18\x03 \x03(\v2 .bmiprepagent.JournalFilterEntryR\fjournFilters\"]\n" + + "\x12JournalFilterEntry\x12\x1d\n" + + "\n" + + "filter_key\x18\x01 \x01(\tR\tfilterKey\x12(\n" + + "\x10filter_val_regex\x18\x02 \x01(\tR\x0efilterValRegex\"w\n" + + "\x11DmesgFilterConfig\x12\x1d\n" + + "\n" + + "send_dmesg\x18\x01 \x01(\bR\tsendDmesg\x12C\n" + + "\rdmesg_filters\x18\x02 \x03(\v2\x1e.bmiprepagent.DmesgFilterEntryR\fdmesgFilters\"<\n" + + "\x10DmesgFilterEntry\x12(\n" + + "\x10filter_val_regex\x18\x01 \x01(\tR\x0efilterValRegex\"l\n" + + "\x16FetchTelemetryResponse\x129\n" + + "\ttelemType\x18\x01 \x01(\x0e2\x1b.bmiprepagent.TelemetryTypeR\ttelemType\x12\x17\n" + + "\alog_msg\x18\x02 \x01(\tR\x06logMsg\"\x8b\x01\n" + + "\x14PrepOsVersionRequest\x12I\n" + + "\frequest_type\x18\x01 \x01(\x0e2&.bmiprepagent.PrepOsVersionRequestTypeR\vrequestType\x12(\n" + + "\x10json_vers_fields\x18\x02 \x03(\tR\x0ejsonVersFields\"\xb3\x01\n" + + "\x15PrepOsVersionResponse\x12F\n" + + "\asuccess\x18\x01 \x01(\v2*.bmiprepagent.PrepOsVersionSuccessResponseH\x00R\asuccess\x12F\n" + + "\afailure\x18\x02 \x01(\v2*.bmiprepagent.PrepOsVersionFailureResponseH\x00R\afailureB\n" + + "\n" + + "\bresponse\"\xbf\x01\n" + + "\x1cPrepOsVersionSuccessResponse\x12_\n" + + "\rjson_vers_map\x18\x01 \x03(\v2;.bmiprepagent.PrepOsVersionSuccessResponse.JsonVersMapEntryR\vjsonVersMap\x1a>\n" + + "\x10JsonVersMapEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"C\n" + + "\x1cPrepOsVersionFailureResponse\x12#\n" + + "\rerror_details\x18\x01 \x01(\tR\ferrorDetails*\xef\x01\n" + + "\tErrorCode\x12\x14\n" + + "\x10SERVICE_NOT_IDLE\x10\x00\x12\x1b\n" + + "\x17SERVICE_INCORRECT_STATE\x10\x01\x12\x11\n" + + "\rSERVICE_ERROR\x10\x02\x12\x14\n" + + "\x10SERVICE_IO_ERROR\x10\x03\x12\x17\n" + + "\x13SERVICE_NO_RESPONSE\x10\x04\x12\x1a\n" + + "\x16BLOCK_DEVICE_NOT_FOUND\x10e\x12\x16\n" + + "\x12NOT_A_BLOCK_DEVICE\x10f\x12\x0f\n" + + "\n" + + "FILE_ERROR\x10\xc8\x01\x12\x15\n" + + "\x10CONVERT_OS_ERROR\x10\xac\x02\x12\x11\n" + + "\fFLASH_FAILED\x10\x90\x03*6\n" + + "\rTelemetryType\x12\r\n" + + "\tHEARTBEAT\x10\x00\x12\t\n" + + "\x05DMESG\x10\x01\x12\v\n" + + "\aJOURNAL\x10\x02*C\n" + + "\x18PrepOsVersionRequestType\x12\x10\n" + + "\fALL_VERSIONS\x10\x00\x12\x15\n" + + "\x11SPECIFIC_VERSIONS\x10\x01*2\n" + + "\fChecksumType\x12\v\n" + + "\aDEFAULT\x10\x00\x12\t\n" + + "\x05CRC32\x10\x01\x12\n" + + "\n" + + "\x06SHA256\x10\x022\xd9\x06\n" + + "\fBmiPrepAgent\x12=\n" + + "\x04Ping\x12\x19.bmiprepagent.PingRequest\x1a\x1a.bmiprepagent.PingResponse\x12X\n" + + "\rStartUploadOs\x12\".bmiprepagent.StartUploadOsRequest\x1a#.bmiprepagent.StartUploadOsResponse\x12X\n" + + "\rUploadOsChunk\x12\".bmiprepagent.UploadOsChunkRequest\x1a#.bmiprepagent.UploadOsChunkResponse\x12[\n" + + "\x0eFinishUploadOs\x12#.bmiprepagent.FinishUploadOsRequest\x1a$.bmiprepagent.FinishUploadOsResponse\x12L\n" + + "\tConvertOs\x12\x1e.bmiprepagent.ConvertOsRequest\x1a\x1f.bmiprepagent.ConvertOsResponse\x12F\n" + + "\aFlashOs\x12\x1c.bmiprepagent.FlashOsRequest\x1a\x1d.bmiprepagent.FlashOsResponse\x12U\n" + + "\fSanitizeHost\x12!.bmiprepagent.SanitizeHostRequest\x1a\".bmiprepagent.SanitizeHostResponse\x12N\n" + + "\tFetchLogs\x12\x1e.bmiprepagent.FetchLogsRequest\x1a\x1f.bmiprepagent.FetchLogsResponse0\x01\x12]\n" + + "\x0eFetchTelemetry\x12#.bmiprepagent.FetchTelemetryRequest\x1a$.bmiprepagent.FetchTelemetryResponse0\x01\x12]\n" + + "\x12FetchPrepOsVersion\x12\".bmiprepagent.PrepOsVersionRequest\x1a#.bmiprepagent.PrepOsVersionResponseb\x06proto3" + +var ( + file_bmiprepagent_proto_rawDescOnce sync.Once + file_bmiprepagent_proto_rawDescData []byte +) + +func file_bmiprepagent_proto_rawDescGZIP() []byte { + file_bmiprepagent_proto_rawDescOnce.Do(func() { + file_bmiprepagent_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_bmiprepagent_proto_rawDesc), len(file_bmiprepagent_proto_rawDesc))) + }) + return file_bmiprepagent_proto_rawDescData +} + +var file_bmiprepagent_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_bmiprepagent_proto_msgTypes = make([]protoimpl.MessageInfo, 47) +var file_bmiprepagent_proto_goTypes = []any{ + (ErrorCode)(0), // 0: bmiprepagent.ErrorCode + (TelemetryType)(0), // 1: bmiprepagent.TelemetryType + (PrepOsVersionRequestType)(0), // 2: bmiprepagent.PrepOsVersionRequestType + (ChecksumType)(0), // 3: bmiprepagent.ChecksumType + (*ExtendedErrorInfo)(nil), // 4: bmiprepagent.ExtendedErrorInfo + (*PingRequest)(nil), // 5: bmiprepagent.PingRequest + (*PingResponse)(nil), // 6: bmiprepagent.PingResponse + (*StartUploadOsRequest)(nil), // 7: bmiprepagent.StartUploadOsRequest + (*StartUploadOsResponse)(nil), // 8: bmiprepagent.StartUploadOsResponse + (*StartUploadOsSuccessResponse)(nil), // 9: bmiprepagent.StartUploadOsSuccessResponse + (*StartUploadOsFailureResponse)(nil), // 10: bmiprepagent.StartUploadOsFailureResponse + (*UploadOsChunkRequest)(nil), // 11: bmiprepagent.UploadOsChunkRequest + (*UploadOsChunkResponse)(nil), // 12: bmiprepagent.UploadOsChunkResponse + (*UploadOsChunkSuccessResponse)(nil), // 13: bmiprepagent.UploadOsChunkSuccessResponse + (*UploadOsChunkFailureResponse)(nil), // 14: bmiprepagent.UploadOsChunkFailureResponse + (*FinishUploadOsRequest)(nil), // 15: bmiprepagent.FinishUploadOsRequest + (*FinishUploadOsResponse)(nil), // 16: bmiprepagent.FinishUploadOsResponse + (*FinishUploadOsSuccessResponse)(nil), // 17: bmiprepagent.FinishUploadOsSuccessResponse + (*FinishUploadOsFailureResponse)(nil), // 18: bmiprepagent.FinishUploadOsFailureResponse + (*ConvertOsRequest)(nil), // 19: bmiprepagent.ConvertOsRequest + (*ConvertOsResponse)(nil), // 20: bmiprepagent.ConvertOsResponse + (*ConvertOsSuccessResponse)(nil), // 21: bmiprepagent.ConvertOsSuccessResponse + (*ConvertOsFailureResponse)(nil), // 22: bmiprepagent.ConvertOsFailureResponse + (*FlashOsRequest)(nil), // 23: bmiprepagent.FlashOsRequest + (*FlashOsResponse)(nil), // 24: bmiprepagent.FlashOsResponse + (*FlashOsSuccessResponse)(nil), // 25: bmiprepagent.FlashOsSuccessResponse + (*FlashOsFailureResponse)(nil), // 26: bmiprepagent.FlashOsFailureResponse + (*SanitizeHostRequest)(nil), // 27: bmiprepagent.SanitizeHostRequest + (*SanitizeHostResponse)(nil), // 28: bmiprepagent.SanitizeHostResponse + (*FetchLogsRequest)(nil), // 29: bmiprepagent.FetchLogsRequest + (*FetchLogsResponse)(nil), // 30: bmiprepagent.FetchLogsResponse + (*FetchLogsSuccessResponse)(nil), // 31: bmiprepagent.FetchLogsSuccessResponse + (*FetchLogsFailureResponse)(nil), // 32: bmiprepagent.FetchLogsFailureResponse + (*FetchTelemetryRequest)(nil), // 33: bmiprepagent.FetchTelemetryRequest + (*JournalFilterConfig)(nil), // 34: bmiprepagent.JournalFilterConfig + (*JournalFilterEntry)(nil), // 35: bmiprepagent.JournalFilterEntry + (*DmesgFilterConfig)(nil), // 36: bmiprepagent.DmesgFilterConfig + (*DmesgFilterEntry)(nil), // 37: bmiprepagent.DmesgFilterEntry + (*FetchTelemetryResponse)(nil), // 38: bmiprepagent.FetchTelemetryResponse + (*PrepOsVersionRequest)(nil), // 39: bmiprepagent.PrepOsVersionRequest + (*PrepOsVersionResponse)(nil), // 40: bmiprepagent.PrepOsVersionResponse + (*PrepOsVersionSuccessResponse)(nil), // 41: bmiprepagent.PrepOsVersionSuccessResponse + (*PrepOsVersionFailureResponse)(nil), // 42: bmiprepagent.PrepOsVersionFailureResponse + nil, // 43: bmiprepagent.ExtendedErrorInfo.ExtendedDetailsEntry + nil, // 44: bmiprepagent.StartUploadOsFailureResponse.ErrorDetailsEntry + nil, // 45: bmiprepagent.UploadOsChunkFailureResponse.ErrorDetailsEntry + nil, // 46: bmiprepagent.FinishUploadOsFailureResponse.ErrorDetailsEntry + nil, // 47: bmiprepagent.ConvertOsFailureResponse.ErrorDetailsEntry + nil, // 48: bmiprepagent.FlashOsFailureResponse.ErrorDetailsEntry + nil, // 49: bmiprepagent.FetchLogsFailureResponse.ErrorDetailsEntry + nil, // 50: bmiprepagent.PrepOsVersionSuccessResponse.JsonVersMapEntry +} +var file_bmiprepagent_proto_depIdxs = []int32{ + 43, // 0: bmiprepagent.ExtendedErrorInfo.extended_details:type_name -> bmiprepagent.ExtendedErrorInfo.ExtendedDetailsEntry + 9, // 1: bmiprepagent.StartUploadOsResponse.success:type_name -> bmiprepagent.StartUploadOsSuccessResponse + 10, // 2: bmiprepagent.StartUploadOsResponse.failure:type_name -> bmiprepagent.StartUploadOsFailureResponse + 44, // 3: bmiprepagent.StartUploadOsFailureResponse.errorDetails:type_name -> bmiprepagent.StartUploadOsFailureResponse.ErrorDetailsEntry + 13, // 4: bmiprepagent.UploadOsChunkResponse.success:type_name -> bmiprepagent.UploadOsChunkSuccessResponse + 14, // 5: bmiprepagent.UploadOsChunkResponse.failure:type_name -> bmiprepagent.UploadOsChunkFailureResponse + 45, // 6: bmiprepagent.UploadOsChunkFailureResponse.errorDetails:type_name -> bmiprepagent.UploadOsChunkFailureResponse.ErrorDetailsEntry + 17, // 7: bmiprepagent.FinishUploadOsResponse.success:type_name -> bmiprepagent.FinishUploadOsSuccessResponse + 18, // 8: bmiprepagent.FinishUploadOsResponse.failure:type_name -> bmiprepagent.FinishUploadOsFailureResponse + 3, // 9: bmiprepagent.FinishUploadOsSuccessResponse.checksumType:type_name -> bmiprepagent.ChecksumType + 46, // 10: bmiprepagent.FinishUploadOsFailureResponse.errorDetails:type_name -> bmiprepagent.FinishUploadOsFailureResponse.ErrorDetailsEntry + 21, // 11: bmiprepagent.ConvertOsResponse.success:type_name -> bmiprepagent.ConvertOsSuccessResponse + 22, // 12: bmiprepagent.ConvertOsResponse.failure:type_name -> bmiprepagent.ConvertOsFailureResponse + 3, // 13: bmiprepagent.ConvertOsSuccessResponse.checksumType:type_name -> bmiprepagent.ChecksumType + 47, // 14: bmiprepagent.ConvertOsFailureResponse.errorDetails:type_name -> bmiprepagent.ConvertOsFailureResponse.ErrorDetailsEntry + 25, // 15: bmiprepagent.FlashOsResponse.success:type_name -> bmiprepagent.FlashOsSuccessResponse + 26, // 16: bmiprepagent.FlashOsResponse.failure:type_name -> bmiprepagent.FlashOsFailureResponse + 3, // 17: bmiprepagent.FlashOsSuccessResponse.checksumType:type_name -> bmiprepagent.ChecksumType + 48, // 18: bmiprepagent.FlashOsFailureResponse.errorDetails:type_name -> bmiprepagent.FlashOsFailureResponse.ErrorDetailsEntry + 31, // 19: bmiprepagent.FetchLogsResponse.success:type_name -> bmiprepagent.FetchLogsSuccessResponse + 32, // 20: bmiprepagent.FetchLogsResponse.failure:type_name -> bmiprepagent.FetchLogsFailureResponse + 49, // 21: bmiprepagent.FetchLogsFailureResponse.errorDetails:type_name -> bmiprepagent.FetchLogsFailureResponse.ErrorDetailsEntry + 36, // 22: bmiprepagent.FetchTelemetryRequest.dmesg_filt_cfg:type_name -> bmiprepagent.DmesgFilterConfig + 34, // 23: bmiprepagent.FetchTelemetryRequest.journ_filt_cfg:type_name -> bmiprepagent.JournalFilterConfig + 35, // 24: bmiprepagent.JournalFilterConfig.journ_filters:type_name -> bmiprepagent.JournalFilterEntry + 37, // 25: bmiprepagent.DmesgFilterConfig.dmesg_filters:type_name -> bmiprepagent.DmesgFilterEntry + 1, // 26: bmiprepagent.FetchTelemetryResponse.telemType:type_name -> bmiprepagent.TelemetryType + 2, // 27: bmiprepagent.PrepOsVersionRequest.request_type:type_name -> bmiprepagent.PrepOsVersionRequestType + 41, // 28: bmiprepagent.PrepOsVersionResponse.success:type_name -> bmiprepagent.PrepOsVersionSuccessResponse + 42, // 29: bmiprepagent.PrepOsVersionResponse.failure:type_name -> bmiprepagent.PrepOsVersionFailureResponse + 50, // 30: bmiprepagent.PrepOsVersionSuccessResponse.json_vers_map:type_name -> bmiprepagent.PrepOsVersionSuccessResponse.JsonVersMapEntry + 5, // 31: bmiprepagent.BmiPrepAgent.Ping:input_type -> bmiprepagent.PingRequest + 7, // 32: bmiprepagent.BmiPrepAgent.StartUploadOs:input_type -> bmiprepagent.StartUploadOsRequest + 11, // 33: bmiprepagent.BmiPrepAgent.UploadOsChunk:input_type -> bmiprepagent.UploadOsChunkRequest + 15, // 34: bmiprepagent.BmiPrepAgent.FinishUploadOs:input_type -> bmiprepagent.FinishUploadOsRequest + 19, // 35: bmiprepagent.BmiPrepAgent.ConvertOs:input_type -> bmiprepagent.ConvertOsRequest + 23, // 36: bmiprepagent.BmiPrepAgent.FlashOs:input_type -> bmiprepagent.FlashOsRequest + 27, // 37: bmiprepagent.BmiPrepAgent.SanitizeHost:input_type -> bmiprepagent.SanitizeHostRequest + 29, // 38: bmiprepagent.BmiPrepAgent.FetchLogs:input_type -> bmiprepagent.FetchLogsRequest + 33, // 39: bmiprepagent.BmiPrepAgent.FetchTelemetry:input_type -> bmiprepagent.FetchTelemetryRequest + 39, // 40: bmiprepagent.BmiPrepAgent.FetchPrepOsVersion:input_type -> bmiprepagent.PrepOsVersionRequest + 6, // 41: bmiprepagent.BmiPrepAgent.Ping:output_type -> bmiprepagent.PingResponse + 8, // 42: bmiprepagent.BmiPrepAgent.StartUploadOs:output_type -> bmiprepagent.StartUploadOsResponse + 12, // 43: bmiprepagent.BmiPrepAgent.UploadOsChunk:output_type -> bmiprepagent.UploadOsChunkResponse + 16, // 44: bmiprepagent.BmiPrepAgent.FinishUploadOs:output_type -> bmiprepagent.FinishUploadOsResponse + 20, // 45: bmiprepagent.BmiPrepAgent.ConvertOs:output_type -> bmiprepagent.ConvertOsResponse + 24, // 46: bmiprepagent.BmiPrepAgent.FlashOs:output_type -> bmiprepagent.FlashOsResponse + 28, // 47: bmiprepagent.BmiPrepAgent.SanitizeHost:output_type -> bmiprepagent.SanitizeHostResponse + 30, // 48: bmiprepagent.BmiPrepAgent.FetchLogs:output_type -> bmiprepagent.FetchLogsResponse + 38, // 49: bmiprepagent.BmiPrepAgent.FetchTelemetry:output_type -> bmiprepagent.FetchTelemetryResponse + 40, // 50: bmiprepagent.BmiPrepAgent.FetchPrepOsVersion:output_type -> bmiprepagent.PrepOsVersionResponse + 41, // [41:51] is the sub-list for method output_type + 31, // [31:41] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name +} + +func init() { file_bmiprepagent_proto_init() } +func file_bmiprepagent_proto_init() { + if File_bmiprepagent_proto != nil { + return + } + file_bmiprepagent_proto_msgTypes[4].OneofWrappers = []any{ + (*StartUploadOsResponse_Success)(nil), + (*StartUploadOsResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[8].OneofWrappers = []any{ + (*UploadOsChunkResponse_Success)(nil), + (*UploadOsChunkResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[12].OneofWrappers = []any{ + (*FinishUploadOsResponse_Success)(nil), + (*FinishUploadOsResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[16].OneofWrappers = []any{ + (*ConvertOsResponse_Success)(nil), + (*ConvertOsResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[20].OneofWrappers = []any{ + (*FlashOsResponse_Success)(nil), + (*FlashOsResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[26].OneofWrappers = []any{ + (*FetchLogsResponse_Success)(nil), + (*FetchLogsResponse_Failure)(nil), + } + file_bmiprepagent_proto_msgTypes[36].OneofWrappers = []any{ + (*PrepOsVersionResponse_Success)(nil), + (*PrepOsVersionResponse_Failure)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_bmiprepagent_proto_rawDesc), len(file_bmiprepagent_proto_rawDesc)), + NumEnums: 4, + NumMessages: 47, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_bmiprepagent_proto_goTypes, + DependencyIndexes: file_bmiprepagent_proto_depIdxs, + EnumInfos: file_bmiprepagent_proto_enumTypes, + MessageInfos: file_bmiprepagent_proto_msgTypes, + }.Build() + File_bmiprepagent_proto = out.File + file_bmiprepagent_proto_goTypes = nil + file_bmiprepagent_proto_depIdxs = nil +} diff --git a/tools/cmd/bpatest/bpapb/gen/bmiprepagent_grpc.pb.go b/tools/cmd/bpatest/bpapb/gen/bmiprepagent_grpc.pb.go new file mode 100644 index 000000000..0e85293a7 --- /dev/null +++ b/tools/cmd/bpatest/bpapb/gen/bmiprepagent_grpc.pb.go @@ -0,0 +1,496 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.0 +// - protoc v6.33.4 +// source: bmiprepagent.proto + +package bpapb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + BmiPrepAgent_Ping_FullMethodName = "/bmiprepagent.BmiPrepAgent/Ping" + BmiPrepAgent_StartUploadOs_FullMethodName = "/bmiprepagent.BmiPrepAgent/StartUploadOs" + BmiPrepAgent_UploadOsChunk_FullMethodName = "/bmiprepagent.BmiPrepAgent/UploadOsChunk" + BmiPrepAgent_FinishUploadOs_FullMethodName = "/bmiprepagent.BmiPrepAgent/FinishUploadOs" + BmiPrepAgent_ConvertOs_FullMethodName = "/bmiprepagent.BmiPrepAgent/ConvertOs" + BmiPrepAgent_FlashOs_FullMethodName = "/bmiprepagent.BmiPrepAgent/FlashOs" + BmiPrepAgent_SanitizeHost_FullMethodName = "/bmiprepagent.BmiPrepAgent/SanitizeHost" + BmiPrepAgent_FetchLogs_FullMethodName = "/bmiprepagent.BmiPrepAgent/FetchLogs" + BmiPrepAgent_FetchTelemetry_FullMethodName = "/bmiprepagent.BmiPrepAgent/FetchTelemetry" + BmiPrepAgent_FetchPrepOsVersion_FullMethodName = "/bmiprepagent.BmiPrepAgent/FetchPrepOsVersion" +) + +// BmiPrepAgentClient is the client API for BmiPrepAgent service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BmiPrepAgentClient interface { + // check the availability of BMIPrepAgent + Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) + // Start the customer OS upload in chunks + StartUploadOs(ctx context.Context, in *StartUploadOsRequest, opts ...grpc.CallOption) (*StartUploadOsResponse, error) + // Upload the customer OS in chunks + UploadOsChunk(ctx context.Context, in *UploadOsChunkRequest, opts ...grpc.CallOption) (*UploadOsChunkResponse, error) + // Finish the upload of the customer OS in chunks + FinishUploadOs(ctx context.Context, in *FinishUploadOsRequest, opts ...grpc.CallOption) (*FinishUploadOsResponse, error) + // Convert the customer OS from VHD/VHDX to RAW + ConvertOs(ctx context.Context, in *ConvertOsRequest, opts ...grpc.CallOption) (*ConvertOsResponse, error) + // UploadOS has to be Succesful then FlashOS will be called from SoC + // This will flash to the disk. Disk is obtained by /sys/block and picks + // the device with enough capacity on it. + // Returns if Flash was succesful + FlashOs(ctx context.Context, in *FlashOsRequest, opts ...grpc.CallOption) (*FlashOsResponse, error) + // Api used by the bmi-helper to sanitize, it will clean up all the disk, gpu's, and flash the firmware to a good state + SanitizeHost(ctx context.Context, in *SanitizeHostRequest, opts ...grpc.CallOption) (*SanitizeHostResponse, error) + // Returns a stream from /tmp/bmiprepagent.logs + FetchLogs(ctx context.Context, in *FetchLogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FetchLogsResponse], error) + // Returns a stream of telemetry log messages + FetchTelemetry(ctx context.Context, in *FetchTelemetryRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FetchTelemetryResponse], error) + // Returns PrepOS Versioning try log messages + FetchPrepOsVersion(ctx context.Context, in *PrepOsVersionRequest, opts ...grpc.CallOption) (*PrepOsVersionResponse, error) +} + +type bmiPrepAgentClient struct { + cc grpc.ClientConnInterface +} + +func NewBmiPrepAgentClient(cc grpc.ClientConnInterface) BmiPrepAgentClient { + return &bmiPrepAgentClient{cc} +} + +func (c *bmiPrepAgentClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PingResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_Ping_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) StartUploadOs(ctx context.Context, in *StartUploadOsRequest, opts ...grpc.CallOption) (*StartUploadOsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(StartUploadOsResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_StartUploadOs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) UploadOsChunk(ctx context.Context, in *UploadOsChunkRequest, opts ...grpc.CallOption) (*UploadOsChunkResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UploadOsChunkResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_UploadOsChunk_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) FinishUploadOs(ctx context.Context, in *FinishUploadOsRequest, opts ...grpc.CallOption) (*FinishUploadOsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(FinishUploadOsResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_FinishUploadOs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) ConvertOs(ctx context.Context, in *ConvertOsRequest, opts ...grpc.CallOption) (*ConvertOsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ConvertOsResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_ConvertOs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) FlashOs(ctx context.Context, in *FlashOsRequest, opts ...grpc.CallOption) (*FlashOsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(FlashOsResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_FlashOs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) SanitizeHost(ctx context.Context, in *SanitizeHostRequest, opts ...grpc.CallOption) (*SanitizeHostResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SanitizeHostResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_SanitizeHost_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bmiPrepAgentClient) FetchLogs(ctx context.Context, in *FetchLogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FetchLogsResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &BmiPrepAgent_ServiceDesc.Streams[0], BmiPrepAgent_FetchLogs_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[FetchLogsRequest, FetchLogsResponse]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BmiPrepAgent_FetchLogsClient = grpc.ServerStreamingClient[FetchLogsResponse] + +func (c *bmiPrepAgentClient) FetchTelemetry(ctx context.Context, in *FetchTelemetryRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FetchTelemetryResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &BmiPrepAgent_ServiceDesc.Streams[1], BmiPrepAgent_FetchTelemetry_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[FetchTelemetryRequest, FetchTelemetryResponse]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BmiPrepAgent_FetchTelemetryClient = grpc.ServerStreamingClient[FetchTelemetryResponse] + +func (c *bmiPrepAgentClient) FetchPrepOsVersion(ctx context.Context, in *PrepOsVersionRequest, opts ...grpc.CallOption) (*PrepOsVersionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PrepOsVersionResponse) + err := c.cc.Invoke(ctx, BmiPrepAgent_FetchPrepOsVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BmiPrepAgentServer is the server API for BmiPrepAgent service. +// All implementations must embed UnimplementedBmiPrepAgentServer +// for forward compatibility. +type BmiPrepAgentServer interface { + // check the availability of BMIPrepAgent + Ping(context.Context, *PingRequest) (*PingResponse, error) + // Start the customer OS upload in chunks + StartUploadOs(context.Context, *StartUploadOsRequest) (*StartUploadOsResponse, error) + // Upload the customer OS in chunks + UploadOsChunk(context.Context, *UploadOsChunkRequest) (*UploadOsChunkResponse, error) + // Finish the upload of the customer OS in chunks + FinishUploadOs(context.Context, *FinishUploadOsRequest) (*FinishUploadOsResponse, error) + // Convert the customer OS from VHD/VHDX to RAW + ConvertOs(context.Context, *ConvertOsRequest) (*ConvertOsResponse, error) + // UploadOS has to be Succesful then FlashOS will be called from SoC + // This will flash to the disk. Disk is obtained by /sys/block and picks + // the device with enough capacity on it. + // Returns if Flash was succesful + FlashOs(context.Context, *FlashOsRequest) (*FlashOsResponse, error) + // Api used by the bmi-helper to sanitize, it will clean up all the disk, gpu's, and flash the firmware to a good state + SanitizeHost(context.Context, *SanitizeHostRequest) (*SanitizeHostResponse, error) + // Returns a stream from /tmp/bmiprepagent.logs + FetchLogs(*FetchLogsRequest, grpc.ServerStreamingServer[FetchLogsResponse]) error + // Returns a stream of telemetry log messages + FetchTelemetry(*FetchTelemetryRequest, grpc.ServerStreamingServer[FetchTelemetryResponse]) error + // Returns PrepOS Versioning try log messages + FetchPrepOsVersion(context.Context, *PrepOsVersionRequest) (*PrepOsVersionResponse, error) + mustEmbedUnimplementedBmiPrepAgentServer() +} + +// UnimplementedBmiPrepAgentServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBmiPrepAgentServer struct{} + +func (UnimplementedBmiPrepAgentServer) Ping(context.Context, *PingRequest) (*PingResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Ping not implemented") +} +func (UnimplementedBmiPrepAgentServer) StartUploadOs(context.Context, *StartUploadOsRequest) (*StartUploadOsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method StartUploadOs not implemented") +} +func (UnimplementedBmiPrepAgentServer) UploadOsChunk(context.Context, *UploadOsChunkRequest) (*UploadOsChunkResponse, error) { + return nil, status.Error(codes.Unimplemented, "method UploadOsChunk not implemented") +} +func (UnimplementedBmiPrepAgentServer) FinishUploadOs(context.Context, *FinishUploadOsRequest) (*FinishUploadOsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method FinishUploadOs not implemented") +} +func (UnimplementedBmiPrepAgentServer) ConvertOs(context.Context, *ConvertOsRequest) (*ConvertOsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ConvertOs not implemented") +} +func (UnimplementedBmiPrepAgentServer) FlashOs(context.Context, *FlashOsRequest) (*FlashOsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method FlashOs not implemented") +} +func (UnimplementedBmiPrepAgentServer) SanitizeHost(context.Context, *SanitizeHostRequest) (*SanitizeHostResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SanitizeHost not implemented") +} +func (UnimplementedBmiPrepAgentServer) FetchLogs(*FetchLogsRequest, grpc.ServerStreamingServer[FetchLogsResponse]) error { + return status.Error(codes.Unimplemented, "method FetchLogs not implemented") +} +func (UnimplementedBmiPrepAgentServer) FetchTelemetry(*FetchTelemetryRequest, grpc.ServerStreamingServer[FetchTelemetryResponse]) error { + return status.Error(codes.Unimplemented, "method FetchTelemetry not implemented") +} +func (UnimplementedBmiPrepAgentServer) FetchPrepOsVersion(context.Context, *PrepOsVersionRequest) (*PrepOsVersionResponse, error) { + return nil, status.Error(codes.Unimplemented, "method FetchPrepOsVersion not implemented") +} +func (UnimplementedBmiPrepAgentServer) mustEmbedUnimplementedBmiPrepAgentServer() {} +func (UnimplementedBmiPrepAgentServer) testEmbeddedByValue() {} + +// UnsafeBmiPrepAgentServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BmiPrepAgentServer will +// result in compilation errors. +type UnsafeBmiPrepAgentServer interface { + mustEmbedUnimplementedBmiPrepAgentServer() +} + +func RegisterBmiPrepAgentServer(s grpc.ServiceRegistrar, srv BmiPrepAgentServer) { + // If the following call panics, it indicates UnimplementedBmiPrepAgentServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&BmiPrepAgent_ServiceDesc, srv) +} + +func _BmiPrepAgent_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).Ping(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_Ping_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).Ping(ctx, req.(*PingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_StartUploadOs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartUploadOsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).StartUploadOs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_StartUploadOs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).StartUploadOs(ctx, req.(*StartUploadOsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_UploadOsChunk_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UploadOsChunkRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).UploadOsChunk(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_UploadOsChunk_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).UploadOsChunk(ctx, req.(*UploadOsChunkRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_FinishUploadOs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FinishUploadOsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).FinishUploadOs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_FinishUploadOs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).FinishUploadOs(ctx, req.(*FinishUploadOsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_ConvertOs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConvertOsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).ConvertOs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_ConvertOs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).ConvertOs(ctx, req.(*ConvertOsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_FlashOs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FlashOsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).FlashOs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_FlashOs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).FlashOs(ctx, req.(*FlashOsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_SanitizeHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SanitizeHostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).SanitizeHost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_SanitizeHost_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).SanitizeHost(ctx, req.(*SanitizeHostRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BmiPrepAgent_FetchLogs_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(FetchLogsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(BmiPrepAgentServer).FetchLogs(m, &grpc.GenericServerStream[FetchLogsRequest, FetchLogsResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BmiPrepAgent_FetchLogsServer = grpc.ServerStreamingServer[FetchLogsResponse] + +func _BmiPrepAgent_FetchTelemetry_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(FetchTelemetryRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(BmiPrepAgentServer).FetchTelemetry(m, &grpc.GenericServerStream[FetchTelemetryRequest, FetchTelemetryResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BmiPrepAgent_FetchTelemetryServer = grpc.ServerStreamingServer[FetchTelemetryResponse] + +func _BmiPrepAgent_FetchPrepOsVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PrepOsVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BmiPrepAgentServer).FetchPrepOsVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BmiPrepAgent_FetchPrepOsVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BmiPrepAgentServer).FetchPrepOsVersion(ctx, req.(*PrepOsVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// BmiPrepAgent_ServiceDesc is the grpc.ServiceDesc for BmiPrepAgent service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BmiPrepAgent_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "bmiprepagent.BmiPrepAgent", + HandlerType: (*BmiPrepAgentServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Ping", + Handler: _BmiPrepAgent_Ping_Handler, + }, + { + MethodName: "StartUploadOs", + Handler: _BmiPrepAgent_StartUploadOs_Handler, + }, + { + MethodName: "UploadOsChunk", + Handler: _BmiPrepAgent_UploadOsChunk_Handler, + }, + { + MethodName: "FinishUploadOs", + Handler: _BmiPrepAgent_FinishUploadOs_Handler, + }, + { + MethodName: "ConvertOs", + Handler: _BmiPrepAgent_ConvertOs_Handler, + }, + { + MethodName: "FlashOs", + Handler: _BmiPrepAgent_FlashOs_Handler, + }, + { + MethodName: "SanitizeHost", + Handler: _BmiPrepAgent_SanitizeHost_Handler, + }, + { + MethodName: "FetchPrepOsVersion", + Handler: _BmiPrepAgent_FetchPrepOsVersion_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "FetchLogs", + Handler: _BmiPrepAgent_FetchLogs_Handler, + ServerStreams: true, + }, + { + StreamName: "FetchTelemetry", + Handler: _BmiPrepAgent_FetchTelemetry_Handler, + ServerStreams: true, + }, + }, + Metadata: "bmiprepagent.proto", +} diff --git a/tools/cmd/netlaunch/main.go b/tools/cmd/netlaunch/main.go index 0e9dd3b0d..4b9ff2b86 100644 --- a/tools/cmd/netlaunch/main.go +++ b/tools/cmd/netlaunch/main.go @@ -36,11 +36,14 @@ var ( tridentBinaryPath string osmodifierBinaryPath string streamImage bool + localProxyPath string ) const ( - rcpModeLegacy = "cli" - rcpModeGrpc = "grpc" + rcpModeLegacy = "cli" + rcpModeGrpcLocalProxy = "grpc-local-proxy" + rcpModeGrpcInstall = "grpc-install" + rcpModeGrpcStream = "grpc-stream" ) var backgroundLogstreamFull string @@ -74,8 +77,8 @@ var rootCmd = &cobra.Command{ if rcpMode != "" { log.Infof("Using RCP mode: %s", rcpMode) - if rcpMode != rcpModeGrpc && rcpMode != rcpModeLegacy { - log.Fatalf("Invalid RCP mode, must be: %s or %s, got: %s", rcpModeLegacy, rcpModeGrpc, rcpMode) + if rcpMode != rcpModeGrpcLocalProxy && rcpMode != rcpModeGrpcInstall && rcpMode != rcpModeGrpcStream && rcpMode != rcpModeLegacy { + log.Fatalf("Invalid RCP mode, must be: %s, %s, %s or %s, got: %s", rcpModeLegacy, rcpModeGrpcLocalProxy, rcpModeGrpcInstall, rcpModeGrpcStream, rcpMode) } } else { if tridentBinaryPath != "" { @@ -118,8 +121,20 @@ var rootCmd = &cobra.Command{ config.MaxPhonehomeFailures = maxFailures if rcpMode != "" { - config.Rcp = &netlaunch.RcpConfiguration{ - GrpcMode: rcpMode == rcpModeGrpc, + config.Rcp = &netlaunch.RcpConfiguration{} + + // Map the CLI RCP mode to the config GRPC mode. + switch rcpMode { + case rcpModeGrpcLocalProxy: + config.Rcp.GrpcMode = netlaunch.GrpcModeLocalProxy + config.Rcp.LocalProxySocket = localProxyPath + log.Infof("Using local proxy socket path: %s", localProxyPath) + case rcpModeGrpcInstall: + config.Rcp.GrpcMode = netlaunch.GrpcModeInstall + case rcpModeGrpcStream: + config.Rcp.GrpcMode = netlaunch.GrpcModeStream + case rcpModeLegacy: + config.Rcp.GrpcMode = netlaunch.GrpcModeDisabled } if tridentBinaryPath != "" { @@ -130,7 +145,7 @@ var rootCmd = &cobra.Command{ config.Rcp.LocalOsmodifierPath = &osmodifierBinaryPath } - config.Rcp.UseStreamImage = streamImage + config.Rcp.ReplaceInstallWithStreamDisk = streamImage } ctx, cancel := context.WithCancel(context.Background()) @@ -170,6 +185,7 @@ func init() { rootCmd.PersistentFlags().StringVarP(&tridentBinaryPath, "trident-binary", "", "", "Optional path to Trident binary to be copied into the VM, requires RCP mode.") rootCmd.PersistentFlags().StringVarP(&osmodifierBinaryPath, "osmodifier-binary", "", "", "Optional path to Osmodifier binary to be copied into the VM, requires RCP mode.") rootCmd.PersistentFlags().BoolVarP(&streamImage, "stream-image", "", false, "Use stream image for installation instead of the default method, requires RCP mode.") + rootCmd.PersistentFlags().StringVarP(&localProxyPath, "local-proxy-socket", "", "/tmp/rcp_local_proxy.sock", "Path to the local proxy socket to use when RCP mode is grpc-local-proxy") rootCmd.Flags().StringVarP(&iso, "iso", "i", "", "ISO for Netlaunch testing") rootCmd.MarkFlagRequired("iso-template") } diff --git a/tools/cmd/rcp-agent/main.go b/tools/cmd/rcp-agent/main.go index f2dd305e9..7db1e3694 100644 --- a/tools/cmd/rcp-agent/main.go +++ b/tools/cmd/rcp-agent/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "errors" "fmt" "io" "net/http" @@ -51,7 +52,7 @@ func main() { } // Handle Ctrl+C gracefully - ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM, syscall.SIGABRT) defer stop() // Download files when provided in config @@ -62,6 +63,11 @@ func main() { } } + // Apply service configuration + if err := applyServicesConfiguration(config.Services); err != nil { + logrus.Fatalf("Failed to apply services configuration: %v", err) + } + if config.ClientAddress == "" { logrus.Warn("No client address specified, running legacy Trident install service.") @@ -77,9 +83,21 @@ func main() { } logrus.Infof("Starting reverse-connect proxy with client address: '%s' and server address: '%s'", config.ClientAddress, config.ServerAddress) - if err := proxy.StartReverseConnectProxy(ctx, &config.RcpClientTls, config.ClientAddress, config.ServerAddress, time.Second); err != nil { - logrus.Fatalf("reverse-connect proxy error: %v", err) + if err := proxy.StartReverseConnectProxy( + ctx, + &config.RcpClientTls, + config.ClientAddress, + config.ServerAddress, + config.ServerConnectionType, + time.Second, + ); err != nil { + if errors.Is(err, context.Canceled) { + logrus.Info("Context cancelled, shutting down reverse-connect proxy.") + } else { + logrus.Fatalf("reverse-connect proxy error: %v", err) + } } + logrus.Info("Shutdown complete") } @@ -128,3 +146,20 @@ func enableAndStartTridentInstallService() error { return nil } + +func applyServicesConfiguration(config agent.ServicesConfiguration) error { + for _, service := range config.Start { + logrus.Infof("Enabling and starting service '%s'", service) + err := cmd.Run("systemctl", "enable", service) + if err != nil { + return fmt.Errorf("failed to enable service '%s': %w", service, err) + } + + err = cmd.Run("systemctl", "start", "--no-block", service) + if err != nil { + return fmt.Errorf("failed to start service '%s': %w", service, err) + } + } + + return nil +} diff --git a/tools/pkg/netlaunch/config.go b/tools/pkg/netlaunch/config.go index c2cc817fe..fa16b83fe 100644 --- a/tools/pkg/netlaunch/config.go +++ b/tools/pkg/netlaunch/config.go @@ -1,6 +1,9 @@ package netlaunch -import "tridenttools/pkg/bmc" +import ( + "os" + "tridenttools/pkg/bmc" +) type NetCommonConfig struct { // Port to serve the HTTP server on. @@ -66,13 +69,9 @@ type NetLaunchConfig struct { // Configuration for netlaunch reverse-connect proxy. type RcpConfiguration struct { - // Run netlaunch in gRPC mode. When true, netlaunch will use the - // reverse-connect proxy to communicate with Trident using gRPC. When false, - // netlaunch will use the reverse-connect proxy to download the Host - // Configuration file and start the legacy installation service. - // - // If omitted, defaults to false. - GrpcMode bool `yaml:"grpcMode,omitempty"` + // gRPC mode to use in netlaunch. If not specified, gRPC mode will be + // disabled and netlaunch will use the legacy CLI installation method. + GrpcMode GrpcMode `yaml:"grpcMode,omitempty"` // Port number to listen on for incoming connections from the // reverse-connect proxy. @@ -84,15 +83,75 @@ type RcpConfiguration struct { // If not specified, no Trident binary will be copied. LocalTridentPath *string `yaml:"localTridentPath,omitempty"` - // An optional path to a local osmodifier binary to copy into the remote host. - // If not specified, no Osmodifier binary will be copied. + // An optional path to a local osmodifier binary to copy into the remote + // host. If not specified, no Osmodifier binary will be copied. LocalOsmodifierPath *string `yaml:"localOsmodifierPath,omitempty"` - // Replace the execution for trident-install to use stream image instead of + // Replace the execution for trident-install to use stream disk instead of // the default installation method. - UseStreamImage bool `yaml:"useStreamImage,omitempty"` + ReplaceInstallWithStreamDisk bool `yaml:"replaceInstallWithStreamDisk,omitempty"` + + // The local Unix socket netlaunch will listen on when gRPC mode is + // `local-proxy`. + LocalProxySocket string `yaml:"localProxySocket,omitempty"` + + AdditionalFiles []RcpAdditionalFile `yaml:"-"` + + // The address of the server the RCP agent should connect to. This is only + // used in gRPC modes. + // + // If not specified, the RCP agent will connect to Trident's default unix + // socket address. + RcpAgentServerAddress string `yaml:"rcpAgentServerAddress,omitempty"` + + // The connection type to use when the RCP agent connects to the server. + // This is only used in gRPC modes. + // + // If not specified, the RCP agent will use "unix" as the default connection + // type, connecting to Trident's default unix socket address. + RcpAgentServerConnectionType string `yaml:"rcpAgentServerConnectionType,omitempty"` + + // Systemd services to start via the RCP agent after file downloads. + StartServices []string `yaml:"-"` } +type RcpAdditionalFile struct { + Name string + Destination string + Mode os.FileMode + Data []byte +} + +func (c *RcpConfiguration) GetGrpcMode() GrpcMode { + if c.GrpcMode == "" { + return GrpcModeDisabled + } + + return c.GrpcMode +} + +func (c *RcpConfiguration) IsGrpcModeEnabled() bool { + return c.GetGrpcMode() != GrpcModeDisabled +} + +type GrpcMode string + +const ( + // GrpcModeDisabled: gRPC mode is disabled and netlaunch will use the legacy + // CLI installation method. + GrpcModeDisabled GrpcMode = "disabled" + // GrpcModeLocalProxy: gRPC mode is enabled and netlaunch will open a local + // listener and forward connections to Trident via the reverse-connect + // proxy. + GrpcModeLocalProxy GrpcMode = "local-proxy" + // GrpcModeInstall: gRPC mode is enabled and netlaunch will directly connect + // to Trident via the reverse-connect proxy to perform an install. + GrpcModeInstall GrpcMode = "install" + // GrpcModeStream: gRPC mode is enabled and netlaunch will directly connect + // to Trident via the reverse-connect proxy to stream a disk image. + GrpcModeStream GrpcMode = "stream" +) + type HostConnectionConfiguration struct { // Configuration for physical/emulated BMCs. @@ -142,6 +201,6 @@ type NetListenConfig struct { } } -func (c *NetLaunchConfig) IsGrpcMode() bool { - return c.Rcp != nil && c.Rcp.GrpcMode +func (c *NetLaunchConfig) IsGrpcModeEnabled() bool { + return c.Rcp != nil && c.Rcp.IsGrpcModeEnabled() } diff --git a/tools/pkg/netlaunch/grpc.go b/tools/pkg/netlaunch/grpc.go index 77bf9816f..aa879633b 100644 --- a/tools/pkg/netlaunch/grpc.go +++ b/tools/pkg/netlaunch/grpc.go @@ -1,30 +1,90 @@ package netlaunch import ( + "context" "errors" "fmt" "io" + "net" + "tridenttools/pkg/tridentgrpc" "tridenttools/pkg/tridentgrpc/tridentpbv1" + "tridenttools/pkg/tridentgrpc/tridentpbv1preview" "github.com/fatih/color" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "google.golang.org/grpc" ) +func doGrpcInstall(ctx context.Context, conn net.Conn, hostConfiguration string) error { + tridentClient, err := tridentgrpc.NewTridentClientFromNetworkConnection(conn) + if err != nil { + return fmt.Errorf("failed to create Trident gRPC client from RCP connection: %w", err) + } + defer tridentClient.Close() + + stream, err := tridentClient.Install(ctx, &tridentpbv1preview.InstallRequest{ + Stage: &tridentpbv1preview.StageInstallRequest{ + Config: &tridentpbv1preview.HostConfiguration{ + Config: hostConfiguration, + }, + }, + Finalize: &tridentpbv1preview.FinalizeInstallRequest{ + Reboot: &tridentpbv1.RebootManagement{ + Handling: tridentpbv1.RebootHandling_TRIDENT_HANDLES_REBOOT, + }, + }, + }) + if err != nil { + return fmt.Errorf("failed to start installation via gRPC: %w", err) + } + + err = handleServicingResponseStream(stream) + if err != nil { + return fmt.Errorf("error during installation via gRPC: %w", err) + } + + return nil +} + +func doGrpcStream(ctx context.Context, conn net.Conn, imageUrl string, imageHash string) error { + tridentClient, err := tridentgrpc.NewTridentClientFromNetworkConnection(conn) + if err != nil { + return fmt.Errorf("failed to create Trident gRPC client from RCP connection: %w", err) + } + defer tridentClient.Close() + + stream, err := tridentClient.StreamingServiceClient.StreamDisk(ctx, &tridentpbv1.StreamDiskRequest{ + ImageUrl: imageUrl, + ImageHash: &imageHash, + Reboot: &tridentpbv1.RebootManagement{ + Handling: tridentpbv1.RebootHandling_TRIDENT_HANDLES_REBOOT, + }, + }) + if err != nil { + return fmt.Errorf("failed to start streaming via gRPC: %w", err) + } + + err = handleServicingResponseStream(stream) + if err != nil { + return fmt.Errorf("error during streaming via gRPC: %w", err) + } + + return nil +} + func handleServicingResponseStream(stream grpc.ServerStreamingClient[tridentpbv1.ServicingResponse]) error { for { resp, err := stream.Recv() if errors.Is(err, io.EOF) { - log.Info("Install stream ended") + log.Info("Servicing stream ended") break } else if err != nil { - return fmt.Errorf("failed to receive installation response via gRPC: %w", err) + return fmt.Errorf("failed to receive servicing response via gRPC: %w", err) } err = handleServicingResponse(resp) if err != nil { - return fmt.Errorf("failed to handle installation response via gRPC: %w", err) + return fmt.Errorf("failed to handle servicing response via gRPC: %w", err) } } @@ -40,18 +100,18 @@ func handleServicingResponse(resp *tridentpbv1.ServicingResponse) (err error) { case *tridentpbv1.ServicingResponse_Log: logEntry := payload.Log - outLevel := logrus.InfoLevel + outLevel := log.InfoLevel switch logEntry.Level { case tridentpbv1.LogLevel_LOG_LEVEL_TRACE: - outLevel = logrus.TraceLevel + outLevel = log.TraceLevel case tridentpbv1.LogLevel_LOG_LEVEL_DEBUG: - outLevel = logrus.DebugLevel + outLevel = log.DebugLevel case tridentpbv1.LogLevel_LOG_LEVEL_INFO: - outLevel = logrus.InfoLevel + outLevel = log.InfoLevel case tridentpbv1.LogLevel_LOG_LEVEL_WARN: - outLevel = logrus.WarnLevel + outLevel = log.WarnLevel case tridentpbv1.LogLevel_LOG_LEVEL_ERROR: - outLevel = logrus.ErrorLevel + outLevel = log.ErrorLevel } if outLevel <= log.DebugLevel { @@ -69,19 +129,37 @@ func handleServicingResponse(resp *tridentpbv1.ServicingResponse) (err error) { record.Log(outLevel, text) } case *tridentpbv1.ServicingResponse_Completed: + var statusStr string + switch payload.Completed.Status { + case tridentpbv1.StatusCode_STATUS_CODE_SUCCESS: + statusStr = color.CyanString("SUCCESS") + case tridentpbv1.StatusCode_STATUS_CODE_FAILURE: + statusStr = color.RedString("FAILURE") + case tridentpbv1.StatusCode_STATUS_CODE_UNSPECIFIED: + statusStr = color.YellowString("UNSPECIFIED") + } var errStr string - level := logrus.InfoLevel + level := log.InfoLevel if tridentError := payload.Completed.GetError(); tridentError != nil { - level = logrus.ErrorLevel + level = log.ErrorLevel errStr = fmt.Sprintf("\n%s", tridentError.Message) err = fmt.Errorf("operation failed with error kind %s:%s: %s", tridentError.Kind, tridentError.Subkind, tridentError.Message) + } else { + switch payload.Completed.RebootStatus { + case tridentpbv1.RebootStatus_REBOOT_NOT_REQUIRED: + errStr = " - Reboot: not required" + case tridentpbv1.RebootStatus_REBOOT_REQUIRED: + errStr = " - Reboot: required" + case tridentpbv1.RebootStatus_REBOOT_STARTED: + errStr = " - Reboot: started by trident" + } } log.StandardLogger().Log(level, fmt.Sprintf( "%s%s %s%s", grpcHeader, - color.MagentaString("[STATUS]"), - payload.Completed.Status.String(), + color.MagentaString("COMPLETED:"), + statusStr, errStr, )) default: diff --git a/tools/pkg/netlaunch/localproxy.go b/tools/pkg/netlaunch/localproxy.go new file mode 100644 index 000000000..c6a620d92 --- /dev/null +++ b/tools/pkg/netlaunch/localproxy.go @@ -0,0 +1,143 @@ +package netlaunch + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "os" + "syscall" + "time" + rcpclient "tridenttools/pkg/rcp/client" + + log "github.com/sirupsen/logrus" +) + +// openLocalProxy sets up a local proxy that listens on the specified socket +// path and forwards connections to the netlaunch server. Only one connection +// will be accepted and forwarded at a time. When a connection closes, the proxy +// will accept a new connection. +func openLocalProxy(ctx context.Context, socketPath string, rcpListener *rcpclient.RcpListener) error { + for { + log.Info("Waiting for RCP connection...") + select { + case <-ctx.Done(): + return ctx.Err() + case conn, ok := <-rcpListener.ConnChan: + if !ok || conn == nil { + return fmt.Errorf("RCP listener closed") + } + log.Infof("Accepted RCP connection from %s", conn.RemoteAddr()) + err := runLocalProxy(ctx, socketPath, conn) + if err != nil { + log.Errorf("Error running local proxy: %v", err) + } + + if ctx.Err() != nil { + // Don't retry if the context was cancelled. + return ctx.Err() + } + } + } +} + +func runLocalProxy(ctx context.Context, socketPath string, remoteConn net.Conn) error { + defer remoteConn.Close() + // Remove any existing socket file to avoid "address already in use" errors. + // Only remove if the path is actually a unix socket to avoid accidentally + // deleting unrelated files or following symlinks. + if info, err := os.Lstat(socketPath); err == nil { + if info.Mode().Type()&os.ModeSocket == 0 { + return fmt.Errorf("path %s exists but is not a unix socket (mode: %s); refusing to remove", socketPath, info.Mode().Type()) + } + if err := os.Remove(socketPath); err != nil { + return fmt.Errorf("failed to remove existing socket %s: %w", socketPath, err) + } + } else if !os.IsNotExist(err) { + return fmt.Errorf("failed to stat socket path %s: %w", socketPath, err) + } + + listener, err := net.Listen("unix", socketPath) + if err != nil { + return fmt.Errorf("failed to listen on unix socket %s: %w", socketPath, err) + } + defer listener.Close() + defer os.Remove(socketPath) + + log.WithField("socket", socketPath).Info("Local proxy listening") + + // Close the listener when the context is cancelled so Accept unblocks. + go func() { + <-ctx.Done() + listener.Close() + }() + + localConn, err := listener.Accept() + if err != nil { + // Check if the context was cancelled. + if ctx.Err() != nil { + return ctx.Err() + } + return fmt.Errorf("failed to accept connection: %w", err) + } + + log.WithField("addr", localConn.RemoteAddr()).Info("Accepted local proxy connection") + + // Forward data bidirectionally between the local and remote connections. + // Block until the forwarding completes (one connection at a time). + forwardConnections(ctx, localConn, remoteConn) + + return nil +} + +// forwardConnections copies data bidirectionally between two connections. +// It blocks until both directions are finished (i.e. one side closes or errors). +func forwardConnections(ctx context.Context, local, remote net.Conn) { + defer local.Close() + + local.SetReadDeadline(time.Time{}) + remote.SetReadDeadline(time.Time{}) + + // Channel to signal when copying is done. Buffered to allow both goroutines + // to send without blocking. + doneChan := make(chan string, 2) + + // Start the proxying + go func() { + _, err := io.Copy(remote, local) + if err != nil { + switch { + case errors.Is(err, io.EOF), + errors.Is(err, net.ErrClosed), + errors.Is(err, syscall.EPIPE): + log.Debugf("Connection closed while copying from client to server: %v", err) + default: + log.Errorf("Error copying from client to server: %v", err) + } + } + doneChan <- "local->remote" + }() + go func() { + _, err := io.Copy(local, remote) + if err != nil { + switch { + case errors.Is(err, io.EOF), + errors.Is(err, net.ErrClosed), + errors.Is(err, syscall.EPIPE): + log.Debugf("Connection closed while copying from server to client: %v", err) + default: + log.Errorf("Error copying from server to client: %v", err) + } + } + doneChan <- "remote->local" + }() + + // Wait for either copy to finish or context cancellation + select { + case direction := <-doneChan: + log.Infof("Connection closed by '%s'", direction) + case <-ctx.Done(): + log.Info("Context cancelled") + } +} diff --git a/tools/pkg/netlaunch/netlaunch.go b/tools/pkg/netlaunch/netlaunch.go index a3a642d0f..884e4ab5b 100644 --- a/tools/pkg/netlaunch/netlaunch.go +++ b/tools/pkg/netlaunch/netlaunch.go @@ -23,8 +23,6 @@ import ( rcpclient "tridenttools/pkg/rcp/client" "tridenttools/pkg/rcp/tlscerts" "tridenttools/pkg/tridentgrpc" - "tridenttools/pkg/tridentgrpc/tridentpbv1" - "tridenttools/pkg/tridentgrpc/tridentpbv1preview" stormutils "tridenttools/storm/utils" ) @@ -52,7 +50,26 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { // When enabled, set up RCP listener. var rcpListener *rcpclient.RcpListener - if config.Rcp != nil && config.Rcp.GrpcMode { + if config.IsGrpcModeEnabled() { + if config.Rcp.GetGrpcMode() == GrpcModeLocalProxy { + log.Info("RCP gRPC mode enabled: local proxy mode") + if config.Rcp.LocalProxySocket == "" { + return fmt.Errorf("local proxy socket path must be specified when using local proxy gRPC mode") + } + } else if config.Rcp.GetGrpcMode() == GrpcModeInstall { + log.Info("RCP gRPC mode enabled: install mode") + if config.HostConfigFile == "" { + return fmt.Errorf("host config file must be specified when using install gRPC mode") + } + } else if config.Rcp.GetGrpcMode() == GrpcModeStream { + log.Info("RCP gRPC mode enabled: stream mode") + if config.HostConfigFile == "" { + return fmt.Errorf("host config file with the image section must be specified when using stream gRPC mode") + } + } else { + return fmt.Errorf("unsupported RCP gRPC mode: %s", config.Rcp.GetGrpcMode()) + } + port := uint16(0) if config.Rcp.ListenPort != nil { port = *config.Rcp.ListenPort @@ -113,6 +130,8 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { defer terminateFunc() var finalHostConfigurationYaml string + hostConfigData := make(map[string]interface{}) + var extraRcpAgentFiles []rcpAgentFileDownload // If we have a Trident config file, we need to patch it into the ISO. if len(config.HostConfigFile) != 0 { @@ -125,8 +144,7 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { // Replace NETLAUNCH_HOST_ADDRESS with the address of the netlaunch server tridentConfigContentsStr := strings.ReplaceAll(string(tridentConfigContents), "NETLAUNCH_HOST_ADDRESS", announceAddress) - trident := make(map[string]interface{}) - err = yaml.UnmarshalStrict([]byte(tridentConfigContentsStr), &trident) + err = yaml.UnmarshalStrict([]byte(tridentConfigContentsStr), &hostConfigData) if err != nil { return fmt.Errorf("failed to unmarshal Trident config: %w", err) } @@ -134,18 +152,26 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { logstreamAddress := fmt.Sprintf("http://%s/logstream", announceAddress) // Add phonehome & logstream config ONLY when NOT in gRPC RCP mode - if !config.IsGrpcMode() { - if _, ok := trident["trident"]; !ok { - trident["trident"] = make(map[interface{}]interface{}) + if !config.IsGrpcModeEnabled() { + if _, ok := hostConfigData["trident"]; !ok { + hostConfigData["trident"] = make(map[interface{}]interface{}) } - trident["trident"].(map[interface{}]interface{})["phonehome"] = fmt.Sprintf("http://%s/phonehome", announceAddress) - trident["trident"].(map[interface{}]interface{})["logstream"] = logstreamAddress + hostConfigData["trident"].(map[interface{}]interface{})["phonehome"] = fmt.Sprintf("http://%s/phonehome", announceAddress) + hostConfigData["trident"].(map[interface{}]interface{})["logstream"] = logstreamAddress } - // Patch the ISO Host Configuration file unless this is a stream-image test, where - // the Host Configuration file is not expected to be present. - if config.Rcp == nil || !config.Rcp.UseStreamImage { - tridentConfig, err := yaml.Marshal(trident) + // Patch the ISO Host Configuration file when it will be needed by + // Trident, which is when: + // + // - We are NOT using RCP (config.Rcp == nil), OR + // - We are using RCP, but we are NOT: + // - Using Stream Disk, NOR + // - Using gRPC mode. + // + // Stream disk and gRPC modes do NOT need an in-ISO Host Configuration + // file, so we skip injecting it in those cases. + if config.Rcp == nil || !(config.Rcp.ReplaceInstallWithStreamDisk || config.IsGrpcModeEnabled()) { + tridentConfig, err := yaml.Marshal(hostConfigData) if err != nil { return fmt.Errorf("failed to marshal Trident config: %w", err) } @@ -159,23 +185,13 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { } } - if config.Rcp != nil { - var extraRcpAgentFiles []rcpAgentFileDownload - if config.Rcp.UseStreamImage { - overrideFile, err := makeStreamImageOverrideFileDownload(trident, logstreamAddress) - if err != nil { - return fmt.Errorf("failed to create stream image override file download: %w", err) - } - - extraRcpAgentFiles = append(extraRcpAgentFiles, overrideFile) - } - // Populate RCP agent config into the ISO. This handles both CLI and - // GRPC modes, where rcpListener == nil and rcpListener != nil - // respectively. - err = injectRcpAgentConfig(mux, announceIp, announceAddress, iso, rcpListener, *config.Rcp, extraRcpAgentFiles...) + if config.Rcp != nil && config.Rcp.ReplaceInstallWithStreamDisk { + overrideFile, err := makeStreamImageOverrideFileDownload(hostConfigData, logstreamAddress) if err != nil { - return fmt.Errorf("failed to inject RCP agent config into ISO: %w", err) + return fmt.Errorf("failed to create stream image override file download: %w", err) } + + extraRcpAgentFiles = append(extraRcpAgentFiles, overrideFile) } if config.Iso.PreTridentScript != nil { @@ -194,22 +210,31 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { } } - mux.HandleFunc("/provision.iso", func(w http.ResponseWriter, r *http.Request) { - isoLogFunc(r.RemoteAddr) - http.ServeContent(w, r, "provision.iso", time.Now(), bytes.NewReader(iso)) - }) - // We injected the phonehome & logstream config, so we're expecting Trident to reach back enable_phonehome_listening = true - } else { - // Otherwise, serve the iso as-is - mux.HandleFunc("/provision.iso", func(w http.ResponseWriter, r *http.Request) { - isoLogFunc(r.RemoteAddr) - http.ServeContent(w, r, "provision.iso", time.Now(), bytes.NewReader(iso)) - terminateFunc() - }) } + // Inject RCP agent config when we are using it. + if config.Rcp != nil { + // Populate RCP agent config into the ISO. This handles both CLI and + // GRPC modes, where rcpListener == nil and rcpListener != nil + // respectively. + err = injectRcpAgentConfig(mux, announceIp, announceAddress, iso, rcpListener, *config.Rcp, extraRcpAgentFiles...) + if err != nil { + return fmt.Errorf("failed to inject RCP agent config into ISO: %w", err) + } + } + + mux.HandleFunc("/provision.iso", func(w http.ResponseWriter, r *http.Request) { + isoLogFunc(r.RemoteAddr) + http.ServeContent(w, r, "provision.iso", time.Now(), bytes.NewReader(iso)) + if !enable_phonehome_listening { + // If we're not expecting Trident to reach back, we can terminate + // after serving the ISO + terminateFunc() + } + }) + // If we're expecting Trident to reach back, we need to listen for it. if enable_phonehome_listening { // Set up listening for phonehome @@ -314,30 +339,55 @@ func RunNetlaunch(ctx context.Context, config *NetLaunchConfig) error { } if rcpListener != nil { - log.Info("Waiting for RCP connection...") - select { - case <-ctx.Done(): - return ctx.Err() - case conn, ok := <-rcpListener.ConnChan: - if !ok { - return fmt.Errorf("RCP listener channel closed") + if config.Rcp.GetGrpcMode() == GrpcModeLocalProxy { + err := openLocalProxy(ctx, config.Rcp.LocalProxySocket, rcpListener) + if err != nil { + return fmt.Errorf("failed to run local proxy: %w", err) } + } else { + // Netlaunch will directly speak gRPC to trident. Wait for the + // connection and handle it. + log.Info("Waiting for RCP connection...") + select { + case <-ctx.Done(): + return ctx.Err() + case conn, ok := <-rcpListener.ConnChan: + if !ok { + return fmt.Errorf("RCP listener channel closed") + } - log.Infof("Accepted RCP connection from %s", conn.RemoteAddr()) - installCtx, installCancel := context.WithTimeout(ctx, time.Minute*10) - defer installCancel() - - func() { - // Defer termination of the phonehome listener - defer terminateFunc() defer conn.Close() - err := doGrpcInstall(installCtx, conn, finalHostConfigurationYaml) - if err != nil { - log.WithError(err).Errorln("gRPC installation failed") - return + log.Infof("Accepted RCP connection from %s", conn.RemoteAddr()) + + if config.Rcp.GetGrpcMode() == GrpcModeInstall { + installCtx, installCancel := context.WithTimeout(ctx, time.Minute*10) + defer installCancel() + + err := doGrpcInstall(installCtx, conn, finalHostConfigurationYaml) + if err != nil { + return fmt.Errorf("gRPC installation failed: %w", err) + } + + log.Info("gRPC installation completed successfully") + } else if config.Rcp.GetGrpcMode() == GrpcModeStream { + streamCtx, streamCancel := context.WithTimeout(ctx, time.Minute*10) + defer streamCancel() + + imgUrl, imgHash, err := getImageUrlAndHashFromTridentConfig(hostConfigData) + if err != nil { + return fmt.Errorf("failed to get image URL and hash from Trident config: %w", err) + } + + err = doGrpcStream(streamCtx, conn, imgUrl, imgHash) + if err != nil { + return fmt.Errorf("gRPC streaming failed: %w", err) + } + log.Info("gRPC streaming completed successfully") + } else { + return fmt.Errorf("unsupported RCP gRPC mode: %s", config.Rcp.GetGrpcMode()) } - }() + } } } else { // Wait for something to happen @@ -392,8 +442,28 @@ func injectRcpAgentConfig( localRcpConf RcpConfiguration, extraFiles ...rcpAgentFileDownload, ) error { + rcpServerAddress := tridentgrpc.DefaultTridentSocketPath + rcpServerConnectionType := "unix" + + if localRcpConf.RcpAgentServerAddress != "" { + log.Warnf("Custom rcp-agent server: '%s'", localRcpConf.RcpAgentServerAddress) + rcpServerAddress = localRcpConf.RcpAgentServerAddress + } + + if localRcpConf.RcpAgentServerConnectionType != "" { + log.Warnf("Custom rcp-agent server connection type: '%s'", localRcpConf.RcpAgentServerConnectionType) + rcpServerConnectionType = localRcpConf.RcpAgentServerConnectionType + } + // Create an empty RcpAgentConfiguration - rcpAgentConfBuilder := newRcpAgentConfigBuilder(mux, announceIp, announceHttpAddress, rcpListener) + rcpAgentConfBuilder := newRcpAgentConfigBuilder( + mux, + announceIp, + announceHttpAddress, + rcpListener, + rcpServerAddress, + rcpServerConnectionType, + ) // If we have a local trident path, serve that file via HTTP and set the download URL. if localRcpConf.LocalTridentPath != nil { @@ -419,45 +489,22 @@ func injectRcpAgentConfig( rcpAgentConfBuilder.registerRcpFile(extraFile) } - encoded, err := yaml.Marshal(rcpAgentConfBuilder.build()) - if err != nil { - return fmt.Errorf("failed to marshal RCP agent config to YAML: %w", err) + for _, file := range localRcpConf.AdditionalFiles { + rcpAgentConfBuilder.registerRcpFile(newRcpAgentFileDownload(file.Name, file.Destination, file.Mode, file.Data)) } - err = isopatcher.PatchFile(iso, "/trident_cdrom/rcp-agent.yaml", encoded) - if err != nil { - return fmt.Errorf("failed to patch RCP agent config into ISO: %w", err) + for _, service := range localRcpConf.StartServices { + rcpAgentConfBuilder.startService(service) } - return nil -} - -func doGrpcInstall(ctx context.Context, conn net.Conn, hostConfiguration string) error { - tridentClient, err := tridentgrpc.NewTridentClientFromNetworkConnection(conn) - if err != nil { - return fmt.Errorf("failed to create Trident gRPC client from RCP connection: %w", err) - } - defer tridentClient.Close() - - stream, err := tridentClient.Install(ctx, &tridentpbv1preview.InstallRequest{ - Stage: &tridentpbv1preview.StageInstallRequest{ - Config: &tridentpbv1preview.HostConfiguration{ - Config: hostConfiguration, - }, - }, - Finalize: &tridentpbv1preview.FinalizeInstallRequest{ - Reboot: &tridentpbv1.RebootManagement{ - Handling: tridentpbv1.RebootHandling_TRIDENT_HANDLES_REBOOT, - }, - }, - }) + encoded, err := yaml.Marshal(rcpAgentConfBuilder.build()) if err != nil { - return fmt.Errorf("failed to start installation via gRPC: %w", err) + return fmt.Errorf("failed to marshal RCP agent config to YAML: %w", err) } - err = handleServicingResponseStream(stream) + err = isopatcher.PatchFile(iso, "/trident_cdrom/rcp-agent.yaml", encoded) if err != nil { - return fmt.Errorf("error during installation via gRPC: %w", err) + return fmt.Errorf("failed to patch RCP agent config into ISO: %w", err) } return nil diff --git a/tools/pkg/netlaunch/rcpagent.go b/tools/pkg/netlaunch/rcpagent.go index 8c1c077b8..7f9fda24d 100644 --- a/tools/pkg/netlaunch/rcpagent.go +++ b/tools/pkg/netlaunch/rcpagent.go @@ -10,7 +10,6 @@ import ( rcpagent "tridenttools/pkg/rcp/agent" rcpclient "tridenttools/pkg/rcp/client" "tridenttools/pkg/rcp/tlscerts" - "tridenttools/pkg/tridentgrpc" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -33,20 +32,31 @@ func newRcpAgentFileDownload(name string, destination string, mode os.FileMode, } type rcpAgentConfigBuilder struct { - rcpConf *rcpagent.RcpAgentConfiguration - mux *http.ServeMux - AnnounceIp string - announceHttp string - rcpListener *rcpclient.RcpListener + rcpConf *rcpagent.RcpAgentConfiguration + mux *http.ServeMux + AnnounceIp string + announceHttp string + rcpListener *rcpclient.RcpListener + serverAddress string + serverConnectionType string } -func newRcpAgentConfigBuilder(mux *http.ServeMux, announceIp string, announceHttpAddress string, rcpListener *rcpclient.RcpListener) *rcpAgentConfigBuilder { +func newRcpAgentConfigBuilder( + mux *http.ServeMux, + announceIp string, + announceHttpAddress string, + rcpListener *rcpclient.RcpListener, + serverAddress string, + serverConnectionType string, +) *rcpAgentConfigBuilder { return &rcpAgentConfigBuilder{ - rcpConf: &rcpagent.RcpAgentConfiguration{}, - mux: mux, - AnnounceIp: announceIp, - announceHttp: announceHttpAddress, - rcpListener: rcpListener, + rcpConf: &rcpagent.RcpAgentConfiguration{}, + mux: mux, + AnnounceIp: announceIp, + announceHttp: announceHttpAddress, + rcpListener: rcpListener, + serverAddress: serverAddress, + serverConnectionType: serverConnectionType, } } @@ -67,10 +77,16 @@ func (b *rcpAgentConfigBuilder) registerRcpFile(file rcpAgentFileDownload) { }) } +func (b *rcpAgentConfigBuilder) startService(serviceName string) { + log.Infof("Scheduling service '%s' to be started by RCP agent", serviceName) + b.rcpConf.Services.Start = append(b.rcpConf.Services.Start, serviceName) +} + func (b *rcpAgentConfigBuilder) build() *rcpagent.RcpAgentConfiguration { if b.rcpListener != nil { b.rcpConf.ClientAddress = fmt.Sprintf("%s:%d", b.AnnounceIp, b.rcpListener.Port) - b.rcpConf.ServerAddress = tridentgrpc.DefaultTridentSocketPath + b.rcpConf.ServerAddress = b.serverAddress + b.rcpConf.ServerConnectionType = b.serverConnectionType // Populate TLS certs for mutual authentication clientCert, clientKey, serverCert := tlscerts.ClientTlsData() diff --git a/tools/pkg/netlaunch/stream_image.go b/tools/pkg/netlaunch/stream_image.go index 444c890bd..271c4932c 100644 --- a/tools/pkg/netlaunch/stream_image.go +++ b/tools/pkg/netlaunch/stream_image.go @@ -13,20 +13,20 @@ StandardError=journal+console Environment="LOGSTREAM_URL=%s" ` -func makeStreamImageOverrideFileDownload(tridentConfig map[string]any, logstreamAddress string) (rcpAgentFileDownload, error) { +func getImageUrlAndHashFromTridentConfig(tridentConfig map[string]any) (string, string, error) { imgConf, ok := tridentConfig["image"] if !ok { - return rcpAgentFileDownload{}, fmt.Errorf("trident config does not contain an image section") + return "", "", fmt.Errorf("trident config does not contain an image section") } imgConfMap, ok := imgConf.(map[any]any) if !ok { - return rcpAgentFileDownload{}, fmt.Errorf("trident config image section is not a map") + return "", "", fmt.Errorf("trident config image section is not a map") } imgUrl, ok := imgConfMap["url"].(string) if !ok { - return rcpAgentFileDownload{}, fmt.Errorf("trident config image section does not contain a 'url' field of type string") + return "", "", fmt.Errorf("trident config image section does not contain a 'url' field of type string") } imgSha384, ok := imgConfMap["sha384"].(string) @@ -36,6 +36,15 @@ func makeStreamImageOverrideFileDownload(tridentConfig map[string]any, logstream imgSha384 = "ignored" } + return imgUrl, imgSha384, nil +} + +func makeStreamImageOverrideFileDownload(tridentConfig map[string]any, logstreamAddress string) (rcpAgentFileDownload, error) { + imgUrl, imgSha384, err := getImageUrlAndHashFromTridentConfig(tridentConfig) + if err != nil { + return rcpAgentFileDownload{}, fmt.Errorf("failed to get image URL and hash from Trident config: %w", err) + } + fileContent := fmt.Sprintf( systemdServiceExecOverrideTemplate, fmt.Sprintf("/usr/bin/trident grpc-client stream-image %s --hash %s", imgUrl, imgSha384), diff --git a/tools/pkg/rcp/agent/config.go b/tools/pkg/rcp/agent/config.go index 47380c54e..3f5061987 100644 --- a/tools/pkg/rcp/agent/config.go +++ b/tools/pkg/rcp/agent/config.go @@ -12,10 +12,12 @@ import ( // RcpAgentConfiguration holds the configuration for the RCP agent. type RcpAgentConfiguration struct { - ClientAddress string `yaml:"clientAddress,omitempty" mapstructure:"clientAddress"` - ServerAddress string `yaml:"serverAddress,omitempty" mapstructure:"serverAddress"` - AdditionalFiles []RcpAdditionalFile `yaml:"additionalFiles,omitempty" mapstructure:"additionalFiles"` - RcpClientTls RcpTlsClientData `yaml:"rcpClientTls,omitempty" mapstructure:"rcpClientTls"` + ClientAddress string `yaml:"clientAddress,omitempty" mapstructure:"clientAddress"` + ServerConnectionType string `yaml:"serverConnectionType,omitempty" mapstructure:"serverConnectionType"` + ServerAddress string `yaml:"serverAddress,omitempty" mapstructure:"serverAddress"` + AdditionalFiles []RcpAdditionalFile `yaml:"additionalFiles,omitempty" mapstructure:"additionalFiles"` + RcpClientTls RcpTlsClientData `yaml:"rcpClientTls,omitempty" mapstructure:"rcpClientTls"` + Services ServicesConfiguration `yaml:"services,omitempty" mapstructure:"services"` } type RcpAdditionalFile struct { @@ -30,6 +32,10 @@ type RcpTlsClientData struct { ServerCert string `yaml:"serverCert,omitempty" mapstructure:"serverCert"` } +type ServicesConfiguration struct { + Start []string `yaml:"start,omitempty" mapstructure:"start"` +} + // LocalCert implements the CertProvider interface. func (d *RcpTlsClientData) LocalCert() (tls.Certificate, error) { clientCert, err := base64.StdEncoding.DecodeString(d.ClientCert) diff --git a/tools/pkg/rcp/client/listen.go b/tools/pkg/rcp/client/listen.go index a9661498b..cb1aa2137 100644 --- a/tools/pkg/rcp/client/listen.go +++ b/tools/pkg/rcp/client/listen.go @@ -6,6 +6,7 @@ import ( "crypto/x509" "fmt" "net" + "sync" "tridenttools/pkg/rcp/tlscerts" @@ -95,18 +96,44 @@ func ListenAndAccept(ctx context.Context, certProvider tlscerts.CertProvider, po defer listener.Close() for { conn, err := listener.Accept() - if err == nil { - logrus.Infof("RCP accepted connection from %s", conn.RemoteAddr().String()) - acceptCancel() // Stop the listener-closure goroutine - connChan <- conn - return - } else if acceptCtx.Err() != nil { - // Context was cancelled - logrus.Debug("RCP listener context cancelled, stopping accept loop") + if err != nil { + if acceptCtx.Err() != nil { + // Context was cancelled + return + } + + logrus.Errorf("Failed to accept connection: %v", err) + continue + } + + logrus.Debugf("RCP-client accepted connection from %s", conn.RemoteAddr()) + + // Wrap the connection in a trackedConnection to ensure it gets closed properly + trackingChan := make(chan struct{}) + trackedConn := &trackedConnection{ + Conn: conn, + done: trackingChan, + } + + select { + case connChan <- trackedConn: + // Connection sent to channel successfully + case <-acceptCtx.Done(): + // Context was cancelled while trying to send connection + logrus.Debug("RCP listener context cancelled while sending connection, closing accepted connection") + trackedConn.Close() return } - logrus.Errorf("Failed to accept connection: %v", err) + select { + case <-trackingChan: + // Connection was closed, continue accepting new connections + logrus.Debug("RCP-client connection closed, waiting for new connections") + case <-acceptCtx.Done(): + // Context was cancelled while waiting for connection to close + logrus.Debug("RCP listener context cancelled while waiting for connection to close, stopping accept loop") + return + } } }() @@ -116,3 +143,23 @@ func ListenAndAccept(ctx context.Context, certProvider tlscerts.CertProvider, po cancel: acceptCancel, }, nil } + +type trackedConnection struct { + net.Conn + once sync.Once + done chan struct{} +} + +func (tc *trackedConnection) Close() error { + // Close the underlying connection and then signal that the connection has + // been closed by closing the done channel. + err := tc.Conn.Close() + + // Close the done channel exactly once to signal that the connection has + // been closed. + tc.once.Do(func() { + close(tc.done) + }) + + return err +} diff --git a/tools/pkg/rcp/proxy/proxy.go b/tools/pkg/rcp/proxy/proxy.go index c10f61ccb..b5c25bb36 100644 --- a/tools/pkg/rcp/proxy/proxy.go +++ b/tools/pkg/rcp/proxy/proxy.go @@ -30,6 +30,7 @@ func StartReverseConnectProxy( certProvider tlscerts.CertProvider, clientAddress string, serverAddress string, + serverConnectionType string, retryInterval time.Duration, ) error { // Load our private client certificate @@ -56,6 +57,10 @@ func StartReverseConnectProxy( // consecutively, to reduce log spam. multipleRefused := false + // Build a context-aware TLS dialer so that a cancelled context + // (e.g. during shutdown) immediately unblocks the TLS handshake. + tlsDialer := tls.Dialer{Config: &tlsConfig} + // Main loop to keep trying to connect to the client for { if ctx.Err() != nil { @@ -64,7 +69,7 @@ func StartReverseConnectProxy( } // Try to establish connection to the client - clientConn, err := tls.Dial("tcp", clientAddress, &tlsConfig) + clientConn, err := tlsDialer.DialContext(ctx, "tcp", clientAddress) if err != nil { var errno syscall.Errno @@ -74,6 +79,9 @@ func StartReverseConnectProxy( multipleRefused = true logrus.Warnf("Client connection refused, will retry silently.") } + } else if errors.Is(err, context.Canceled) { + logrus.Info("Context cancelled while trying to connect to client, exiting.") + return err } else { // Some other error occurred logrus.Errorf("Failed to establish client connection: %v", err) @@ -96,7 +104,7 @@ func StartReverseConnectProxy( // Handle the client connection, the function will block until the // connection is closed or an error occurs and close the connection. logrus.Infof("Client connected from '%s'", clientConn.RemoteAddr().String()) - err = handleClientConnection(ctx, clientConn, serverAddress) + err = handleClientConnection(ctx, clientConn, serverAddress, serverConnectionType) if err != nil { logrus.Errorf("Client connection error: %v", err) } @@ -107,11 +115,23 @@ func StartReverseConnectProxy( // the server and proxying data between the client and server connections. // // This function blocks until the connection is closed or an error occurs. -func handleClientConnection(ctx context.Context, clientConn net.Conn, serverAddress string) error { +func handleClientConnection( + ctx context.Context, + clientConn net.Conn, + serverAddress string, + serverConnectionType string, +) error { defer clientConn.Close() + // Safe default to use a local Unix socket if no connection type is + // specified to avoid getting weird errors from net.Dial with an invalid + // connection type. + if serverConnectionType == "" { + serverConnectionType = "unix" + } + logrus.Infof("Connecting to server at '%s'", serverAddress) - serverConn, err := net.Dial("unix", serverAddress) + serverConn, err := net.Dial(serverConnectionType, serverAddress) if err != nil { return fmt.Errorf("failed to connect to server at '%s': %w", serverAddress, err) } @@ -119,7 +139,8 @@ func handleClientConnection(ctx context.Context, clientConn net.Conn, serverAddr // Both connections are established, start proxying data between them - // Channel to signal when copying is done. Buffered to allow both goroutines to send without blocking. + // Channel to signal when copying is done. Buffered to allow both goroutines + // to send without blocking. doneChan := make(chan string, 2) // Start the proxying diff --git a/tools/pkg/tridentgrpc/grpc.go b/tools/pkg/tridentgrpc/grpc.go index 9d7ed2381..929ed74c4 100644 --- a/tools/pkg/tridentgrpc/grpc.go +++ b/tools/pkg/tridentgrpc/grpc.go @@ -52,6 +52,7 @@ func NewTridentClientFromNetworkConnection(conn net.Conn) (*TridentClient, error return &TridentClient{ VersionServiceClient: tridentpbv1.NewVersionServiceClient(grpcConn), StreamingServiceClient: tridentpbv1.NewStreamingServiceClient(grpcConn), + InstallServiceClient: tridentpbv1preview.NewInstallServiceClient(grpcConn), grpcConn: grpcConn, }, nil } diff --git a/tools/pkg/virtdeploy/vm.go b/tools/pkg/virtdeploy/vm.go index 40203fa89..c21548f8e 100644 --- a/tools/pkg/virtdeploy/vm.go +++ b/tools/pkg/virtdeploy/vm.go @@ -200,6 +200,11 @@ func (vm *VirtDeployVM) createDomain( Target: &libvirtxml.DomainSerialTarget{Port: new(uint)}, Log: &libvirtxml.DomainChardevLog{File: fmt.Sprintf("/tmp/%s-serial0.log", vm.name), Append: "off"}, }}, + Graphics: []libvirtxml.DomainGraphic{{ + Spice: &libvirtxml.DomainGraphicSpice{ + AutoPort: "yes", + }, + }}, TPMs: vm.configureTpms(), }, } diff --git a/tools/storm/helpers/direct_streaming.go b/tools/storm/helpers/direct_streaming.go index 46b938f1c..34f5215eb 100644 --- a/tools/storm/helpers/direct_streaming.go +++ b/tools/storm/helpers/direct_streaming.go @@ -156,8 +156,8 @@ func (h *DirectStreamingHelper) createNetlaunchConfig(hostConfig string) (*netla netlaunchConfig.LogstreamFile = "/tmp/netlaunch.log" netlaunchConfig.TracestreamFile = "/tmp/netlaunch-trace.jsonl" netlaunchConfig.Rcp = &netlaunch.RcpConfiguration{ - GrpcMode: false, - UseStreamImage: true, + GrpcMode: netlaunch.GrpcModeDisabled, + ReplaceInstallWithStreamDisk: true, } return &netlaunchConfig, nil