github.com/openshift/dpu-operator@v0.0.0-20240502153209-3af840d137c2/daemon/plugin/vendorplugin.go (about) 1 package plugin 2 3 import ( 4 "context" 5 "net" 6 7 "github.com/go-logr/logr" 8 pb "github.com/openshift/dpu-operator/dpu-api/gen" 9 "github.com/openshift/dpu-operator/dpu-cni/pkgs/cnitypes" 10 opi "github.com/opiproject/opi-api/network/evpn-gw/v1alpha1/gen/go" 11 "google.golang.org/grpc" 12 "google.golang.org/grpc/credentials/insecure" 13 ctrl "sigs.k8s.io/controller-runtime" 14 ) 15 16 const ( 17 VendorPluginSocketPath string = cnitypes.DaemonBaseDir + "vendor-plugin/vendor-plugin.sock" 18 ) 19 20 type VendorPlugin interface { 21 Start() (string, int32, error) 22 Stop() 23 CreateBridgePort(bpr *opi.CreateBridgePortRequest) (*opi.BridgePort, error) 24 DeleteBridgePort(bpr *opi.DeleteBridgePortRequest) error 25 } 26 27 type GrpcPlugin struct { 28 log logr.Logger 29 client pb.LifeCycleServiceClient 30 opiClient opi.BridgePortServiceClient 31 dpuMode bool 32 conn *grpc.ClientConn 33 } 34 35 func (g *GrpcPlugin) Start() (string, int32, error) { 36 g.ensureConnected() 37 ipPort, err := g.client.Init(context.TODO(), &pb.InitRequest{DpuMode: g.dpuMode}) 38 39 if err != nil { 40 g.log.Error(err, "Failed to start serving") 41 return "", 0, err 42 } 43 44 return ipPort.Ip, ipPort.Port, nil 45 } 46 47 func (g *GrpcPlugin) Stop() { 48 g.conn.Close() 49 } 50 51 func NewGrpcPlugin(dpuMode bool) *GrpcPlugin { 52 return &GrpcPlugin{ 53 dpuMode: dpuMode, 54 log: ctrl.Log.WithName("GrpcPlugin"), 55 } 56 } 57 58 func (g *GrpcPlugin) ensureConnected() error { 59 if g.client != nil { 60 return nil 61 } 62 dialOptions := []grpc.DialOption{ 63 grpc.WithTransportCredentials(insecure.NewCredentials()), 64 grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) { 65 return net.Dial("unix", addr) 66 }), 67 } 68 69 conn, err := grpc.DialContext(context.Background(), VendorPluginSocketPath, dialOptions...) 70 71 if err != nil { 72 g.log.Error(err, "Failed to connect to vendor plugin") 73 return err 74 } 75 g.conn = conn 76 77 g.client = pb.NewLifeCycleServiceClient(conn) 78 g.opiClient = opi.NewBridgePortServiceClient(conn) 79 return nil 80 } 81 82 func (g *GrpcPlugin) CreateBridgePort(createRequest *opi.CreateBridgePortRequest) (*opi.BridgePort, error) { 83 g.ensureConnected() 84 return g.opiClient.CreateBridgePort(context.TODO(), createRequest) 85 } 86 87 func (g *GrpcPlugin) DeleteBridgePort(deleteRequest *opi.DeleteBridgePortRequest) error { 88 g.ensureConnected() 89 _, err := g.opiClient.DeleteBridgePort(context.TODO(), deleteRequest) 90 return err 91 }