From 8f59337671c603c43233c86e06160cdd90f9c16b Mon Sep 17 00:00:00 2001 From: walnuts1018 Date: Thu, 29 Aug 2024 09:46:41 +0900 Subject: [PATCH] implement pona cmdAdd Signed-off-by: walnuts1018 --- cmd/pona/main.go | 22 +++++++++++++++++++--- cmd/pona/rpc.go | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cmd/pona/main.go b/cmd/pona/main.go index 23e99c4..fa9477d 100644 --- a/cmd/pona/main.go +++ b/cmd/pona/main.go @@ -7,6 +7,8 @@ import ( "github.com/containernetworking/cni/pkg/skel" "github.com/containernetworking/cni/pkg/types" + cni100 "github.com/containernetworking/cni/pkg/types/100" + "github.com/containernetworking/cni/pkg/version" "github.com/cybozu-go/pona" "github.com/cybozu-go/pona/pkg/cni" @@ -36,12 +38,26 @@ func cmdAdd(args *skel.CmdArgs) error { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) defer cancel() - resp, err := client.Add(ctx, cni) + resp, err := client.Add(ctx, cniArgs) + if err != nil { + return convertError(err) + } + + result, err := cni100.NewResult(resp.Result) + if err != nil { + return types.NewError(types.ErrDecodingFailure, "failed to unmarshal result", err.Error()) + } + + return types.PrintResult(result, conf.CNIVersion) } -func cmdDel(args *skel.CmdArgs) error +func cmdDel(args *skel.CmdArgs) error { + return nil +} -func cmdCheck(args *skel.CmdArgs) error +func cmdCheck(args *skel.CmdArgs) error { + return nil +} func main() { skel.PluginMainFuncs(skel.CNIFuncs{Add: cmdAdd, Del: cmdDel, Check: cmdCheck, GC: nil, Status: nil}, version.PluginSupports("0.3.1", "0.4.0", "1.0.0"), fmt.Sprintf("coil %s", pona.Version)) diff --git a/cmd/pona/rpc.go b/cmd/pona/rpc.go index 09745b3..b1c7d1e 100644 --- a/cmd/pona/rpc.go +++ b/cmd/pona/rpc.go @@ -12,6 +12,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/resolver" + "google.golang.org/grpc/status" ) // PluginEnvArgs represents CNI_ARG @@ -59,3 +60,19 @@ func connect(sockPath string) (*grpc.ClientConn, error) { } return conn, nil } + +// convertError turns err returned from gRPC library into CNI's types.Error +func convertError(err error) error { + st := status.Convert(err) + details := st.Details() + if len(details) != 1 { + return types.NewError(types.ErrInternal, st.Message(), err.Error()) + } + + cniErr, ok := details[0].(*cnirpc.CNIError) + if !ok { + types.NewError(types.ErrInternal, st.Message(), err.Error()) + } + + return types.NewError(uint(cniErr.Code), cniErr.Msg, cniErr.Details) +}