diff --git a/cli/azd/cmd/extensions.go b/cli/azd/cmd/extensions.go index 2944b516788..d73dafa5230 100644 --- a/cli/azd/cmd/extensions.go +++ b/cli/azd/cmd/extensions.go @@ -176,6 +176,11 @@ func (a *extensionAction) Run(ctx context.Context) (*actions.ActionResult, error fmt.Sprintf("AZD_ACCESS_TOKEN=%s", jwtToken), ) + // Propagate trace context to the extension process + if traceEnv := tracing.Environ(ctx); len(traceEnv) > 0 { + allEnv = append(allEnv, traceEnv...) + } + options := &extensions.InvokeOptions{ Args: a.args, Env: allEnv, diff --git a/cli/azd/cmd/middleware/extensions.go b/cli/azd/cmd/middleware/extensions.go index ed21d5c4b68..40149f7613b 100644 --- a/cli/azd/cmd/middleware/extensions.go +++ b/cli/azd/cmd/middleware/extensions.go @@ -15,6 +15,7 @@ import ( "github.com/azure/azure-dev/cli/azd/cmd/actions" "github.com/azure/azure-dev/cli/azd/internal/grpcserver" + "github.com/azure/azure-dev/cli/azd/internal/tracing" "github.com/azure/azure-dev/cli/azd/pkg/extensions" "github.com/azure/azure-dev/cli/azd/pkg/input" "github.com/azure/azure-dev/cli/azd/pkg/ioc" @@ -132,6 +133,11 @@ func (m *ExtensionsMiddleware) Run(ctx context.Context, next NextFn) (*actions.A allEnv = append(allEnv, "FORCE_COLOR=1") } + // Propagate trace context to the extension process + if traceEnv := tracing.Environ(ctx); len(traceEnv) > 0 { + allEnv = append(allEnv, traceEnv...) + } + args := []string{"listen"} if debugEnabled, _ := m.options.Flags.GetBool("debug"); debugEnabled { args = append(args, "--debug") diff --git a/cli/azd/docs/extension-framework.md b/cli/azd/docs/extension-framework.md index 4842b7ab442..e20ef891ce4 100644 --- a/cli/azd/docs/extension-framework.md +++ b/cli/azd/docs/extension-framework.md @@ -334,6 +334,34 @@ The build process automatically creates binaries for multiple platforms and arch > [!NOTE] > Build times may vary depending on your hardware and extension complexity. +### Distributed Tracing + +`azd` uses OpenTelemetry and W3C Trace Context for distributed tracing. `azd` sets `TRACEPARENT` in the environment when it launches the extension process. + +Use `azdext.NewContext()` to hydrate the root context with trace context: + +```go +func main() { + ctx := azdext.NewContext() + rootCmd := cmd.NewRootCommand() + if err := rootCmd.ExecuteContext(ctx); err != nil { + // Handle error + } +} +``` + +To correlate Azure SDK calls with the parent trace, add the correlation policy to your client options: + +```go +import "github.com/azure/azure-dev/cli/azd/pkg/azsdk" + +clientOptions := &policy.ClientOptions{ + PerCallPolicies: []policy.Policy{ + azsdk.NewMsCorrelationPolicy(), + }, +} +``` + ### Developer Extension The easiest way to get started building extensions is to install the `azd` Developer extension. @@ -1895,7 +1923,7 @@ func (r *RustFrameworkProvider) Package(ctx context.Context, serviceConfig *azde // Register the framework provider func main() { - ctx := azdext.WithAccessToken(context.Background()) + ctx := azdext.WithAccessToken(azdext.NewContext()) azdClient, err := azdext.NewAzdClient() if err != nil { log.Fatal(err) @@ -2011,7 +2039,7 @@ func (v *VMServiceTargetProvider) Endpoints(ctx context.Context, serviceConfig * // Register the service target provider func main() { - ctx := azdext.WithAccessToken(context.Background()) + ctx := azdext.WithAccessToken(azdext.NewContext()) azdClient, err := azdext.NewAzdClient() if err != nil { log.Fatal(err) diff --git a/cli/azd/grpc/proto/errors.proto b/cli/azd/grpc/proto/errors.proto new file mode 100644 index 00000000000..7ba02f4eb43 --- /dev/null +++ b/cli/azd/grpc/proto/errors.proto @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +syntax = "proto3"; + +package azdext; + +option go_package = "github.com/azure/azure-dev/cli/azd/pkg/azdext"; + +// ErrorOrigin indicates where an error originated from. +// This helps with telemetry categorization and error handling strategies. +enum ErrorOrigin { + ERROR_ORIGIN_UNSPECIFIED = 0; // Default/unknown origin + ERROR_ORIGIN_LOCAL = 1; // Local errors: config, filesystem, auth state, validation, etc. + ERROR_ORIGIN_SERVICE = 2; // HTTP/gRPC upstream service errors + ERROR_ORIGIN_TOOL = 3; // Subprocess, plugin, or external tool errors +} + +// ServiceErrorDetail contains structured error information from an HTTP/gRPC service. +// Used when ErrorOrigin is ERROR_ORIGIN_SERVICE. +message ServiceErrorDetail { + string error_code = 1; // Error code from the service (e.g., "Conflict", "NotFound", "RateLimitExceeded") + int32 status_code = 2; // HTTP status code (e.g., 409, 404, 500) + string service_name = 3; // Service host/name for telemetry (e.g., "ai.azure.com", "management.azure.com") +} + +// ExtensionError is a unified error message that can represent errors from different sources. +// It provides structured error information for telemetry and error handling. +message ExtensionError { + string message = 2; // Human-readable error message + string details = 3; // Additional error details + ErrorOrigin origin = 4; // Where the error originated from + + // Source-specific structured details. Only one should be set based on origin. + oneof source { + ServiceErrorDetail service_error = 10; + // ToolErrorDetail tool_error = 11; // Reserved for future use + // LocalErrorDetail local_error = 12; // Reserved for future use + } +} diff --git a/cli/azd/grpc/proto/framework_service.proto b/cli/azd/grpc/proto/framework_service.proto index 15f1e610d4e..3f99103a243 100644 --- a/cli/azd/grpc/proto/framework_service.proto +++ b/cli/azd/grpc/proto/framework_service.proto @@ -8,6 +8,7 @@ option go_package = "github.com/azure/azure-dev/cli/azd/pkg/azdext"; import "models.proto"; import "service_target.proto"; +import "errors.proto"; service FrameworkService { // Bidirectional stream for framework service requests and responses @@ -17,7 +18,7 @@ service FrameworkService { // Envelope for all possible framework service messages (requests and responses) message FrameworkServiceMessage { string request_id = 1; - FrameworkServiceErrorMessage error = 99; + ExtensionError error = 99; oneof message_type { RegisterFrameworkServiceRequest register_framework_service_request = 2; RegisterFrameworkServiceResponse register_framework_service_response = 3; @@ -37,12 +38,6 @@ message FrameworkServiceMessage { } } -// Error message for framework service operations -message FrameworkServiceErrorMessage { - string message = 1; - string details = 2; -} - // Request to register a framework service provider message RegisterFrameworkServiceRequest { string language = 1; // unique identifier for the language/framework (e.g., "rust", "go", "php") diff --git a/cli/azd/grpc/proto/service_target.proto b/cli/azd/grpc/proto/service_target.proto index 794a59ee213..e452b81af1a 100644 --- a/cli/azd/grpc/proto/service_target.proto +++ b/cli/azd/grpc/proto/service_target.proto @@ -8,6 +8,7 @@ option go_package = "github.com/azure/azure-dev/cli/azd/pkg/azdext"; import "include/google/protobuf/struct.proto"; import "models.proto"; +import "errors.proto"; service ServiceTargetService { // Bidirectional stream for service target requests and responses @@ -17,7 +18,7 @@ service ServiceTargetService { // Envelope for all possible service target messages (requests and responses) message ServiceTargetMessage { string request_id = 1; - ServiceTargetErrorMessage error = 99; + ExtensionError error = 99; oneof message_type { RegisterServiceTargetRequest register_service_target_request = 2; RegisterServiceTargetResponse register_service_target_response = 3; @@ -80,11 +81,6 @@ message RegisterServiceTargetResponse { // Add fields as needed (empty for now) } -message ServiceTargetErrorMessage { - string message = 2; - string details = 3; -} - // GetTargetResource request and response message GetTargetResourceRequest { string subscription_id = 1; diff --git a/cli/azd/internal/cmd/errors.go b/cli/azd/internal/cmd/errors.go index 629f2aa62c9..665f8ed16d7 100644 --- a/cli/azd/internal/cmd/errors.go +++ b/cli/azd/internal/cmd/errors.go @@ -17,6 +17,7 @@ import ( "github.com/azure/azure-dev/cli/azd/internal/tracing/fields" "github.com/azure/azure-dev/cli/azd/pkg/auth" "github.com/azure/azure-dev/cli/azd/pkg/azapi" + "github.com/azure/azure-dev/cli/azd/pkg/azdext" "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/extensions" "go.opentelemetry.io/otel/attribute" @@ -33,6 +34,7 @@ func MapError(err error, span tracing.Span) { var toolExecErr *exec.ExitError var authFailedErr *auth.AuthFailedError var extensionRunErr *extensions.ExtensionRunError + var extServiceErr *azdext.ServiceError if errors.As(err, &respErr) { serviceName := "other" statusCode := -1 @@ -84,6 +86,22 @@ func MapError(err error, span tracing.Span) { errCode = "service.arm.deployment.failed" } else if errors.As(err, &extensionRunErr) { errCode = "ext.run.failed" + } else if errors.As(err, &extServiceErr) { + // Handle structured service errors from extensions + if extServiceErr.StatusCode > 0 && extServiceErr.ServiceName != "" { + serviceName, hostDomain := mapService(extServiceErr.ServiceName) + errDetails = append(errDetails, + fields.ServiceName.String(serviceName), + fields.ServiceHost.String(hostDomain), + fields.ServiceStatusCode.Int(extServiceErr.StatusCode), + ) + if extServiceErr.ErrorCode != "" { + errDetails = append(errDetails, fields.ServiceErrorCode.String(extServiceErr.ErrorCode)) + } + errCode = fmt.Sprintf("ext.service.%s.%d", serviceName, extServiceErr.StatusCode) + } else { + errCode = "ext.service.failed" + } } else if errors.As(err, &toolExecErr) { toolName := "other" cmdName := cmdAsName(toolExecErr.Cmd) diff --git a/cli/azd/internal/cmd/errors_test.go b/cli/azd/internal/cmd/errors_test.go index f4706ff3193..3162652c14d 100644 --- a/cli/azd/internal/cmd/errors_test.go +++ b/cli/azd/internal/cmd/errors_test.go @@ -13,6 +13,7 @@ import ( "github.com/azure/azure-dev/cli/azd/internal/tracing/fields" "github.com/azure/azure-dev/cli/azd/pkg/auth" "github.com/azure/azure-dev/cli/azd/pkg/azapi" + "github.com/azure/azure-dev/cli/azd/pkg/azdext" "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/test/mocks/mocktracing" "github.com/stretchr/testify/require" @@ -148,6 +149,23 @@ func Test_MapError(t *testing.T) { fields.ErrorKey(fields.ServiceCorrelationId.Key).String("12345"), }, }, + { + name: "WithExtServiceError", + err: &azdext.ServiceError{ + Message: "Rate limit exceeded", + Details: "Too many requests", + ErrorCode: "RateLimitExceeded", + StatusCode: 429, + ServiceName: "openai.azure.com", + }, + wantErrReason: "ext.service.openai.429", + wantErrDetails: []attribute.KeyValue{ + fields.ErrorKey(fields.ServiceName.Key).String("openai"), + fields.ErrorKey(fields.ServiceHost.Key).String("openai.azure.com"), + fields.ErrorKey(fields.ServiceStatusCode.Key).Int(429), + fields.ErrorKey(fields.ServiceErrorCode.Key).String("RateLimitExceeded"), + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/cli/azd/internal/tracing/fields/domains.go b/cli/azd/internal/tracing/fields/domains.go index c9ef873b5e9..c0d7228544d 100644 --- a/cli/azd/internal/tracing/fields/domains.go +++ b/cli/azd/internal/tracing/fields/domains.go @@ -29,6 +29,9 @@ var Domains = []Domain{ {"azurefd.net", "frontdoor"}, {"scm.azurewebsites.net", "kudu"}, {"azurewebsites.net", "websites"}, + {"services.ai.azure.com", "ai"}, + {"cognitiveservices.azure.com", "cognitiveservices"}, + {"openai.azure.com", "openai"}, {"blob.core.windows.net", "blob"}, {"cloudapp.azure.com", "vm"}, {"cloudapp.net", "vm"}, diff --git a/cli/azd/pkg/azdext/azd_client.go b/cli/azd/pkg/azdext/azd_client.go index e68f77c208c..91aa4f4d8dc 100644 --- a/cli/azd/pkg/azdext/azd_client.go +++ b/cli/azd/pkg/azdext/azd_client.go @@ -123,7 +123,7 @@ func (c *AzdClient) Deployment() DeploymentServiceClient { return c.deploymentClient } -// Deployment returns the deployment service client. +// Events returns the event service client. func (c *AzdClient) Events() EventServiceClient { if c.eventsClient == nil { c.eventsClient = NewEventServiceClient(c.connection) diff --git a/cli/azd/pkg/azdext/context.go b/cli/azd/pkg/azdext/context.go new file mode 100644 index 00000000000..47e4b1915fe --- /dev/null +++ b/cli/azd/pkg/azdext/context.go @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azdext + +import ( + "context" + "os" + + "go.opentelemetry.io/otel/propagation" +) + +const ( + TraceparentKey = "traceparent" + TracestateKey = "tracestate" + + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/context/env-carriers.md + + TraceparentEnv = "TRACEPARENT" + TracestateEnv = "TRACESTATE" +) + +// NewContext initializes a new context with tracing information extracted from environment variables. +func NewContext() context.Context { + ctx := context.Background() + parent := os.Getenv(TraceparentEnv) + state := os.Getenv(TracestateEnv) + + if parent != "" { + tc := propagation.TraceContext{} + return tc.Extract(ctx, propagation.MapCarrier{ + TraceparentKey: parent, + TracestateKey: state, + }) + } + + return ctx +} diff --git a/cli/azd/pkg/azdext/context_test.go b/cli/azd/pkg/azdext/context_test.go new file mode 100644 index 00000000000..93c0762283e --- /dev/null +++ b/cli/azd/pkg/azdext/context_test.go @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azdext + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace" +) + +func TestNewContext_FromEnvironment(t *testing.T) { + traceparent := "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" + tracestate := "rojo=00f067aa0ba902b7" + + t.Setenv(TraceparentEnv, traceparent) + t.Setenv(TracestateEnv, tracestate) + + ctx := NewContext() + sc := trace.SpanContextFromContext(ctx) + + require.True(t, sc.IsValid(), "span context should be extracted from environment") + traceID, err := trace.TraceIDFromHex("4bf92f3577b34da6a3ce929d0e0e4736") + require.NoError(t, err) + spanID, err := trace.SpanIDFromHex("00f067aa0ba902b7") + require.NoError(t, err) + require.Equal(t, traceID, sc.TraceID()) + require.Equal(t, spanID, sc.SpanID()) + require.Equal(t, tracestate, sc.TraceState().String()) +} + +func TestNewContext_NoEnvironment(t *testing.T) { + t.Setenv(TraceparentEnv, "") + t.Setenv(TracestateEnv, "") + + ctx := NewContext() + sc := trace.SpanContextFromContext(ctx) + + require.False(t, sc.IsValid(), "span context should be absent when no environment is set") +} diff --git a/cli/azd/pkg/azdext/errors.pb.go b/cli/azd/pkg/azdext/errors.pb.go new file mode 100644 index 00000000000..ce3e177a5ab --- /dev/null +++ b/cli/azd/pkg/azdext/errors.pb.go @@ -0,0 +1,316 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.10 +// protoc v6.32.1 +// source: errors.proto + +package azdext + +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) +) + +// ErrorOrigin indicates where an error originated from. +// This helps with telemetry categorization and error handling strategies. +type ErrorOrigin int32 + +const ( + ErrorOrigin_ERROR_ORIGIN_UNSPECIFIED ErrorOrigin = 0 // Default/unknown origin + ErrorOrigin_ERROR_ORIGIN_LOCAL ErrorOrigin = 1 // Local errors: config, filesystem, auth state, validation, etc. + ErrorOrigin_ERROR_ORIGIN_SERVICE ErrorOrigin = 2 // HTTP/gRPC upstream service errors + ErrorOrigin_ERROR_ORIGIN_TOOL ErrorOrigin = 3 // Subprocess, plugin, or external tool errors +) + +// Enum value maps for ErrorOrigin. +var ( + ErrorOrigin_name = map[int32]string{ + 0: "ERROR_ORIGIN_UNSPECIFIED", + 1: "ERROR_ORIGIN_LOCAL", + 2: "ERROR_ORIGIN_SERVICE", + 3: "ERROR_ORIGIN_TOOL", + } + ErrorOrigin_value = map[string]int32{ + "ERROR_ORIGIN_UNSPECIFIED": 0, + "ERROR_ORIGIN_LOCAL": 1, + "ERROR_ORIGIN_SERVICE": 2, + "ERROR_ORIGIN_TOOL": 3, + } +) + +func (x ErrorOrigin) Enum() *ErrorOrigin { + p := new(ErrorOrigin) + *p = x + return p +} + +func (x ErrorOrigin) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ErrorOrigin) Descriptor() protoreflect.EnumDescriptor { + return file_errors_proto_enumTypes[0].Descriptor() +} + +func (ErrorOrigin) Type() protoreflect.EnumType { + return &file_errors_proto_enumTypes[0] +} + +func (x ErrorOrigin) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ErrorOrigin.Descriptor instead. +func (ErrorOrigin) EnumDescriptor() ([]byte, []int) { + return file_errors_proto_rawDescGZIP(), []int{0} +} + +// ServiceErrorDetail contains structured error information from an HTTP/gRPC service. +// Used when ErrorOrigin is ERROR_ORIGIN_SERVICE. +type ServiceErrorDetail struct { + state protoimpl.MessageState `protogen:"open.v1"` + ErrorCode string `protobuf:"bytes,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` // Error code from the service (e.g., "Conflict", "NotFound", "RateLimitExceeded") + StatusCode int32 `protobuf:"varint,2,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` // HTTP status code (e.g., 409, 404, 500) + ServiceName string `protobuf:"bytes,3,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Service host/name for telemetry (e.g., "ai.azure.com", "management.azure.com") + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ServiceErrorDetail) Reset() { + *x = ServiceErrorDetail{} + mi := &file_errors_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ServiceErrorDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceErrorDetail) ProtoMessage() {} + +func (x *ServiceErrorDetail) ProtoReflect() protoreflect.Message { + mi := &file_errors_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 ServiceErrorDetail.ProtoReflect.Descriptor instead. +func (*ServiceErrorDetail) Descriptor() ([]byte, []int) { + return file_errors_proto_rawDescGZIP(), []int{0} +} + +func (x *ServiceErrorDetail) GetErrorCode() string { + if x != nil { + return x.ErrorCode + } + return "" +} + +func (x *ServiceErrorDetail) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *ServiceErrorDetail) GetServiceName() string { + if x != nil { + return x.ServiceName + } + return "" +} + +// ExtensionError is a unified error message that can represent errors from different sources. +// It provides structured error information for telemetry and error handling. +type ExtensionError struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Human-readable error message + Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` // Additional error details + Origin ErrorOrigin `protobuf:"varint,4,opt,name=origin,proto3,enum=azdext.ErrorOrigin" json:"origin,omitempty"` // Where the error originated from + // Source-specific structured details. Only one should be set based on origin. + // + // Types that are valid to be assigned to Source: + // + // *ExtensionError_ServiceError + Source isExtensionError_Source `protobuf_oneof:"source"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExtensionError) Reset() { + *x = ExtensionError{} + mi := &file_errors_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExtensionError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionError) ProtoMessage() {} + +func (x *ExtensionError) ProtoReflect() protoreflect.Message { + mi := &file_errors_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 ExtensionError.ProtoReflect.Descriptor instead. +func (*ExtensionError) Descriptor() ([]byte, []int) { + return file_errors_proto_rawDescGZIP(), []int{1} +} + +func (x *ExtensionError) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *ExtensionError) GetDetails() string { + if x != nil { + return x.Details + } + return "" +} + +func (x *ExtensionError) GetOrigin() ErrorOrigin { + if x != nil { + return x.Origin + } + return ErrorOrigin_ERROR_ORIGIN_UNSPECIFIED +} + +func (x *ExtensionError) GetSource() isExtensionError_Source { + if x != nil { + return x.Source + } + return nil +} + +func (x *ExtensionError) GetServiceError() *ServiceErrorDetail { + if x != nil { + if x, ok := x.Source.(*ExtensionError_ServiceError); ok { + return x.ServiceError + } + } + return nil +} + +type isExtensionError_Source interface { + isExtensionError_Source() +} + +type ExtensionError_ServiceError struct { + ServiceError *ServiceErrorDetail `protobuf:"bytes,10,opt,name=service_error,json=serviceError,proto3,oneof"` +} + +func (*ExtensionError_ServiceError) isExtensionError_Source() {} + +var File_errors_proto protoreflect.FileDescriptor + +const file_errors_proto_rawDesc = "" + + "\n" + + "\ferrors.proto\x12\x06azdext\"w\n" + + "\x12ServiceErrorDetail\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\tR\terrorCode\x12\x1f\n" + + "\vstatus_code\x18\x02 \x01(\x05R\n" + + "statusCode\x12!\n" + + "\fservice_name\x18\x03 \x01(\tR\vserviceName\"\xbe\x01\n" + + "\x0eExtensionError\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12\x18\n" + + "\adetails\x18\x03 \x01(\tR\adetails\x12+\n" + + "\x06origin\x18\x04 \x01(\x0e2\x13.azdext.ErrorOriginR\x06origin\x12A\n" + + "\rservice_error\x18\n" + + " \x01(\v2\x1a.azdext.ServiceErrorDetailH\x00R\fserviceErrorB\b\n" + + "\x06source*t\n" + + "\vErrorOrigin\x12\x1c\n" + + "\x18ERROR_ORIGIN_UNSPECIFIED\x10\x00\x12\x16\n" + + "\x12ERROR_ORIGIN_LOCAL\x10\x01\x12\x18\n" + + "\x14ERROR_ORIGIN_SERVICE\x10\x02\x12\x15\n" + + "\x11ERROR_ORIGIN_TOOL\x10\x03B/Z-github.com/azure/azure-dev/cli/azd/pkg/azdextb\x06proto3" + +var ( + file_errors_proto_rawDescOnce sync.Once + file_errors_proto_rawDescData []byte +) + +func file_errors_proto_rawDescGZIP() []byte { + file_errors_proto_rawDescOnce.Do(func() { + file_errors_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_errors_proto_rawDesc), len(file_errors_proto_rawDesc))) + }) + return file_errors_proto_rawDescData +} + +var file_errors_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_errors_proto_goTypes = []any{ + (ErrorOrigin)(0), // 0: azdext.ErrorOrigin + (*ServiceErrorDetail)(nil), // 1: azdext.ServiceErrorDetail + (*ExtensionError)(nil), // 2: azdext.ExtensionError +} +var file_errors_proto_depIdxs = []int32{ + 0, // 0: azdext.ExtensionError.origin:type_name -> azdext.ErrorOrigin + 1, // 1: azdext.ExtensionError.service_error:type_name -> azdext.ServiceErrorDetail + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_errors_proto_init() } +func file_errors_proto_init() { + if File_errors_proto != nil { + return + } + file_errors_proto_msgTypes[1].OneofWrappers = []any{ + (*ExtensionError_ServiceError)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_errors_proto_rawDesc), len(file_errors_proto_rawDesc)), + NumEnums: 1, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_errors_proto_goTypes, + DependencyIndexes: file_errors_proto_depIdxs, + EnumInfos: file_errors_proto_enumTypes, + MessageInfos: file_errors_proto_msgTypes, + }.Build() + File_errors_proto = out.File + file_errors_proto_goTypes = nil + file_errors_proto_depIdxs = nil +} diff --git a/cli/azd/pkg/azdext/extension_error.go b/cli/azd/pkg/azdext/extension_error.go new file mode 100644 index 00000000000..28b45eef2fa --- /dev/null +++ b/cli/azd/pkg/azdext/extension_error.go @@ -0,0 +1,109 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azdext + +import ( + "errors" + "fmt" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore" +) + +// ServiceError represents an HTTP/gRPC service error from an extension. +// It preserves structured error information for telemetry and error handling. +type ServiceError struct { + // Message is the human-readable error message + Message string + // Details contains additional error details + Details string + // ErrorCode is the error code from the service (e.g., "Conflict", "NotFound") + ErrorCode string + // StatusCode is the HTTP status code (e.g., 409, 404, 500) + StatusCode int + // ServiceName is the service host/name for telemetry (e.g., "ai.azure.com") + ServiceName string +} + +// Error implements the error interface +func (e *ServiceError) Error() string { + if e.Details != "" { + return fmt.Sprintf("%s: %s", e.Message, e.Details) + } + return e.Message +} + +// WrapError wraps a Go error into an ExtensionError for transmission over gRPC. +// It detects the error type and populates the appropriate source details. +func WrapError(err error) *ExtensionError { + if err == nil { + return nil + } + + extErr := &ExtensionError{ + Message: err.Error(), + Origin: ErrorOrigin_ERROR_ORIGIN_UNSPECIFIED, + } + + // Check for extension error types (already structured) + var extServiceErr *ServiceError + if errors.As(err, &extServiceErr) { + extErr.Message = extServiceErr.Message + extErr.Details = extServiceErr.Details + extErr.Origin = ErrorOrigin_ERROR_ORIGIN_SERVICE + extErr.Source = &ExtensionError_ServiceError{ + ServiceError: &ServiceErrorDetail{ + ErrorCode: extServiceErr.ErrorCode, + //nolint:gosec // G115: HTTP status codes are well within int32 range + StatusCode: int32(extServiceErr.StatusCode), + ServiceName: extServiceErr.ServiceName, + }, + } + return extErr + } + + // Try to detect Azure SDK errors + var respErr *azcore.ResponseError + if errors.As(err, &respErr) { + extErr.Origin = ErrorOrigin_ERROR_ORIGIN_SERVICE + serviceName := "" + if respErr.RawResponse != nil && respErr.RawResponse.Request != nil { + serviceName = respErr.RawResponse.Request.Host + } + extErr.Source = &ExtensionError_ServiceError{ + ServiceError: &ServiceErrorDetail{ + ErrorCode: respErr.ErrorCode, + //nolint:gosec // G115: HTTP status codes are well within int32 range + StatusCode: int32(respErr.StatusCode), + ServiceName: serviceName, + }, + } + } + + return extErr +} + +// UnwrapError converts an ExtensionError back to a typed Go error. +// It returns the appropriate error type based on the origin field. +func UnwrapError(msg *ExtensionError) error { + if msg == nil || msg.GetMessage() == "" { + return nil + } + + // Check for service error details + if svcErr := msg.GetServiceError(); svcErr != nil { + return &ServiceError{ + Message: msg.GetMessage(), + Details: msg.GetDetails(), + ErrorCode: svcErr.GetErrorCode(), + StatusCode: int(svcErr.GetStatusCode()), + ServiceName: svcErr.GetServiceName(), + } + } + + // Return a generic service error with just the message/details + return &ServiceError{ + Message: msg.GetMessage(), + Details: msg.GetDetails(), + } +} diff --git a/cli/azd/pkg/azdext/extension_error_test.go b/cli/azd/pkg/azdext/extension_error_test.go new file mode 100644 index 00000000000..20881c1c551 --- /dev/null +++ b/cli/azd/pkg/azdext/extension_error_test.go @@ -0,0 +1,109 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azdext + +import ( + "errors" + "testing" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestExtensionError_RoundTrip(t *testing.T) { + tests := []struct { + name string + inputErr error + wantNil bool + verify func(t *testing.T, protoErr *ExtensionError, goErr error) + }{ + { + name: "NilError", + inputErr: nil, + wantNil: true, + }, + { + name: "SimpleError", + inputErr: errors.New("simple error"), + verify: func(t *testing.T, protoErr *ExtensionError, goErr error) { + assert.Equal(t, "simple error", protoErr.GetMessage()) + assert.Equal(t, ErrorOrigin_ERROR_ORIGIN_UNSPECIFIED, protoErr.GetOrigin()) + assert.Nil(t, protoErr.GetSource()) + + // Unspecified origin falls back to ExtServiceError + var svcErr *ServiceError + require.ErrorAs(t, goErr, &svcErr) + assert.Equal(t, "simple error", svcErr.Message) + }, + }, + { + name: "ExtServiceError", + inputErr: &ServiceError{ + Message: "Rate limit exceeded", + Details: "Too many requests", + ErrorCode: "RateLimitExceeded", + StatusCode: 429, + ServiceName: "openai.azure.com", + }, + verify: func(t *testing.T, protoErr *ExtensionError, goErr error) { + assert.Equal(t, "Rate limit exceeded", protoErr.GetMessage()) + assert.Equal(t, "Too many requests", protoErr.GetDetails()) + assert.Equal(t, ErrorOrigin_ERROR_ORIGIN_SERVICE, protoErr.GetOrigin()) + + svcDetail := protoErr.GetServiceError() + require.NotNil(t, svcDetail) + assert.Equal(t, "RateLimitExceeded", svcDetail.GetErrorCode()) + assert.Equal(t, int32(429), svcDetail.GetStatusCode()) + assert.Equal(t, "openai.azure.com", svcDetail.GetServiceName()) + + var svcErr *ServiceError + require.ErrorAs(t, goErr, &svcErr) + assert.Equal(t, "Rate limit exceeded", svcErr.Message) + assert.Equal(t, "Too many requests", svcErr.Details) + assert.Equal(t, "RateLimitExceeded", svcErr.ErrorCode) + assert.Equal(t, 429, svcErr.StatusCode) + assert.Equal(t, "openai.azure.com", svcErr.ServiceName) + }, + }, + { + name: "AzCoreResponseError", + inputErr: &azcore.ResponseError{ + ErrorCode: "ResourceNotFound", + StatusCode: 404, + }, + verify: func(t *testing.T, protoErr *ExtensionError, goErr error) { + assert.Equal(t, ErrorOrigin_ERROR_ORIGIN_SERVICE, protoErr.GetOrigin()) + + svcDetail := protoErr.GetServiceError() + require.NotNil(t, svcDetail) + assert.Equal(t, "ResourceNotFound", svcDetail.GetErrorCode()) + assert.Equal(t, int32(404), svcDetail.GetStatusCode()) + + var svcErr *ServiceError + require.ErrorAs(t, goErr, &svcErr) + assert.Equal(t, "ResourceNotFound", svcErr.ErrorCode) + assert.Equal(t, 404, svcErr.StatusCode) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + protoErr := WrapError(tt.inputErr) + + if tt.wantNil { + assert.Nil(t, protoErr) + assert.Nil(t, UnwrapError(nil)) + return + } + + require.NotNil(t, protoErr) + goErr := UnwrapError(protoErr) + require.NotNil(t, goErr) + + tt.verify(t, protoErr, goErr) + }) + } +} diff --git a/cli/azd/pkg/azdext/framework_service.pb.go b/cli/azd/pkg/azdext/framework_service.pb.go index 24b9c048c3c..dc43f6e3a4c 100644 --- a/cli/azd/pkg/azdext/framework_service.pb.go +++ b/cli/azd/pkg/azdext/framework_service.pb.go @@ -26,9 +26,9 @@ const ( // Envelope for all possible framework service messages (requests and responses) type FrameworkServiceMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - Error *FrameworkServiceErrorMessage `protobuf:"bytes,99,opt,name=error,proto3" json:"error,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + Error *ExtensionError `protobuf:"bytes,99,opt,name=error,proto3" json:"error,omitempty"` // Types that are valid to be assigned to MessageType: // // *FrameworkServiceMessage_RegisterFrameworkServiceRequest @@ -88,7 +88,7 @@ func (x *FrameworkServiceMessage) GetRequestId() string { return "" } -func (x *FrameworkServiceMessage) GetError() *FrameworkServiceErrorMessage { +func (x *FrameworkServiceMessage) GetError() *ExtensionError { if x != nil { return x.Error } @@ -335,59 +335,6 @@ func (*FrameworkServiceMessage_PackageResponse) isFrameworkServiceMessage_Messag func (*FrameworkServiceMessage_ProgressMessage) isFrameworkServiceMessage_MessageType() {} -// Error message for framework service operations -type FrameworkServiceErrorMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *FrameworkServiceErrorMessage) Reset() { - *x = FrameworkServiceErrorMessage{} - mi := &file_framework_service_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *FrameworkServiceErrorMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FrameworkServiceErrorMessage) ProtoMessage() {} - -func (x *FrameworkServiceErrorMessage) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_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 FrameworkServiceErrorMessage.ProtoReflect.Descriptor instead. -func (*FrameworkServiceErrorMessage) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{1} -} - -func (x *FrameworkServiceErrorMessage) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *FrameworkServiceErrorMessage) GetDetails() string { - if x != nil { - return x.Details - } - return "" -} - // Request to register a framework service provider type RegisterFrameworkServiceRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -398,7 +345,7 @@ type RegisterFrameworkServiceRequest struct { func (x *RegisterFrameworkServiceRequest) Reset() { *x = RegisterFrameworkServiceRequest{} - mi := &file_framework_service_proto_msgTypes[2] + mi := &file_framework_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -410,7 +357,7 @@ func (x *RegisterFrameworkServiceRequest) String() string { func (*RegisterFrameworkServiceRequest) ProtoMessage() {} func (x *RegisterFrameworkServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[2] + mi := &file_framework_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -423,7 +370,7 @@ func (x *RegisterFrameworkServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterFrameworkServiceRequest.ProtoReflect.Descriptor instead. func (*RegisterFrameworkServiceRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{2} + return file_framework_service_proto_rawDescGZIP(), []int{1} } func (x *RegisterFrameworkServiceRequest) GetLanguage() string { @@ -441,7 +388,7 @@ type RegisterFrameworkServiceResponse struct { func (x *RegisterFrameworkServiceResponse) Reset() { *x = RegisterFrameworkServiceResponse{} - mi := &file_framework_service_proto_msgTypes[3] + mi := &file_framework_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -453,7 +400,7 @@ func (x *RegisterFrameworkServiceResponse) String() string { func (*RegisterFrameworkServiceResponse) ProtoMessage() {} func (x *RegisterFrameworkServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[3] + mi := &file_framework_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -466,7 +413,7 @@ func (x *RegisterFrameworkServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterFrameworkServiceResponse.ProtoReflect.Descriptor instead. func (*RegisterFrameworkServiceResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{3} + return file_framework_service_proto_rawDescGZIP(), []int{2} } // Initialize request and response @@ -479,7 +426,7 @@ type FrameworkServiceInitializeRequest struct { func (x *FrameworkServiceInitializeRequest) Reset() { *x = FrameworkServiceInitializeRequest{} - mi := &file_framework_service_proto_msgTypes[4] + mi := &file_framework_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -491,7 +438,7 @@ func (x *FrameworkServiceInitializeRequest) String() string { func (*FrameworkServiceInitializeRequest) ProtoMessage() {} func (x *FrameworkServiceInitializeRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[4] + mi := &file_framework_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -504,7 +451,7 @@ func (x *FrameworkServiceInitializeRequest) ProtoReflect() protoreflect.Message // Deprecated: Use FrameworkServiceInitializeRequest.ProtoReflect.Descriptor instead. func (*FrameworkServiceInitializeRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{4} + return file_framework_service_proto_rawDescGZIP(), []int{3} } func (x *FrameworkServiceInitializeRequest) GetServiceConfig() *ServiceConfig { @@ -522,7 +469,7 @@ type FrameworkServiceInitializeResponse struct { func (x *FrameworkServiceInitializeResponse) Reset() { *x = FrameworkServiceInitializeResponse{} - mi := &file_framework_service_proto_msgTypes[5] + mi := &file_framework_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -534,7 +481,7 @@ func (x *FrameworkServiceInitializeResponse) String() string { func (*FrameworkServiceInitializeResponse) ProtoMessage() {} func (x *FrameworkServiceInitializeResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[5] + mi := &file_framework_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -547,7 +494,7 @@ func (x *FrameworkServiceInitializeResponse) ProtoReflect() protoreflect.Message // Deprecated: Use FrameworkServiceInitializeResponse.ProtoReflect.Descriptor instead. func (*FrameworkServiceInitializeResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{5} + return file_framework_service_proto_rawDescGZIP(), []int{4} } // Required external tools request and response @@ -560,7 +507,7 @@ type FrameworkServiceRequiredExternalToolsRequest struct { func (x *FrameworkServiceRequiredExternalToolsRequest) Reset() { *x = FrameworkServiceRequiredExternalToolsRequest{} - mi := &file_framework_service_proto_msgTypes[6] + mi := &file_framework_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -572,7 +519,7 @@ func (x *FrameworkServiceRequiredExternalToolsRequest) String() string { func (*FrameworkServiceRequiredExternalToolsRequest) ProtoMessage() {} func (x *FrameworkServiceRequiredExternalToolsRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[6] + mi := &file_framework_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -585,7 +532,7 @@ func (x *FrameworkServiceRequiredExternalToolsRequest) ProtoReflect() protorefle // Deprecated: Use FrameworkServiceRequiredExternalToolsRequest.ProtoReflect.Descriptor instead. func (*FrameworkServiceRequiredExternalToolsRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{6} + return file_framework_service_proto_rawDescGZIP(), []int{5} } func (x *FrameworkServiceRequiredExternalToolsRequest) GetServiceConfig() *ServiceConfig { @@ -604,7 +551,7 @@ type FrameworkServiceRequiredExternalToolsResponse struct { func (x *FrameworkServiceRequiredExternalToolsResponse) Reset() { *x = FrameworkServiceRequiredExternalToolsResponse{} - mi := &file_framework_service_proto_msgTypes[7] + mi := &file_framework_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -616,7 +563,7 @@ func (x *FrameworkServiceRequiredExternalToolsResponse) String() string { func (*FrameworkServiceRequiredExternalToolsResponse) ProtoMessage() {} func (x *FrameworkServiceRequiredExternalToolsResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[7] + mi := &file_framework_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -629,7 +576,7 @@ func (x *FrameworkServiceRequiredExternalToolsResponse) ProtoReflect() protorefl // Deprecated: Use FrameworkServiceRequiredExternalToolsResponse.ProtoReflect.Descriptor instead. func (*FrameworkServiceRequiredExternalToolsResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{7} + return file_framework_service_proto_rawDescGZIP(), []int{6} } func (x *FrameworkServiceRequiredExternalToolsResponse) GetTools() []*ExternalTool { @@ -650,7 +597,7 @@ type ExternalTool struct { func (x *ExternalTool) Reset() { *x = ExternalTool{} - mi := &file_framework_service_proto_msgTypes[8] + mi := &file_framework_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -662,7 +609,7 @@ func (x *ExternalTool) String() string { func (*ExternalTool) ProtoMessage() {} func (x *ExternalTool) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[8] + mi := &file_framework_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -675,7 +622,7 @@ func (x *ExternalTool) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalTool.ProtoReflect.Descriptor instead. func (*ExternalTool) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{8} + return file_framework_service_proto_rawDescGZIP(), []int{7} } func (x *ExternalTool) GetName() string { @@ -701,7 +648,7 @@ type FrameworkServiceRequirementsRequest struct { func (x *FrameworkServiceRequirementsRequest) Reset() { *x = FrameworkServiceRequirementsRequest{} - mi := &file_framework_service_proto_msgTypes[9] + mi := &file_framework_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -713,7 +660,7 @@ func (x *FrameworkServiceRequirementsRequest) String() string { func (*FrameworkServiceRequirementsRequest) ProtoMessage() {} func (x *FrameworkServiceRequirementsRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[9] + mi := &file_framework_service_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -726,7 +673,7 @@ func (x *FrameworkServiceRequirementsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use FrameworkServiceRequirementsRequest.ProtoReflect.Descriptor instead. func (*FrameworkServiceRequirementsRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{9} + return file_framework_service_proto_rawDescGZIP(), []int{8} } type FrameworkServiceRequirementsResponse struct { @@ -738,7 +685,7 @@ type FrameworkServiceRequirementsResponse struct { func (x *FrameworkServiceRequirementsResponse) Reset() { *x = FrameworkServiceRequirementsResponse{} - mi := &file_framework_service_proto_msgTypes[10] + mi := &file_framework_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -750,7 +697,7 @@ func (x *FrameworkServiceRequirementsResponse) String() string { func (*FrameworkServiceRequirementsResponse) ProtoMessage() {} func (x *FrameworkServiceRequirementsResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[10] + mi := &file_framework_service_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -763,7 +710,7 @@ func (x *FrameworkServiceRequirementsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use FrameworkServiceRequirementsResponse.ProtoReflect.Descriptor instead. func (*FrameworkServiceRequirementsResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{10} + return file_framework_service_proto_rawDescGZIP(), []int{9} } func (x *FrameworkServiceRequirementsResponse) GetRequirements() *FrameworkRequirements { @@ -783,7 +730,7 @@ type FrameworkRequirements struct { func (x *FrameworkRequirements) Reset() { *x = FrameworkRequirements{} - mi := &file_framework_service_proto_msgTypes[11] + mi := &file_framework_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -795,7 +742,7 @@ func (x *FrameworkRequirements) String() string { func (*FrameworkRequirements) ProtoMessage() {} func (x *FrameworkRequirements) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[11] + mi := &file_framework_service_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -808,7 +755,7 @@ func (x *FrameworkRequirements) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkRequirements.ProtoReflect.Descriptor instead. func (*FrameworkRequirements) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{11} + return file_framework_service_proto_rawDescGZIP(), []int{10} } func (x *FrameworkRequirements) GetPackage() *FrameworkPackageRequirements { @@ -828,7 +775,7 @@ type FrameworkPackageRequirements struct { func (x *FrameworkPackageRequirements) Reset() { *x = FrameworkPackageRequirements{} - mi := &file_framework_service_proto_msgTypes[12] + mi := &file_framework_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -840,7 +787,7 @@ func (x *FrameworkPackageRequirements) String() string { func (*FrameworkPackageRequirements) ProtoMessage() {} func (x *FrameworkPackageRequirements) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[12] + mi := &file_framework_service_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -853,7 +800,7 @@ func (x *FrameworkPackageRequirements) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkPackageRequirements.ProtoReflect.Descriptor instead. func (*FrameworkPackageRequirements) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{12} + return file_framework_service_proto_rawDescGZIP(), []int{11} } func (x *FrameworkPackageRequirements) GetRequireRestore() bool { @@ -881,7 +828,7 @@ type FrameworkServiceRestoreRequest struct { func (x *FrameworkServiceRestoreRequest) Reset() { *x = FrameworkServiceRestoreRequest{} - mi := &file_framework_service_proto_msgTypes[13] + mi := &file_framework_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -893,7 +840,7 @@ func (x *FrameworkServiceRestoreRequest) String() string { func (*FrameworkServiceRestoreRequest) ProtoMessage() {} func (x *FrameworkServiceRestoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[13] + mi := &file_framework_service_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -906,7 +853,7 @@ func (x *FrameworkServiceRestoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServiceRestoreRequest.ProtoReflect.Descriptor instead. func (*FrameworkServiceRestoreRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{13} + return file_framework_service_proto_rawDescGZIP(), []int{12} } func (x *FrameworkServiceRestoreRequest) GetServiceConfig() *ServiceConfig { @@ -932,7 +879,7 @@ type FrameworkServiceRestoreResponse struct { func (x *FrameworkServiceRestoreResponse) Reset() { *x = FrameworkServiceRestoreResponse{} - mi := &file_framework_service_proto_msgTypes[14] + mi := &file_framework_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -944,7 +891,7 @@ func (x *FrameworkServiceRestoreResponse) String() string { func (*FrameworkServiceRestoreResponse) ProtoMessage() {} func (x *FrameworkServiceRestoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[14] + mi := &file_framework_service_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -957,7 +904,7 @@ func (x *FrameworkServiceRestoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServiceRestoreResponse.ProtoReflect.Descriptor instead. func (*FrameworkServiceRestoreResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{14} + return file_framework_service_proto_rawDescGZIP(), []int{13} } func (x *FrameworkServiceRestoreResponse) GetRestoreResult() *ServiceRestoreResult { @@ -977,7 +924,7 @@ type ServiceRestoreResult struct { func (x *ServiceRestoreResult) Reset() { *x = ServiceRestoreResult{} - mi := &file_framework_service_proto_msgTypes[15] + mi := &file_framework_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -989,7 +936,7 @@ func (x *ServiceRestoreResult) String() string { func (*ServiceRestoreResult) ProtoMessage() {} func (x *ServiceRestoreResult) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[15] + mi := &file_framework_service_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1002,7 +949,7 @@ func (x *ServiceRestoreResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceRestoreResult.ProtoReflect.Descriptor instead. func (*ServiceRestoreResult) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{15} + return file_framework_service_proto_rawDescGZIP(), []int{14} } func (x *ServiceRestoreResult) GetArtifacts() []*Artifact { @@ -1023,7 +970,7 @@ type FrameworkServiceBuildRequest struct { func (x *FrameworkServiceBuildRequest) Reset() { *x = FrameworkServiceBuildRequest{} - mi := &file_framework_service_proto_msgTypes[16] + mi := &file_framework_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1035,7 +982,7 @@ func (x *FrameworkServiceBuildRequest) String() string { func (*FrameworkServiceBuildRequest) ProtoMessage() {} func (x *FrameworkServiceBuildRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[16] + mi := &file_framework_service_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1048,7 +995,7 @@ func (x *FrameworkServiceBuildRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServiceBuildRequest.ProtoReflect.Descriptor instead. func (*FrameworkServiceBuildRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{16} + return file_framework_service_proto_rawDescGZIP(), []int{15} } func (x *FrameworkServiceBuildRequest) GetServiceConfig() *ServiceConfig { @@ -1074,7 +1021,7 @@ type FrameworkServiceBuildResponse struct { func (x *FrameworkServiceBuildResponse) Reset() { *x = FrameworkServiceBuildResponse{} - mi := &file_framework_service_proto_msgTypes[17] + mi := &file_framework_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1086,7 +1033,7 @@ func (x *FrameworkServiceBuildResponse) String() string { func (*FrameworkServiceBuildResponse) ProtoMessage() {} func (x *FrameworkServiceBuildResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[17] + mi := &file_framework_service_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1099,7 +1046,7 @@ func (x *FrameworkServiceBuildResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServiceBuildResponse.ProtoReflect.Descriptor instead. func (*FrameworkServiceBuildResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{17} + return file_framework_service_proto_rawDescGZIP(), []int{16} } func (x *FrameworkServiceBuildResponse) GetResult() *ServiceBuildResult { @@ -1118,7 +1065,7 @@ type ServiceBuildResult struct { func (x *ServiceBuildResult) Reset() { *x = ServiceBuildResult{} - mi := &file_framework_service_proto_msgTypes[18] + mi := &file_framework_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1130,7 +1077,7 @@ func (x *ServiceBuildResult) String() string { func (*ServiceBuildResult) ProtoMessage() {} func (x *ServiceBuildResult) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[18] + mi := &file_framework_service_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1143,7 +1090,7 @@ func (x *ServiceBuildResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceBuildResult.ProtoReflect.Descriptor instead. func (*ServiceBuildResult) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{18} + return file_framework_service_proto_rawDescGZIP(), []int{17} } func (x *ServiceBuildResult) GetArtifacts() []*Artifact { @@ -1164,7 +1111,7 @@ type FrameworkServicePackageRequest struct { func (x *FrameworkServicePackageRequest) Reset() { *x = FrameworkServicePackageRequest{} - mi := &file_framework_service_proto_msgTypes[19] + mi := &file_framework_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1123,7 @@ func (x *FrameworkServicePackageRequest) String() string { func (*FrameworkServicePackageRequest) ProtoMessage() {} func (x *FrameworkServicePackageRequest) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[19] + mi := &file_framework_service_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +1136,7 @@ func (x *FrameworkServicePackageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServicePackageRequest.ProtoReflect.Descriptor instead. func (*FrameworkServicePackageRequest) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{19} + return file_framework_service_proto_rawDescGZIP(), []int{18} } func (x *FrameworkServicePackageRequest) GetServiceConfig() *ServiceConfig { @@ -1215,7 +1162,7 @@ type FrameworkServicePackageResponse struct { func (x *FrameworkServicePackageResponse) Reset() { *x = FrameworkServicePackageResponse{} - mi := &file_framework_service_proto_msgTypes[20] + mi := &file_framework_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1174,7 @@ func (x *FrameworkServicePackageResponse) String() string { func (*FrameworkServicePackageResponse) ProtoMessage() {} func (x *FrameworkServicePackageResponse) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[20] + mi := &file_framework_service_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1187,7 @@ func (x *FrameworkServicePackageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServicePackageResponse.ProtoReflect.Descriptor instead. func (*FrameworkServicePackageResponse) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{20} + return file_framework_service_proto_rawDescGZIP(), []int{19} } func (x *FrameworkServicePackageResponse) GetPackageResult() *ServicePackageResult { @@ -1262,7 +1209,7 @@ type FrameworkServiceProgressMessage struct { func (x *FrameworkServiceProgressMessage) Reset() { *x = FrameworkServiceProgressMessage{} - mi := &file_framework_service_proto_msgTypes[21] + mi := &file_framework_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1274,7 +1221,7 @@ func (x *FrameworkServiceProgressMessage) String() string { func (*FrameworkServiceProgressMessage) ProtoMessage() {} func (x *FrameworkServiceProgressMessage) ProtoReflect() protoreflect.Message { - mi := &file_framework_service_proto_msgTypes[21] + mi := &file_framework_service_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1287,7 +1234,7 @@ func (x *FrameworkServiceProgressMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use FrameworkServiceProgressMessage.ProtoReflect.Descriptor instead. func (*FrameworkServiceProgressMessage) Descriptor() ([]byte, []int) { - return file_framework_service_proto_rawDescGZIP(), []int{21} + return file_framework_service_proto_rawDescGZIP(), []int{20} } func (x *FrameworkServiceProgressMessage) GetRequestId() string { @@ -1315,11 +1262,11 @@ var File_framework_service_proto protoreflect.FileDescriptor const file_framework_service_proto_rawDesc = "" + "\n" + - "\x17framework_service.proto\x12\x06azdext\x1a\fmodels.proto\x1a\x14service_target.proto\"\xc0\f\n" + + "\x17framework_service.proto\x12\x06azdext\x1a\fmodels.proto\x1a\x14service_target.proto\x1a\ferrors.proto\"\xb2\f\n" + "\x17FrameworkServiceMessage\x12\x1d\n" + "\n" + - "request_id\x18\x01 \x01(\tR\trequestId\x12:\n" + - "\x05error\x18c \x01(\v2$.azdext.FrameworkServiceErrorMessageR\x05error\x12v\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12,\n" + + "\x05error\x18c \x01(\v2\x16.azdext.ExtensionErrorR\x05error\x12v\n" + "\"register_framework_service_request\x18\x02 \x01(\v2'.azdext.RegisterFrameworkServiceRequestH\x00R\x1fregisterFrameworkServiceRequest\x12y\n" + "#register_framework_service_response\x18\x03 \x01(\v2(.azdext.RegisterFrameworkServiceResponseH\x00R registerFrameworkServiceResponse\x12Z\n" + "\x12initialize_request\x18\x04 \x01(\v2).azdext.FrameworkServiceInitializeRequestH\x00R\x11initializeRequest\x12]\n" + @@ -1336,10 +1283,7 @@ const file_framework_service_proto_rawDesc = "" + "\x0fpackage_request\x18\x0e \x01(\v2&.azdext.FrameworkServicePackageRequestH\x00R\x0epackageRequest\x12T\n" + "\x10package_response\x18\x0f \x01(\v2'.azdext.FrameworkServicePackageResponseH\x00R\x0fpackageResponse\x12T\n" + "\x10progress_message\x18\x10 \x01(\v2'.azdext.FrameworkServiceProgressMessageH\x00R\x0fprogressMessageB\x0e\n" + - "\fmessage_type\"R\n" + - "\x1cFrameworkServiceErrorMessage\x12\x18\n" + - "\amessage\x18\x01 \x01(\tR\amessage\x12\x18\n" + - "\adetails\x18\x02 \x01(\tR\adetails\"=\n" + + "\fmessage_type\"=\n" + "\x1fRegisterFrameworkServiceRequest\x12\x1a\n" + "\blanguage\x18\x01 \x01(\tR\blanguage\"\"\n" + " RegisterFrameworkServiceResponse\"a\n" + @@ -1401,64 +1345,64 @@ func file_framework_service_proto_rawDescGZIP() []byte { return file_framework_service_proto_rawDescData } -var file_framework_service_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_framework_service_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_framework_service_proto_goTypes = []any{ (*FrameworkServiceMessage)(nil), // 0: azdext.FrameworkServiceMessage - (*FrameworkServiceErrorMessage)(nil), // 1: azdext.FrameworkServiceErrorMessage - (*RegisterFrameworkServiceRequest)(nil), // 2: azdext.RegisterFrameworkServiceRequest - (*RegisterFrameworkServiceResponse)(nil), // 3: azdext.RegisterFrameworkServiceResponse - (*FrameworkServiceInitializeRequest)(nil), // 4: azdext.FrameworkServiceInitializeRequest - (*FrameworkServiceInitializeResponse)(nil), // 5: azdext.FrameworkServiceInitializeResponse - (*FrameworkServiceRequiredExternalToolsRequest)(nil), // 6: azdext.FrameworkServiceRequiredExternalToolsRequest - (*FrameworkServiceRequiredExternalToolsResponse)(nil), // 7: azdext.FrameworkServiceRequiredExternalToolsResponse - (*ExternalTool)(nil), // 8: azdext.ExternalTool - (*FrameworkServiceRequirementsRequest)(nil), // 9: azdext.FrameworkServiceRequirementsRequest - (*FrameworkServiceRequirementsResponse)(nil), // 10: azdext.FrameworkServiceRequirementsResponse - (*FrameworkRequirements)(nil), // 11: azdext.FrameworkRequirements - (*FrameworkPackageRequirements)(nil), // 12: azdext.FrameworkPackageRequirements - (*FrameworkServiceRestoreRequest)(nil), // 13: azdext.FrameworkServiceRestoreRequest - (*FrameworkServiceRestoreResponse)(nil), // 14: azdext.FrameworkServiceRestoreResponse - (*ServiceRestoreResult)(nil), // 15: azdext.ServiceRestoreResult - (*FrameworkServiceBuildRequest)(nil), // 16: azdext.FrameworkServiceBuildRequest - (*FrameworkServiceBuildResponse)(nil), // 17: azdext.FrameworkServiceBuildResponse - (*ServiceBuildResult)(nil), // 18: azdext.ServiceBuildResult - (*FrameworkServicePackageRequest)(nil), // 19: azdext.FrameworkServicePackageRequest - (*FrameworkServicePackageResponse)(nil), // 20: azdext.FrameworkServicePackageResponse - (*FrameworkServiceProgressMessage)(nil), // 21: azdext.FrameworkServiceProgressMessage + (*RegisterFrameworkServiceRequest)(nil), // 1: azdext.RegisterFrameworkServiceRequest + (*RegisterFrameworkServiceResponse)(nil), // 2: azdext.RegisterFrameworkServiceResponse + (*FrameworkServiceInitializeRequest)(nil), // 3: azdext.FrameworkServiceInitializeRequest + (*FrameworkServiceInitializeResponse)(nil), // 4: azdext.FrameworkServiceInitializeResponse + (*FrameworkServiceRequiredExternalToolsRequest)(nil), // 5: azdext.FrameworkServiceRequiredExternalToolsRequest + (*FrameworkServiceRequiredExternalToolsResponse)(nil), // 6: azdext.FrameworkServiceRequiredExternalToolsResponse + (*ExternalTool)(nil), // 7: azdext.ExternalTool + (*FrameworkServiceRequirementsRequest)(nil), // 8: azdext.FrameworkServiceRequirementsRequest + (*FrameworkServiceRequirementsResponse)(nil), // 9: azdext.FrameworkServiceRequirementsResponse + (*FrameworkRequirements)(nil), // 10: azdext.FrameworkRequirements + (*FrameworkPackageRequirements)(nil), // 11: azdext.FrameworkPackageRequirements + (*FrameworkServiceRestoreRequest)(nil), // 12: azdext.FrameworkServiceRestoreRequest + (*FrameworkServiceRestoreResponse)(nil), // 13: azdext.FrameworkServiceRestoreResponse + (*ServiceRestoreResult)(nil), // 14: azdext.ServiceRestoreResult + (*FrameworkServiceBuildRequest)(nil), // 15: azdext.FrameworkServiceBuildRequest + (*FrameworkServiceBuildResponse)(nil), // 16: azdext.FrameworkServiceBuildResponse + (*ServiceBuildResult)(nil), // 17: azdext.ServiceBuildResult + (*FrameworkServicePackageRequest)(nil), // 18: azdext.FrameworkServicePackageRequest + (*FrameworkServicePackageResponse)(nil), // 19: azdext.FrameworkServicePackageResponse + (*FrameworkServiceProgressMessage)(nil), // 20: azdext.FrameworkServiceProgressMessage + (*ExtensionError)(nil), // 21: azdext.ExtensionError (*ServiceConfig)(nil), // 22: azdext.ServiceConfig (*ServiceContext)(nil), // 23: azdext.ServiceContext (*Artifact)(nil), // 24: azdext.Artifact (*ServicePackageResult)(nil), // 25: azdext.ServicePackageResult } var file_framework_service_proto_depIdxs = []int32{ - 1, // 0: azdext.FrameworkServiceMessage.error:type_name -> azdext.FrameworkServiceErrorMessage - 2, // 1: azdext.FrameworkServiceMessage.register_framework_service_request:type_name -> azdext.RegisterFrameworkServiceRequest - 3, // 2: azdext.FrameworkServiceMessage.register_framework_service_response:type_name -> azdext.RegisterFrameworkServiceResponse - 4, // 3: azdext.FrameworkServiceMessage.initialize_request:type_name -> azdext.FrameworkServiceInitializeRequest - 5, // 4: azdext.FrameworkServiceMessage.initialize_response:type_name -> azdext.FrameworkServiceInitializeResponse - 6, // 5: azdext.FrameworkServiceMessage.required_external_tools_request:type_name -> azdext.FrameworkServiceRequiredExternalToolsRequest - 7, // 6: azdext.FrameworkServiceMessage.required_external_tools_response:type_name -> azdext.FrameworkServiceRequiredExternalToolsResponse - 9, // 7: azdext.FrameworkServiceMessage.requirements_request:type_name -> azdext.FrameworkServiceRequirementsRequest - 10, // 8: azdext.FrameworkServiceMessage.requirements_response:type_name -> azdext.FrameworkServiceRequirementsResponse - 13, // 9: azdext.FrameworkServiceMessage.restore_request:type_name -> azdext.FrameworkServiceRestoreRequest - 14, // 10: azdext.FrameworkServiceMessage.restore_response:type_name -> azdext.FrameworkServiceRestoreResponse - 16, // 11: azdext.FrameworkServiceMessage.build_request:type_name -> azdext.FrameworkServiceBuildRequest - 17, // 12: azdext.FrameworkServiceMessage.build_response:type_name -> azdext.FrameworkServiceBuildResponse - 19, // 13: azdext.FrameworkServiceMessage.package_request:type_name -> azdext.FrameworkServicePackageRequest - 20, // 14: azdext.FrameworkServiceMessage.package_response:type_name -> azdext.FrameworkServicePackageResponse - 21, // 15: azdext.FrameworkServiceMessage.progress_message:type_name -> azdext.FrameworkServiceProgressMessage + 21, // 0: azdext.FrameworkServiceMessage.error:type_name -> azdext.ExtensionError + 1, // 1: azdext.FrameworkServiceMessage.register_framework_service_request:type_name -> azdext.RegisterFrameworkServiceRequest + 2, // 2: azdext.FrameworkServiceMessage.register_framework_service_response:type_name -> azdext.RegisterFrameworkServiceResponse + 3, // 3: azdext.FrameworkServiceMessage.initialize_request:type_name -> azdext.FrameworkServiceInitializeRequest + 4, // 4: azdext.FrameworkServiceMessage.initialize_response:type_name -> azdext.FrameworkServiceInitializeResponse + 5, // 5: azdext.FrameworkServiceMessage.required_external_tools_request:type_name -> azdext.FrameworkServiceRequiredExternalToolsRequest + 6, // 6: azdext.FrameworkServiceMessage.required_external_tools_response:type_name -> azdext.FrameworkServiceRequiredExternalToolsResponse + 8, // 7: azdext.FrameworkServiceMessage.requirements_request:type_name -> azdext.FrameworkServiceRequirementsRequest + 9, // 8: azdext.FrameworkServiceMessage.requirements_response:type_name -> azdext.FrameworkServiceRequirementsResponse + 12, // 9: azdext.FrameworkServiceMessage.restore_request:type_name -> azdext.FrameworkServiceRestoreRequest + 13, // 10: azdext.FrameworkServiceMessage.restore_response:type_name -> azdext.FrameworkServiceRestoreResponse + 15, // 11: azdext.FrameworkServiceMessage.build_request:type_name -> azdext.FrameworkServiceBuildRequest + 16, // 12: azdext.FrameworkServiceMessage.build_response:type_name -> azdext.FrameworkServiceBuildResponse + 18, // 13: azdext.FrameworkServiceMessage.package_request:type_name -> azdext.FrameworkServicePackageRequest + 19, // 14: azdext.FrameworkServiceMessage.package_response:type_name -> azdext.FrameworkServicePackageResponse + 20, // 15: azdext.FrameworkServiceMessage.progress_message:type_name -> azdext.FrameworkServiceProgressMessage 22, // 16: azdext.FrameworkServiceInitializeRequest.service_config:type_name -> azdext.ServiceConfig 22, // 17: azdext.FrameworkServiceRequiredExternalToolsRequest.service_config:type_name -> azdext.ServiceConfig - 8, // 18: azdext.FrameworkServiceRequiredExternalToolsResponse.tools:type_name -> azdext.ExternalTool - 11, // 19: azdext.FrameworkServiceRequirementsResponse.requirements:type_name -> azdext.FrameworkRequirements - 12, // 20: azdext.FrameworkRequirements.package:type_name -> azdext.FrameworkPackageRequirements + 7, // 18: azdext.FrameworkServiceRequiredExternalToolsResponse.tools:type_name -> azdext.ExternalTool + 10, // 19: azdext.FrameworkServiceRequirementsResponse.requirements:type_name -> azdext.FrameworkRequirements + 11, // 20: azdext.FrameworkRequirements.package:type_name -> azdext.FrameworkPackageRequirements 22, // 21: azdext.FrameworkServiceRestoreRequest.service_config:type_name -> azdext.ServiceConfig 23, // 22: azdext.FrameworkServiceRestoreRequest.service_context:type_name -> azdext.ServiceContext - 15, // 23: azdext.FrameworkServiceRestoreResponse.restore_result:type_name -> azdext.ServiceRestoreResult + 14, // 23: azdext.FrameworkServiceRestoreResponse.restore_result:type_name -> azdext.ServiceRestoreResult 24, // 24: azdext.ServiceRestoreResult.artifacts:type_name -> azdext.Artifact 22, // 25: azdext.FrameworkServiceBuildRequest.service_config:type_name -> azdext.ServiceConfig 23, // 26: azdext.FrameworkServiceBuildRequest.service_context:type_name -> azdext.ServiceContext - 18, // 27: azdext.FrameworkServiceBuildResponse.result:type_name -> azdext.ServiceBuildResult + 17, // 27: azdext.FrameworkServiceBuildResponse.result:type_name -> azdext.ServiceBuildResult 24, // 28: azdext.ServiceBuildResult.artifacts:type_name -> azdext.Artifact 22, // 29: azdext.FrameworkServicePackageRequest.service_config:type_name -> azdext.ServiceConfig 23, // 30: azdext.FrameworkServicePackageRequest.service_context:type_name -> azdext.ServiceContext @@ -1479,6 +1423,7 @@ func file_framework_service_proto_init() { } file_models_proto_init() file_service_target_proto_init() + file_errors_proto_init() file_framework_service_proto_msgTypes[0].OneofWrappers = []any{ (*FrameworkServiceMessage_RegisterFrameworkServiceRequest)(nil), (*FrameworkServiceMessage_RegisterFrameworkServiceResponse)(nil), @@ -1502,7 +1447,7 @@ func file_framework_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_framework_service_proto_rawDesc), len(file_framework_service_proto_rawDesc)), NumEnums: 0, - NumMessages: 22, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/cli/azd/pkg/azdext/framework_service_envelope.go b/cli/azd/pkg/azdext/framework_service_envelope.go index b3560d24b69..9e462f449f8 100644 --- a/cli/azd/pkg/azdext/framework_service_envelope.go +++ b/cli/azd/pkg/azdext/framework_service_envelope.go @@ -5,7 +5,6 @@ package azdext import ( "context" - "errors" "github.com/azure/azure-dev/cli/azd/pkg/grpcbroker" ) @@ -32,23 +31,16 @@ func (ops *FrameworkServiceEnvelope) SetRequestId(ctx context.Context, msg *Fram msg.RequestId = id } -// GetError returns the error from the message as a Go error type +// GetError returns the error from the message as a Go error type. +// It returns a typed error based on the ErrorOrigin that preserves structured information for telemetry. func (ops *FrameworkServiceEnvelope) GetError(msg *FrameworkServiceMessage) error { - if msg.Error == nil || msg.Error.Message == "" { - return nil - } - return errors.New(msg.Error.Message) + return UnwrapError(msg.Error) } -// SetError sets an error on the message +// SetError sets an error on the message. +// It detects the error type and populates the appropriate source details. func (ops *FrameworkServiceEnvelope) SetError(msg *FrameworkServiceMessage, err error) { - if err == nil { - msg.Error = nil - return - } - msg.Error = &FrameworkServiceErrorMessage{ - Message: err.Error(), - } + msg.Error = WrapError(err) } // GetInnerMessage returns the inner message from the oneof field diff --git a/cli/azd/pkg/azdext/service_target.pb.go b/cli/azd/pkg/azdext/service_target.pb.go index 6d77c65d44d..94ba2e40b93 100644 --- a/cli/azd/pkg/azdext/service_target.pb.go +++ b/cli/azd/pkg/azdext/service_target.pb.go @@ -27,9 +27,9 @@ const ( // Envelope for all possible service target messages (requests and responses) type ServiceTargetMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - Error *ServiceTargetErrorMessage `protobuf:"bytes,99,opt,name=error,proto3" json:"error,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + Error *ExtensionError `protobuf:"bytes,99,opt,name=error,proto3" json:"error,omitempty"` // Types that are valid to be assigned to MessageType: // // *ServiceTargetMessage_RegisterServiceTargetRequest @@ -89,7 +89,7 @@ func (x *ServiceTargetMessage) GetRequestId() string { return "" } -func (x *ServiceTargetMessage) GetError() *ServiceTargetErrorMessage { +func (x *ServiceTargetMessage) GetError() *ExtensionError { if x != nil { return x.Error } @@ -736,58 +736,6 @@ func (*RegisterServiceTargetResponse) Descriptor() ([]byte, []int) { return file_service_target_proto_rawDescGZIP(), []int{8} } -type ServiceTargetErrorMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ServiceTargetErrorMessage) Reset() { - *x = ServiceTargetErrorMessage{} - mi := &file_service_target_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ServiceTargetErrorMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceTargetErrorMessage) ProtoMessage() {} - -func (x *ServiceTargetErrorMessage) ProtoReflect() protoreflect.Message { - mi := &file_service_target_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 ServiceTargetErrorMessage.ProtoReflect.Descriptor instead. -func (*ServiceTargetErrorMessage) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{9} -} - -func (x *ServiceTargetErrorMessage) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *ServiceTargetErrorMessage) GetDetails() string { - if x != nil { - return x.Details - } - return "" -} - // GetTargetResource request and response type GetTargetResourceRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -805,7 +753,7 @@ type GetTargetResourceRequest struct { func (x *GetTargetResourceRequest) Reset() { *x = GetTargetResourceRequest{} - mi := &file_service_target_proto_msgTypes[10] + mi := &file_service_target_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -817,7 +765,7 @@ func (x *GetTargetResourceRequest) String() string { func (*GetTargetResourceRequest) ProtoMessage() {} func (x *GetTargetResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[10] + mi := &file_service_target_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -830,7 +778,7 @@ func (x *GetTargetResourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTargetResourceRequest.ProtoReflect.Descriptor instead. func (*GetTargetResourceRequest) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{10} + return file_service_target_proto_rawDescGZIP(), []int{9} } func (x *GetTargetResourceRequest) GetSubscriptionId() string { @@ -870,7 +818,7 @@ type GetTargetResourceResponse struct { func (x *GetTargetResourceResponse) Reset() { *x = GetTargetResourceResponse{} - mi := &file_service_target_proto_msgTypes[11] + mi := &file_service_target_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -882,7 +830,7 @@ func (x *GetTargetResourceResponse) String() string { func (*GetTargetResourceResponse) ProtoMessage() {} func (x *GetTargetResourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[11] + mi := &file_service_target_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -895,7 +843,7 @@ func (x *GetTargetResourceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTargetResourceResponse.ProtoReflect.Descriptor instead. func (*GetTargetResourceResponse) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{11} + return file_service_target_proto_rawDescGZIP(), []int{10} } func (x *GetTargetResourceResponse) GetTargetResource() *TargetResource { @@ -919,7 +867,7 @@ type TargetResource struct { func (x *TargetResource) Reset() { *x = TargetResource{} - mi := &file_service_target_proto_msgTypes[12] + mi := &file_service_target_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -931,7 +879,7 @@ func (x *TargetResource) String() string { func (*TargetResource) ProtoMessage() {} func (x *TargetResource) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[12] + mi := &file_service_target_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -944,7 +892,7 @@ func (x *TargetResource) ProtoReflect() protoreflect.Message { // Deprecated: Use TargetResource.ProtoReflect.Descriptor instead. func (*TargetResource) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{12} + return file_service_target_proto_rawDescGZIP(), []int{11} } func (x *TargetResource) GetSubscriptionId() string { @@ -994,7 +942,7 @@ type ServiceTargetDeployRequest struct { func (x *ServiceTargetDeployRequest) Reset() { *x = ServiceTargetDeployRequest{} - mi := &file_service_target_proto_msgTypes[13] + mi := &file_service_target_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1006,7 +954,7 @@ func (x *ServiceTargetDeployRequest) String() string { func (*ServiceTargetDeployRequest) ProtoMessage() {} func (x *ServiceTargetDeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[13] + mi := &file_service_target_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1019,7 +967,7 @@ func (x *ServiceTargetDeployRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetDeployRequest.ProtoReflect.Descriptor instead. func (*ServiceTargetDeployRequest) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{13} + return file_service_target_proto_rawDescGZIP(), []int{12} } func (x *ServiceTargetDeployRequest) GetServiceConfig() *ServiceConfig { @@ -1052,7 +1000,7 @@ type ServiceTargetDeployResponse struct { func (x *ServiceTargetDeployResponse) Reset() { *x = ServiceTargetDeployResponse{} - mi := &file_service_target_proto_msgTypes[14] + mi := &file_service_target_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1064,7 +1012,7 @@ func (x *ServiceTargetDeployResponse) String() string { func (*ServiceTargetDeployResponse) ProtoMessage() {} func (x *ServiceTargetDeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[14] + mi := &file_service_target_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1077,7 +1025,7 @@ func (x *ServiceTargetDeployResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetDeployResponse.ProtoReflect.Descriptor instead. func (*ServiceTargetDeployResponse) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{14} + return file_service_target_proto_rawDescGZIP(), []int{13} } func (x *ServiceTargetDeployResponse) GetResult() *ServiceDeployResult { @@ -1097,7 +1045,7 @@ type ServicePackageResult struct { func (x *ServicePackageResult) Reset() { *x = ServicePackageResult{} - mi := &file_service_target_proto_msgTypes[15] + mi := &file_service_target_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1109,7 +1057,7 @@ func (x *ServicePackageResult) String() string { func (*ServicePackageResult) ProtoMessage() {} func (x *ServicePackageResult) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[15] + mi := &file_service_target_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1122,7 +1070,7 @@ func (x *ServicePackageResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicePackageResult.ProtoReflect.Descriptor instead. func (*ServicePackageResult) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{15} + return file_service_target_proto_rawDescGZIP(), []int{14} } func (x *ServicePackageResult) GetArtifacts() []*Artifact { @@ -1142,7 +1090,7 @@ type ServicePublishResult struct { func (x *ServicePublishResult) Reset() { *x = ServicePublishResult{} - mi := &file_service_target_proto_msgTypes[16] + mi := &file_service_target_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1154,7 +1102,7 @@ func (x *ServicePublishResult) String() string { func (*ServicePublishResult) ProtoMessage() {} func (x *ServicePublishResult) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[16] + mi := &file_service_target_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1167,7 +1115,7 @@ func (x *ServicePublishResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicePublishResult.ProtoReflect.Descriptor instead. func (*ServicePublishResult) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{16} + return file_service_target_proto_rawDescGZIP(), []int{15} } func (x *ServicePublishResult) GetArtifacts() []*Artifact { @@ -1187,7 +1135,7 @@ type ServiceDeployResult struct { func (x *ServiceDeployResult) Reset() { *x = ServiceDeployResult{} - mi := &file_service_target_proto_msgTypes[17] + mi := &file_service_target_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1199,7 +1147,7 @@ func (x *ServiceDeployResult) String() string { func (*ServiceDeployResult) ProtoMessage() {} func (x *ServiceDeployResult) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[17] + mi := &file_service_target_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1212,7 +1160,7 @@ func (x *ServiceDeployResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceDeployResult.ProtoReflect.Descriptor instead. func (*ServiceDeployResult) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{17} + return file_service_target_proto_rawDescGZIP(), []int{16} } func (x *ServiceDeployResult) GetArtifacts() []*Artifact { @@ -1233,7 +1181,7 @@ type ServiceTargetPackageRequest struct { func (x *ServiceTargetPackageRequest) Reset() { *x = ServiceTargetPackageRequest{} - mi := &file_service_target_proto_msgTypes[18] + mi := &file_service_target_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1245,7 +1193,7 @@ func (x *ServiceTargetPackageRequest) String() string { func (*ServiceTargetPackageRequest) ProtoMessage() {} func (x *ServiceTargetPackageRequest) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[18] + mi := &file_service_target_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1258,7 +1206,7 @@ func (x *ServiceTargetPackageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetPackageRequest.ProtoReflect.Descriptor instead. func (*ServiceTargetPackageRequest) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{18} + return file_service_target_proto_rawDescGZIP(), []int{17} } func (x *ServiceTargetPackageRequest) GetServiceConfig() *ServiceConfig { @@ -1284,7 +1232,7 @@ type ServiceTargetPackageResponse struct { func (x *ServiceTargetPackageResponse) Reset() { *x = ServiceTargetPackageResponse{} - mi := &file_service_target_proto_msgTypes[19] + mi := &file_service_target_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1296,7 +1244,7 @@ func (x *ServiceTargetPackageResponse) String() string { func (*ServiceTargetPackageResponse) ProtoMessage() {} func (x *ServiceTargetPackageResponse) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[19] + mi := &file_service_target_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1309,7 +1257,7 @@ func (x *ServiceTargetPackageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetPackageResponse.ProtoReflect.Descriptor instead. func (*ServiceTargetPackageResponse) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{19} + return file_service_target_proto_rawDescGZIP(), []int{18} } func (x *ServiceTargetPackageResponse) GetResult() *ServicePackageResult { @@ -1332,7 +1280,7 @@ type ServiceTargetPublishRequest struct { func (x *ServiceTargetPublishRequest) Reset() { *x = ServiceTargetPublishRequest{} - mi := &file_service_target_proto_msgTypes[20] + mi := &file_service_target_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1344,7 +1292,7 @@ func (x *ServiceTargetPublishRequest) String() string { func (*ServiceTargetPublishRequest) ProtoMessage() {} func (x *ServiceTargetPublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[20] + mi := &file_service_target_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1357,7 +1305,7 @@ func (x *ServiceTargetPublishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetPublishRequest.ProtoReflect.Descriptor instead. func (*ServiceTargetPublishRequest) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{20} + return file_service_target_proto_rawDescGZIP(), []int{19} } func (x *ServiceTargetPublishRequest) GetServiceConfig() *ServiceConfig { @@ -1397,7 +1345,7 @@ type ServiceTargetPublishResponse struct { func (x *ServiceTargetPublishResponse) Reset() { *x = ServiceTargetPublishResponse{} - mi := &file_service_target_proto_msgTypes[21] + mi := &file_service_target_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1409,7 +1357,7 @@ func (x *ServiceTargetPublishResponse) String() string { func (*ServiceTargetPublishResponse) ProtoMessage() {} func (x *ServiceTargetPublishResponse) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[21] + mi := &file_service_target_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1422,7 +1370,7 @@ func (x *ServiceTargetPublishResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetPublishResponse.ProtoReflect.Descriptor instead. func (*ServiceTargetPublishResponse) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{21} + return file_service_target_proto_rawDescGZIP(), []int{20} } func (x *ServiceTargetPublishResponse) GetResult() *ServicePublishResult { @@ -1443,7 +1391,7 @@ type PublishOptions struct { func (x *PublishOptions) Reset() { *x = PublishOptions{} - mi := &file_service_target_proto_msgTypes[22] + mi := &file_service_target_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1455,7 +1403,7 @@ func (x *PublishOptions) String() string { func (*PublishOptions) ProtoMessage() {} func (x *PublishOptions) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[22] + mi := &file_service_target_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1468,7 +1416,7 @@ func (x *PublishOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishOptions.ProtoReflect.Descriptor instead. func (*PublishOptions) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{22} + return file_service_target_proto_rawDescGZIP(), []int{21} } func (x *PublishOptions) GetImage() string { @@ -1489,7 +1437,7 @@ type ServiceTargetEndpointsRequest struct { func (x *ServiceTargetEndpointsRequest) Reset() { *x = ServiceTargetEndpointsRequest{} - mi := &file_service_target_proto_msgTypes[23] + mi := &file_service_target_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1501,7 +1449,7 @@ func (x *ServiceTargetEndpointsRequest) String() string { func (*ServiceTargetEndpointsRequest) ProtoMessage() {} func (x *ServiceTargetEndpointsRequest) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[23] + mi := &file_service_target_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1514,7 +1462,7 @@ func (x *ServiceTargetEndpointsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetEndpointsRequest.ProtoReflect.Descriptor instead. func (*ServiceTargetEndpointsRequest) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{23} + return file_service_target_proto_rawDescGZIP(), []int{22} } func (x *ServiceTargetEndpointsRequest) GetServiceConfig() *ServiceConfig { @@ -1540,7 +1488,7 @@ type ServiceTargetEndpointsResponse struct { func (x *ServiceTargetEndpointsResponse) Reset() { *x = ServiceTargetEndpointsResponse{} - mi := &file_service_target_proto_msgTypes[24] + mi := &file_service_target_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1552,7 +1500,7 @@ func (x *ServiceTargetEndpointsResponse) String() string { func (*ServiceTargetEndpointsResponse) ProtoMessage() {} func (x *ServiceTargetEndpointsResponse) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[24] + mi := &file_service_target_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1565,7 +1513,7 @@ func (x *ServiceTargetEndpointsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetEndpointsResponse.ProtoReflect.Descriptor instead. func (*ServiceTargetEndpointsResponse) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{24} + return file_service_target_proto_rawDescGZIP(), []int{23} } func (x *ServiceTargetEndpointsResponse) GetEndpoints() []string { @@ -1587,7 +1535,7 @@ type ServiceTargetProgressMessage struct { func (x *ServiceTargetProgressMessage) Reset() { *x = ServiceTargetProgressMessage{} - mi := &file_service_target_proto_msgTypes[25] + mi := &file_service_target_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1599,7 +1547,7 @@ func (x *ServiceTargetProgressMessage) String() string { func (*ServiceTargetProgressMessage) ProtoMessage() {} func (x *ServiceTargetProgressMessage) ProtoReflect() protoreflect.Message { - mi := &file_service_target_proto_msgTypes[25] + mi := &file_service_target_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1612,7 +1560,7 @@ func (x *ServiceTargetProgressMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceTargetProgressMessage.ProtoReflect.Descriptor instead. func (*ServiceTargetProgressMessage) Descriptor() ([]byte, []int) { - return file_service_target_proto_rawDescGZIP(), []int{25} + return file_service_target_proto_rawDescGZIP(), []int{24} } func (x *ServiceTargetProgressMessage) GetRequestId() string { @@ -1640,11 +1588,11 @@ var File_service_target_proto protoreflect.FileDescriptor const file_service_target_proto_rawDesc = "" + "\n" + - "\x14service_target.proto\x12\x06azdext\x1a$include/google/protobuf/struct.proto\x1a\fmodels.proto\"\xc2\v\n" + + "\x14service_target.proto\x12\x06azdext\x1a$include/google/protobuf/struct.proto\x1a\fmodels.proto\x1a\ferrors.proto\"\xb7\v\n" + "\x14ServiceTargetMessage\x12\x1d\n" + "\n" + - "request_id\x18\x01 \x01(\tR\trequestId\x127\n" + - "\x05error\x18c \x01(\v2!.azdext.ServiceTargetErrorMessageR\x05error\x12m\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12,\n" + + "\x05error\x18c \x01(\v2\x16.azdext.ExtensionErrorR\x05error\x12m\n" + "\x1fregister_service_target_request\x18\x02 \x01(\v2$.azdext.RegisterServiceTargetRequestH\x00R\x1cregisterServiceTargetRequest\x12p\n" + " register_service_target_response\x18\x03 \x01(\v2%.azdext.RegisterServiceTargetResponseH\x00R\x1dregisterServiceTargetResponse\x12W\n" + "\x12initialize_request\x18\x06 \x01(\v2&.azdext.ServiceTargetInitializeRequestH\x00R\x11initializeRequest\x12Z\n" + @@ -1686,10 +1634,7 @@ const file_service_target_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"2\n" + "\x1cRegisterServiceTargetRequest\x12\x12\n" + "\x04host\x18\x01 \x01(\tR\x04host\"\x1f\n" + - "\x1dRegisterServiceTargetResponse\"O\n" + - "\x19ServiceTargetErrorMessage\x12\x18\n" + - "\amessage\x18\x02 \x01(\tR\amessage\x12\x18\n" + - "\adetails\x18\x03 \x01(\tR\adetails\"\xf6\x01\n" + + "\x1dRegisterServiceTargetResponse\"\xf6\x01\n" + "\x18GetTargetResourceRequest\x12'\n" + "\x0fsubscription_id\x18\x01 \x01(\tR\x0esubscriptionId\x12<\n" + "\x0eservice_config\x18\x02 \x01(\v2\x15.azdext.ServiceConfigR\rserviceConfig\x12N\n" + @@ -1757,7 +1702,7 @@ func file_service_target_proto_rawDescGZIP() []byte { return file_service_target_proto_rawDescData } -var file_service_target_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_service_target_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_service_target_proto_goTypes = []any{ (*ServiceTargetMessage)(nil), // 0: azdext.ServiceTargetMessage (*ServiceTargetInputParameter)(nil), // 1: azdext.ServiceTargetInputParameter @@ -1768,71 +1713,71 @@ var file_service_target_proto_goTypes = []any{ (*ServiceTargetOptions)(nil), // 6: azdext.ServiceTargetOptions (*RegisterServiceTargetRequest)(nil), // 7: azdext.RegisterServiceTargetRequest (*RegisterServiceTargetResponse)(nil), // 8: azdext.RegisterServiceTargetResponse - (*ServiceTargetErrorMessage)(nil), // 9: azdext.ServiceTargetErrorMessage - (*GetTargetResourceRequest)(nil), // 10: azdext.GetTargetResourceRequest - (*GetTargetResourceResponse)(nil), // 11: azdext.GetTargetResourceResponse - (*TargetResource)(nil), // 12: azdext.TargetResource - (*ServiceTargetDeployRequest)(nil), // 13: azdext.ServiceTargetDeployRequest - (*ServiceTargetDeployResponse)(nil), // 14: azdext.ServiceTargetDeployResponse - (*ServicePackageResult)(nil), // 15: azdext.ServicePackageResult - (*ServicePublishResult)(nil), // 16: azdext.ServicePublishResult - (*ServiceDeployResult)(nil), // 17: azdext.ServiceDeployResult - (*ServiceTargetPackageRequest)(nil), // 18: azdext.ServiceTargetPackageRequest - (*ServiceTargetPackageResponse)(nil), // 19: azdext.ServiceTargetPackageResponse - (*ServiceTargetPublishRequest)(nil), // 20: azdext.ServiceTargetPublishRequest - (*ServiceTargetPublishResponse)(nil), // 21: azdext.ServiceTargetPublishResponse - (*PublishOptions)(nil), // 22: azdext.PublishOptions - (*ServiceTargetEndpointsRequest)(nil), // 23: azdext.ServiceTargetEndpointsRequest - (*ServiceTargetEndpointsResponse)(nil), // 24: azdext.ServiceTargetEndpointsResponse - (*ServiceTargetProgressMessage)(nil), // 25: azdext.ServiceTargetProgressMessage - nil, // 26: azdext.ServiceTargetOptions.DeploymentStacksEntry - nil, // 27: azdext.TargetResource.MetadataEntry + (*GetTargetResourceRequest)(nil), // 9: azdext.GetTargetResourceRequest + (*GetTargetResourceResponse)(nil), // 10: azdext.GetTargetResourceResponse + (*TargetResource)(nil), // 11: azdext.TargetResource + (*ServiceTargetDeployRequest)(nil), // 12: azdext.ServiceTargetDeployRequest + (*ServiceTargetDeployResponse)(nil), // 13: azdext.ServiceTargetDeployResponse + (*ServicePackageResult)(nil), // 14: azdext.ServicePackageResult + (*ServicePublishResult)(nil), // 15: azdext.ServicePublishResult + (*ServiceDeployResult)(nil), // 16: azdext.ServiceDeployResult + (*ServiceTargetPackageRequest)(nil), // 17: azdext.ServiceTargetPackageRequest + (*ServiceTargetPackageResponse)(nil), // 18: azdext.ServiceTargetPackageResponse + (*ServiceTargetPublishRequest)(nil), // 19: azdext.ServiceTargetPublishRequest + (*ServiceTargetPublishResponse)(nil), // 20: azdext.ServiceTargetPublishResponse + (*PublishOptions)(nil), // 21: azdext.PublishOptions + (*ServiceTargetEndpointsRequest)(nil), // 22: azdext.ServiceTargetEndpointsRequest + (*ServiceTargetEndpointsResponse)(nil), // 23: azdext.ServiceTargetEndpointsResponse + (*ServiceTargetProgressMessage)(nil), // 24: azdext.ServiceTargetProgressMessage + nil, // 25: azdext.ServiceTargetOptions.DeploymentStacksEntry + nil, // 26: azdext.TargetResource.MetadataEntry + (*ExtensionError)(nil), // 27: azdext.ExtensionError (*ServiceConfig)(nil), // 28: azdext.ServiceConfig (*structpb.Struct)(nil), // 29: google.protobuf.Struct (*ServiceContext)(nil), // 30: azdext.ServiceContext (*Artifact)(nil), // 31: azdext.Artifact } var file_service_target_proto_depIdxs = []int32{ - 9, // 0: azdext.ServiceTargetMessage.error:type_name -> azdext.ServiceTargetErrorMessage + 27, // 0: azdext.ServiceTargetMessage.error:type_name -> azdext.ExtensionError 7, // 1: azdext.ServiceTargetMessage.register_service_target_request:type_name -> azdext.RegisterServiceTargetRequest 8, // 2: azdext.ServiceTargetMessage.register_service_target_response:type_name -> azdext.RegisterServiceTargetResponse 4, // 3: azdext.ServiceTargetMessage.initialize_request:type_name -> azdext.ServiceTargetInitializeRequest 5, // 4: azdext.ServiceTargetMessage.initialize_response:type_name -> azdext.ServiceTargetInitializeResponse - 10, // 5: azdext.ServiceTargetMessage.get_target_resource_request:type_name -> azdext.GetTargetResourceRequest - 11, // 6: azdext.ServiceTargetMessage.get_target_resource_response:type_name -> azdext.GetTargetResourceResponse - 13, // 7: azdext.ServiceTargetMessage.deploy_request:type_name -> azdext.ServiceTargetDeployRequest - 14, // 8: azdext.ServiceTargetMessage.deploy_response:type_name -> azdext.ServiceTargetDeployResponse - 25, // 9: azdext.ServiceTargetMessage.progress_message:type_name -> azdext.ServiceTargetProgressMessage - 18, // 10: azdext.ServiceTargetMessage.package_request:type_name -> azdext.ServiceTargetPackageRequest - 19, // 11: azdext.ServiceTargetMessage.package_response:type_name -> azdext.ServiceTargetPackageResponse - 20, // 12: azdext.ServiceTargetMessage.publish_request:type_name -> azdext.ServiceTargetPublishRequest - 21, // 13: azdext.ServiceTargetMessage.publish_response:type_name -> azdext.ServiceTargetPublishResponse - 23, // 14: azdext.ServiceTargetMessage.endpoints_request:type_name -> azdext.ServiceTargetEndpointsRequest - 24, // 15: azdext.ServiceTargetMessage.endpoints_response:type_name -> azdext.ServiceTargetEndpointsResponse + 9, // 5: azdext.ServiceTargetMessage.get_target_resource_request:type_name -> azdext.GetTargetResourceRequest + 10, // 6: azdext.ServiceTargetMessage.get_target_resource_response:type_name -> azdext.GetTargetResourceResponse + 12, // 7: azdext.ServiceTargetMessage.deploy_request:type_name -> azdext.ServiceTargetDeployRequest + 13, // 8: azdext.ServiceTargetMessage.deploy_response:type_name -> azdext.ServiceTargetDeployResponse + 24, // 9: azdext.ServiceTargetMessage.progress_message:type_name -> azdext.ServiceTargetProgressMessage + 17, // 10: azdext.ServiceTargetMessage.package_request:type_name -> azdext.ServiceTargetPackageRequest + 18, // 11: azdext.ServiceTargetMessage.package_response:type_name -> azdext.ServiceTargetPackageResponse + 19, // 12: azdext.ServiceTargetMessage.publish_request:type_name -> azdext.ServiceTargetPublishRequest + 20, // 13: azdext.ServiceTargetMessage.publish_response:type_name -> azdext.ServiceTargetPublishResponse + 22, // 14: azdext.ServiceTargetMessage.endpoints_request:type_name -> azdext.ServiceTargetEndpointsRequest + 23, // 15: azdext.ServiceTargetMessage.endpoints_response:type_name -> azdext.ServiceTargetEndpointsResponse 28, // 16: azdext.ServiceTargetInitializeRequest.service_config:type_name -> azdext.ServiceConfig - 26, // 17: azdext.ServiceTargetOptions.deployment_stacks:type_name -> azdext.ServiceTargetOptions.DeploymentStacksEntry + 25, // 17: azdext.ServiceTargetOptions.deployment_stacks:type_name -> azdext.ServiceTargetOptions.DeploymentStacksEntry 29, // 18: azdext.ServiceTargetOptions.config:type_name -> google.protobuf.Struct 28, // 19: azdext.GetTargetResourceRequest.service_config:type_name -> azdext.ServiceConfig - 12, // 20: azdext.GetTargetResourceRequest.default_target_resource:type_name -> azdext.TargetResource - 12, // 21: azdext.GetTargetResourceResponse.target_resource:type_name -> azdext.TargetResource - 27, // 22: azdext.TargetResource.metadata:type_name -> azdext.TargetResource.MetadataEntry + 11, // 20: azdext.GetTargetResourceRequest.default_target_resource:type_name -> azdext.TargetResource + 11, // 21: azdext.GetTargetResourceResponse.target_resource:type_name -> azdext.TargetResource + 26, // 22: azdext.TargetResource.metadata:type_name -> azdext.TargetResource.MetadataEntry 28, // 23: azdext.ServiceTargetDeployRequest.service_config:type_name -> azdext.ServiceConfig 30, // 24: azdext.ServiceTargetDeployRequest.service_context:type_name -> azdext.ServiceContext - 12, // 25: azdext.ServiceTargetDeployRequest.target_resource:type_name -> azdext.TargetResource - 17, // 26: azdext.ServiceTargetDeployResponse.result:type_name -> azdext.ServiceDeployResult + 11, // 25: azdext.ServiceTargetDeployRequest.target_resource:type_name -> azdext.TargetResource + 16, // 26: azdext.ServiceTargetDeployResponse.result:type_name -> azdext.ServiceDeployResult 31, // 27: azdext.ServicePackageResult.artifacts:type_name -> azdext.Artifact 31, // 28: azdext.ServicePublishResult.artifacts:type_name -> azdext.Artifact 31, // 29: azdext.ServiceDeployResult.artifacts:type_name -> azdext.Artifact 28, // 30: azdext.ServiceTargetPackageRequest.service_config:type_name -> azdext.ServiceConfig 30, // 31: azdext.ServiceTargetPackageRequest.service_context:type_name -> azdext.ServiceContext - 15, // 32: azdext.ServiceTargetPackageResponse.result:type_name -> azdext.ServicePackageResult + 14, // 32: azdext.ServiceTargetPackageResponse.result:type_name -> azdext.ServicePackageResult 28, // 33: azdext.ServiceTargetPublishRequest.service_config:type_name -> azdext.ServiceConfig 30, // 34: azdext.ServiceTargetPublishRequest.service_context:type_name -> azdext.ServiceContext - 12, // 35: azdext.ServiceTargetPublishRequest.target_resource:type_name -> azdext.TargetResource - 22, // 36: azdext.ServiceTargetPublishRequest.publish_options:type_name -> azdext.PublishOptions - 16, // 37: azdext.ServiceTargetPublishResponse.result:type_name -> azdext.ServicePublishResult + 11, // 35: azdext.ServiceTargetPublishRequest.target_resource:type_name -> azdext.TargetResource + 21, // 36: azdext.ServiceTargetPublishRequest.publish_options:type_name -> azdext.PublishOptions + 15, // 37: azdext.ServiceTargetPublishResponse.result:type_name -> azdext.ServicePublishResult 28, // 38: azdext.ServiceTargetEndpointsRequest.service_config:type_name -> azdext.ServiceConfig - 12, // 39: azdext.ServiceTargetEndpointsRequest.target_resource:type_name -> azdext.TargetResource + 11, // 39: azdext.ServiceTargetEndpointsRequest.target_resource:type_name -> azdext.TargetResource 0, // 40: azdext.ServiceTargetService.Stream:input_type -> azdext.ServiceTargetMessage 0, // 41: azdext.ServiceTargetService.Stream:output_type -> azdext.ServiceTargetMessage 41, // [41:42] is the sub-list for method output_type @@ -1848,6 +1793,7 @@ func file_service_target_proto_init() { return } file_models_proto_init() + file_errors_proto_init() file_service_target_proto_msgTypes[0].OneofWrappers = []any{ (*ServiceTargetMessage_RegisterServiceTargetRequest)(nil), (*ServiceTargetMessage_RegisterServiceTargetResponse)(nil), @@ -1871,7 +1817,7 @@ func file_service_target_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_service_target_proto_rawDesc), len(file_service_target_proto_rawDesc)), NumEnums: 0, - NumMessages: 28, + NumMessages: 27, NumExtensions: 0, NumServices: 1, }, diff --git a/cli/azd/pkg/azdext/service_target_envelope.go b/cli/azd/pkg/azdext/service_target_envelope.go index 5ed150a618a..1660d83fd2c 100644 --- a/cli/azd/pkg/azdext/service_target_envelope.go +++ b/cli/azd/pkg/azdext/service_target_envelope.go @@ -5,7 +5,6 @@ package azdext import ( "context" - "errors" "github.com/azure/azure-dev/cli/azd/pkg/grpcbroker" ) @@ -32,23 +31,16 @@ func (ops *ServiceTargetEnvelope) SetRequestId(ctx context.Context, msg *Service msg.RequestId = id } -// GetError returns the error from the message as a Go error type +// GetError returns the error from the message as a Go error type. +// It returns a typed error based on the ErrorOrigin that preserves structured information for telemetry. func (ops *ServiceTargetEnvelope) GetError(msg *ServiceTargetMessage) error { - if msg.Error == nil || msg.Error.Message == "" { - return nil - } - return errors.New(msg.Error.Message) + return UnwrapError(msg.Error) } -// SetError sets an error on the message +// SetError sets an error on the message. +// It detects the error type and populates the appropriate source details. func (ops *ServiceTargetEnvelope) SetError(msg *ServiceTargetMessage, err error) { - if err == nil { - msg.Error = nil - return - } - msg.Error = &ServiceTargetErrorMessage{ - Message: err.Error(), - } + msg.Error = WrapError(err) } // GetInnerMessage returns the inner message from the oneof field diff --git a/cli/azd/pkg/grpcbroker/message_broker.go b/cli/azd/pkg/grpcbroker/message_broker.go index 8a553c09694..740f6892a3b 100644 --- a/cli/azd/pkg/grpcbroker/message_broker.go +++ b/cli/azd/pkg/grpcbroker/message_broker.go @@ -206,6 +206,8 @@ func (mb *MessageBroker[TMessage]) SendAndWait(ctx context.Context, msg *TMessag // Send request in goroutine to ensure we're waiting before response arrives errCh := make(chan error, 1) go func() { + mb.sendMu.Lock() + defer mb.sendMu.Unlock() errCh <- mb.stream.Send(msg) }() @@ -312,6 +314,8 @@ func (mb *MessageBroker[TMessage]) SendAndWaitWithProgress( log.Printf("[%s] [RequestId=%s] Sending request, MessageType=%v", mb.name, requestId, msgType) errCh := make(chan error, 1) go func() { + mb.sendMu.Lock() + defer mb.sendMu.Unlock() errCh <- mb.stream.Send(msg) }()