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  }