diff --git a/build/images/codegen/Dockerfile b/build/images/codegen/Dockerfile index 4455efe4b3c..1f794c12431 100644 --- a/build/images/codegen/Dockerfile +++ b/build/images/codegen/Dockerfile @@ -18,7 +18,7 @@ FROM ubuntu:22.04 as protoc RUN apt-get update && \ apt-get install -y --no-install-recommends wget ca-certificates unzip -RUN PROTOBUF_VERSION=3.0.2; ZIPNAME="protoc-${PROTOBUF_VERSION}-linux-x86_64.zip"; \ +RUN PROTOBUF_VERSION=26.0; ZIPNAME="protoc-${PROTOBUF_VERSION}-linux-x86_64.zip"; \ mkdir /tmp/protoc && cd /tmp/protoc && \ wget "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOBUF_VERSION}/${ZIPNAME}" && \ unzip "${ZIPNAME}" && \ @@ -47,7 +47,8 @@ RUN go install k8s.io/code-generator/cmd/client-gen@kubernetes-$K8S_VERSION && \ go install k8s.io/code-generator/cmd/go-to-protobuf@kubernetes-$K8S_VERSION && \ go install k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo@kubernetes-$K8S_VERSION && \ go install go.uber.org/mock/mockgen@v0.3.0 && \ - go install github.com/golang/protobuf/protoc-gen-go@v1.5.2 && \ + go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0 && \ + go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0 && \ go install golang.org/x/tools/cmd/goimports@latest && \ go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.9.0 diff --git a/build/images/codegen/README.md b/build/images/codegen/README.md index 738873cfeeb..aa1e06a3f82 100644 --- a/build/images/codegen/README.md +++ b/build/images/codegen/README.md @@ -16,10 +16,13 @@ docker push antrea/codegen: The `docker push` command will fail if you do not have permission to push to the `antrea` Dockerhub repository. +The image can only be built on an x86_64 machine (no arm support). + Here is the table of codegen images that have been uploaded: | Tag | Change | | :----------------------------- | ---------------------------------------------------- | +| kubernetes-1.29.2-build.0 | Upgraded protoc (v26.0), protoc-gen-go (v1.33.0), protoc-gen-go-grpc (v1.3.0) | | kubernetes-1.29.2 | Upgraded K8s libraries to v1.29.2 | | kubernetes-1.26.4-build.1 | Replace github.com/golang/mock with go.uber.org/mock | | kubernetes-1.26.4-build.0 | Upgraded Go to v1.21 | diff --git a/docs/contributors/code-generation.md b/docs/contributors/code-generation.md index c9b68acbc52..faf6b2c9701 100644 --- a/docs/contributors/code-generation.md +++ b/docs/contributors/code-generation.md @@ -2,8 +2,8 @@ ## CNI -Antrea uses [protoc](https://github.com/protocolbuffers/protobuf) and [protoc-gen-go]( -https://github.com/golang/protobuf) to generate CNI gRPC service code. +Antrea uses [protoc](https://github.com/protocolbuffers/protobuf), [protoc-gen-go](https://github.com/protocolbuffers/protobuf-go) +and [protoc-gen-go-grpc](https://github.com/grpc/grpc-go) to generate CNI gRPC service code. If you make any change to [cni.proto](../../pkg/apis/cni/v1beta1/cni.proto), you can re-generate the code by invoking `make codegen`. diff --git a/go.mod b/go.mod index 0aaecaa2c33..f1592fc884f 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,6 @@ require ( github.com/gammazero/deque v0.1.2 github.com/go-logr/logr v1.4.1 github.com/gogo/protobuf v1.3.2 - github.com/golang/protobuf v1.5.3 github.com/google/btree v1.1.2 github.com/google/uuid v1.6.0 github.com/hashicorp/memberlist v0.5.1 @@ -139,6 +138,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/google/cel-go v0.17.7 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect diff --git a/hack/update-codegen-dockerized.sh b/hack/update-codegen-dockerized.sh index 9da35dc0e85..0ae6569eef0 100755 --- a/hack/update-codegen-dockerized.sh +++ b/hack/update-codegen-dockerized.sh @@ -85,7 +85,7 @@ fi function generate_antrea_client_code { # Generate protobuf code for CNI gRPC service with protoc. - protoc --go_out=plugins=grpc:. pkg/apis/cni/v1beta1/cni.proto + protoc --go_out=. --go-grpc_out=. pkg/apis/cni/v1beta1/cni.proto # Generate clientset and apis code with K8s codegen tools. $GOPATH/bin/client-gen \ diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index d5d66efb1f8..125545e340b 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -18,7 +18,7 @@ set -o errexit set -o pipefail ANTREA_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )" -IMAGE_NAME="antrea/codegen:kubernetes-1.29.2" +IMAGE_NAME="antrea/codegen:kubernetes-1.29.2-build.0" # Recent versions of Git will not access .git directories which are owned by # another user (as a security measure), unless the directories are explicitly diff --git a/multicluster/hack/update-codegen.sh b/multicluster/hack/update-codegen.sh index 35a9c3ff230..71b6da6f5b8 100755 --- a/multicluster/hack/update-codegen.sh +++ b/multicluster/hack/update-codegen.sh @@ -18,7 +18,7 @@ set -o errexit set -o pipefail ANTREA_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../" && pwd )" -IMAGE_NAME="antrea/codegen:kubernetes-1.29.2" +IMAGE_NAME="antrea/codegen:kubernetes-1.29.2-build.0" # Recent versions of Git will not access .git directories which are owned by # another user (as a security measure), unless the directories are explicitly diff --git a/pkg/agent/cniserver/server.go b/pkg/agent/cniserver/server.go index cec67536c14..17066a41ed0 100644 --- a/pkg/agent/cniserver/server.go +++ b/pkg/agent/cniserver/server.go @@ -102,6 +102,11 @@ func (arbitrator *containerAccessArbitrator) unlockContainer(containerKey string } type CNIServer struct { + // CNIServer must embed UnimplementedCniServer. It is required by the code generated by + // protoc-gen-go-grpc (although it is possible to opt-out). It technically enables + // forward-compatibility when new methods are added to the gRPC service but are not + // implemented yet. + cnipb.UnimplementedCniServer cniSocket string serverVersion string nodeConfig *config.NodeConfig diff --git a/pkg/apis/cni/v1beta1/cni.pb.go b/pkg/apis/cni/v1beta1/cni.pb.go index 4acc4b5302a..9e13ddb6b64 100644 --- a/pkg/apis/cni/v1beta1/cni.pb.go +++ b/pkg/apis/cni/v1beta1/cni.pb.go @@ -14,20 +14,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 -// protoc (unknown) +// protoc-gen-go v1.33.0 +// protoc v5.26.0 // source: pkg/apis/cni/v1beta1/cni.proto package v1beta1 import ( - context "context" - any1 "github.com/golang/protobuf/ptypes/any" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" ) @@ -262,9 +258,9 @@ type Error struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=antrea_io.antrea.pkg.apis.cni.v1beta1.ErrorCode" json:"code,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - Details []*any1.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` + Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=antrea_io.antrea.pkg.apis.cni.v1beta1.ErrorCode" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Details []*anypb.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` } func (x *Error) Reset() { @@ -313,7 +309,7 @@ func (x *Error) GetMessage() string { return "" } -func (x *Error) GetDetails() []*any1.Any { +func (x *Error) GetDetails() []*anypb.Any { if x != nil { return x.Details } @@ -489,7 +485,7 @@ var file_pkg_apis_cni_v1beta1_cni_proto_goTypes = []interface{}{ (*CniCmdRequest)(nil), // 2: antrea_io.antrea.pkg.apis.cni.v1beta1.CniCmdRequest (*Error)(nil), // 3: antrea_io.antrea.pkg.apis.cni.v1beta1.Error (*CniCmdResponse)(nil), // 4: antrea_io.antrea.pkg.apis.cni.v1beta1.CniCmdResponse - (*any1.Any)(nil), // 5: google.protobuf.Any + (*anypb.Any)(nil), // 5: google.protobuf.Any } var file_pkg_apis_cni_v1beta1_cni_proto_depIdxs = []int32{ 1, // 0: antrea_io.antrea.pkg.apis.cni.v1beta1.CniCmdRequest.cni_args:type_name -> antrea_io.antrea.pkg.apis.cni.v1beta1.CniCmdArgs @@ -584,155 +580,3 @@ func file_pkg_apis_cni_v1beta1_cni_proto_init() { file_pkg_apis_cni_v1beta1_cni_proto_goTypes = nil file_pkg_apis_cni_v1beta1_cni_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// CniClient is the client API for Cni service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type CniClient interface { - CmdAdd(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) - CmdCheck(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) - CmdDel(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) -} - -type cniClient struct { - cc grpc.ClientConnInterface -} - -func NewCniClient(cc grpc.ClientConnInterface) CniClient { - return &cniClient{cc} -} - -func (c *cniClient) CmdAdd(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { - out := new(CniCmdResponse) - err := c.cc.Invoke(ctx, "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdAdd", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *cniClient) CmdCheck(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { - out := new(CniCmdResponse) - err := c.cc.Invoke(ctx, "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdCheck", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *cniClient) CmdDel(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { - out := new(CniCmdResponse) - err := c.cc.Invoke(ctx, "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdDel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// CniServer is the server API for Cni service. -type CniServer interface { - CmdAdd(context.Context, *CniCmdRequest) (*CniCmdResponse, error) - CmdCheck(context.Context, *CniCmdRequest) (*CniCmdResponse, error) - CmdDel(context.Context, *CniCmdRequest) (*CniCmdResponse, error) -} - -// UnimplementedCniServer can be embedded to have forward compatible implementations. -type UnimplementedCniServer struct { -} - -func (*UnimplementedCniServer) CmdAdd(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CmdAdd not implemented") -} -func (*UnimplementedCniServer) CmdCheck(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CmdCheck not implemented") -} -func (*UnimplementedCniServer) CmdDel(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CmdDel not implemented") -} - -func RegisterCniServer(s *grpc.Server, srv CniServer) { - s.RegisterService(&_Cni_serviceDesc, srv) -} - -func _Cni_CmdAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CniCmdRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CniServer).CmdAdd(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdAdd", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CniServer).CmdAdd(ctx, req.(*CniCmdRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Cni_CmdCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CniCmdRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CniServer).CmdCheck(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdCheck", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CniServer).CmdCheck(ctx, req.(*CniCmdRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Cni_CmdDel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CniCmdRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CniServer).CmdDel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdDel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CniServer).CmdDel(ctx, req.(*CniCmdRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Cni_serviceDesc = grpc.ServiceDesc{ - ServiceName: "antrea_io.antrea.pkg.apis.cni.v1beta1.Cni", - HandlerType: (*CniServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CmdAdd", - Handler: _Cni_CmdAdd_Handler, - }, - { - MethodName: "CmdCheck", - Handler: _Cni_CmdCheck_Handler, - }, - { - MethodName: "CmdDel", - Handler: _Cni_CmdDel_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "pkg/apis/cni/v1beta1/cni.proto", -} diff --git a/pkg/apis/cni/v1beta1/cni_grpc.pb.go b/pkg/apis/cni/v1beta1/cni_grpc.pb.go new file mode 100644 index 00000000000..3c9854c4902 --- /dev/null +++ b/pkg/apis/cni/v1beta1/cni_grpc.pb.go @@ -0,0 +1,197 @@ +// Copyright 2019 Antrea Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v5.26.0 +// source: pkg/apis/cni/v1beta1/cni.proto + +package v1beta1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Cni_CmdAdd_FullMethodName = "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdAdd" + Cni_CmdCheck_FullMethodName = "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdCheck" + Cni_CmdDel_FullMethodName = "/antrea_io.antrea.pkg.apis.cni.v1beta1.Cni/CmdDel" +) + +// CniClient is the client API for Cni service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type CniClient interface { + CmdAdd(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) + CmdCheck(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) + CmdDel(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) +} + +type cniClient struct { + cc grpc.ClientConnInterface +} + +func NewCniClient(cc grpc.ClientConnInterface) CniClient { + return &cniClient{cc} +} + +func (c *cniClient) CmdAdd(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { + out := new(CniCmdResponse) + err := c.cc.Invoke(ctx, Cni_CmdAdd_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cniClient) CmdCheck(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { + out := new(CniCmdResponse) + err := c.cc.Invoke(ctx, Cni_CmdCheck_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cniClient) CmdDel(ctx context.Context, in *CniCmdRequest, opts ...grpc.CallOption) (*CniCmdResponse, error) { + out := new(CniCmdResponse) + err := c.cc.Invoke(ctx, Cni_CmdDel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// CniServer is the server API for Cni service. +// All implementations must embed UnimplementedCniServer +// for forward compatibility +type CniServer interface { + CmdAdd(context.Context, *CniCmdRequest) (*CniCmdResponse, error) + CmdCheck(context.Context, *CniCmdRequest) (*CniCmdResponse, error) + CmdDel(context.Context, *CniCmdRequest) (*CniCmdResponse, error) + mustEmbedUnimplementedCniServer() +} + +// UnimplementedCniServer must be embedded to have forward compatible implementations. +type UnimplementedCniServer struct { +} + +func (UnimplementedCniServer) CmdAdd(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CmdAdd not implemented") +} +func (UnimplementedCniServer) CmdCheck(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CmdCheck not implemented") +} +func (UnimplementedCniServer) CmdDel(context.Context, *CniCmdRequest) (*CniCmdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CmdDel not implemented") +} +func (UnimplementedCniServer) mustEmbedUnimplementedCniServer() {} + +// UnsafeCniServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to CniServer will +// result in compilation errors. +type UnsafeCniServer interface { + mustEmbedUnimplementedCniServer() +} + +func RegisterCniServer(s grpc.ServiceRegistrar, srv CniServer) { + s.RegisterService(&Cni_ServiceDesc, srv) +} + +func _Cni_CmdAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CniCmdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CniServer).CmdAdd(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Cni_CmdAdd_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CniServer).CmdAdd(ctx, req.(*CniCmdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cni_CmdCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CniCmdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CniServer).CmdCheck(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Cni_CmdCheck_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CniServer).CmdCheck(ctx, req.(*CniCmdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cni_CmdDel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CniCmdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CniServer).CmdDel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Cni_CmdDel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CniServer).CmdDel(ctx, req.(*CniCmdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Cni_ServiceDesc is the grpc.ServiceDesc for Cni service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Cni_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "antrea_io.antrea.pkg.apis.cni.v1beta1.Cni", + HandlerType: (*CniServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CmdAdd", + Handler: _Cni_CmdAdd_Handler, + }, + { + MethodName: "CmdCheck", + Handler: _Cni_CmdCheck_Handler, + }, + { + MethodName: "CmdDel", + Handler: _Cni_CmdDel_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "pkg/apis/cni/v1beta1/cni.proto", +}