From 8a2c9084ba3aba3993bf694fe0996b7a2decb591 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Mon, 27 Nov 2023 01:45:32 +0100 Subject: [PATCH] fix(hubl): improve error in chain (#18550) --- tools/hubl/internal/compat.go | 28 +++++++++++++++------------- tools/hubl/internal/remote.go | 12 +++++++++++- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/tools/hubl/internal/compat.go b/tools/hubl/internal/compat.go index 87b519db3c..463bb4889f 100644 --- a/tools/hubl/internal/compat.go +++ b/tools/hubl/internal/compat.go @@ -42,7 +42,7 @@ func loadFileDescriptorsGRPCReflection(ctx context.Context, client *grpc.ClientC } fdMap := map[string]*descriptorpb.FileDescriptorProto{} - waitListServiceRes := make(chan *grpc_reflection_v1alpha.ListServiceResponse) + waitListServiceRes := make(chan *grpc_reflection_v1alpha.ListServiceResponse) //nolint:staticcheck // we want to use the deprecated field waitc := make(chan struct{}) go func() { for { @@ -60,14 +60,14 @@ func loadFileDescriptorsGRPCReflection(ctx context.Context, client *grpc.ClientC case *grpc_reflection_v1alpha.ServerReflectionResponse_ErrorResponse: panic(err) case *grpc_reflection_v1alpha.ServerReflectionResponse_ListServicesResponse: - waitListServiceRes <- res.ListServicesResponse + waitListServiceRes <- res.ListServicesResponse //nolint:staticcheck // we want to use the deprecated field case *grpc_reflection_v1alpha.ServerReflectionResponse_FileDescriptorResponse: - processFileDescriptorsResponse(res, fdMap) + _ = processFileDescriptorsResponse(res, fdMap) } } }() - if err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ + if err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ //nolint:staticcheck // we want to use the deprecated field MessageRequest: &grpc_reflection_v1alpha.ServerReflectionRequest_ListServices{}, }); err != nil { return nil, err @@ -75,10 +75,10 @@ func loadFileDescriptorsGRPCReflection(ctx context.Context, client *grpc.ClientC listServiceRes := <-waitListServiceRes - for _, response := range listServiceRes.Service { - err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ + for _, response := range listServiceRes.Service { //nolint:staticcheck // we want to use the deprecated field + err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ //nolint:staticcheck // we want to use the deprecated field MessageRequest: &grpc_reflection_v1alpha.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: response.Name, + FileContainingSymbol: response.Name, //nolint:staticcheck // we want to use the deprecated field }, }) if err != nil { @@ -87,7 +87,7 @@ func loadFileDescriptorsGRPCReflection(ctx context.Context, client *grpc.ClientC } for _, msgName := range interfaceImplNames { - err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ + err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ //nolint:staticcheck // we want to use the deprecated field MessageRequest: &grpc_reflection_v1alpha.ServerReflectionRequest_FileContainingSymbol{ FileContainingSymbol: msgName, }, @@ -136,16 +136,18 @@ func loadFileDescriptorsGRPCReflection(ctx context.Context, client *grpc.ClientC return fdSet, nil } -func processFileDescriptorsResponse(res *grpc_reflection_v1alpha.ServerReflectionResponse_FileDescriptorResponse, fdMap map[string]*descriptorpb.FileDescriptorProto) { - for _, bz := range res.FileDescriptorResponse.FileDescriptorProto { +func processFileDescriptorsResponse(res *grpc_reflection_v1alpha.ServerReflectionResponse_FileDescriptorResponse, fdMap map[string]*descriptorpb.FileDescriptorProto) error { + for _, bz := range res.FileDescriptorResponse.FileDescriptorProto { //nolint:staticcheck // we want to use the deprecated field fd := &descriptorpb.FileDescriptorProto{} err := proto.Unmarshal(bz, fd) if err != nil { - panic(err) + return fmt.Errorf("error unmarshalling file descriptor: %w", err) } fdMap[fd.GetName()] = fd } + + return nil } func missingFileDescriptors(fdMap map[string]*descriptorpb.FileDescriptorProto, cantFind map[string]bool) []string { @@ -180,13 +182,13 @@ func addMissingFileDescriptors(ctx context.Context, client *grpc.ClientConn, fdM } if res, ok := in.MessageResponse.(*grpc_reflection_v1alpha.ServerReflectionResponse_FileDescriptorResponse); ok { - processFileDescriptorsResponse(res, fdMap) + _ = processFileDescriptorsResponse(res, fdMap) } } }() for _, file := range missingFiles { - err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ + err = reflectClient.Send(&grpc_reflection_v1alpha.ServerReflectionRequest{ //nolint:staticcheck // we want to use the deprecated field MessageRequest: &grpc_reflection_v1alpha.ServerReflectionRequest_FileByFilename{ FileByFilename: file, }, diff --git a/tools/hubl/internal/remote.go b/tools/hubl/internal/remote.go index b1eb76baf3..06af037684 100644 --- a/tools/hubl/internal/remote.go +++ b/tools/hubl/internal/remote.go @@ -130,7 +130,17 @@ func RemoteCommand(config *config.Config, configDir string) ([]*cobra.Command, e chainCmd.AddCommand(KeyringCmd(chainInfo.Chain)) if err := appOpts.EnhanceRootCommandWithBuilder(chainCmd, builder); err != nil { - return nil, err + // when enriching the command with autocli fails, we add a command that + // will print the error and allow the user to reconfigure the chain instead + chainCmd.RunE = func(cmd *cobra.Command, args []string) error { + cmd.Printf("Error while loading AutoCLI data for %s: %+v\n", chain, err) + cmd.Printf("Attempt to reconfigure the chain using the %s flag\n", flags.FlagConfig) + if cmd.Flags().Changed(flags.FlagConfig) { + return reconfigure(cmd, config, configDir, chain) + } + + return nil + } } commands = append(commands, chainCmd)