Skip to content
Snippets Groups Projects
assignForwardingHandler.go 2.61 KiB
Newer Older
  • Learn to ignore specific revisions
  • package kmsHandler
    
    Malte Bauch's avatar
    Malte Bauch committed
    
    import (
    	"fmt"
    
    
    	"code.fbi.h-da.de/danet/gnmi-target/handler"
    
    	"code.fbi.h-da.de/danet/quant/goKMS/kms"
    	gnmitargetygot "code.fbi.h-da.de/danet/quant/goKMS/model"
    
    Malte Bauch's avatar
    Malte Bauch committed
    	"github.com/openconfig/gnmi/proto/gnmi"
    	"github.com/openconfig/ygot/ygot"
    
    	log "github.com/sirupsen/logrus"
    
    Malte Bauch's avatar
    Malte Bauch committed
    )
    
    // AssignForwardingHandler is the implementation of a gnmitarget.PathHandler.
    type AssignForwardingHandler struct {
    
    	handler.DefaultPathHandler
    
    	kms *kms.KMS
    
    Malte Bauch's avatar
    Malte Bauch committed
    }
    
    
    func NewAssignForwardingHandler(kms *kms.KMS) *AssignForwardingHandler {
    
    Malte Bauch's avatar
    Malte Bauch committed
    	return &AssignForwardingHandler{
    
    		DefaultPathHandler: handler.DefaultPathHandler{
    			Name: "kms-assign-forwarding-handler",
    			Paths: map[string]struct{}{
    				"/assign-forwarding": {},
    			},
    
    Malte Bauch's avatar
    Malte Bauch committed
    		},
    
    Malte Bauch's avatar
    Malte Bauch committed
    	}
    }
    
    
    func (yh *AssignForwardingHandler) Init(config *handler.Config, publishToSubsFunc func([]*gnmi.Notification) error) error {
    
    Malte Bauch's avatar
    Malte Bauch committed
    	// A initialization is not needed for this handler. The default startup has
    	// no assign forwarding applied.
    
    	yh.Config = config
    	yh.PublishToSubs = publishToSubsFunc
    
    
    Malte Bauch's avatar
    Malte Bauch committed
    	return nil
    }
    
    func (yh *AssignForwardingHandler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi.Update) error {
    	config, ok := c.(*gnmitargetygot.Gnmitarget)
    	if !ok {
    		return fmt.Errorf("failed type assertion for newConfig %T", (*gnmitargetygot.Gnmitarget)(nil))
    	}
    
    	forwarding := config.GetOrCreateAssignForwarding()
    
    
    	pathId := forwarding.GetPathId()
    	nextHop := forwarding.GetNextHop()
    	prevHop := forwarding.GetPrevHop()
    
    Malte Bauch's avatar
    Malte Bauch committed
    
    	var nextHopString string
    	var prevHopString string
    
    	var initiatingKmsAddressString string
    
    Malte Bauch's avatar
    Malte Bauch committed
    
    
    	if nextHop != nil {
    		nextHopString = nextHop.GetNodeId()
    
    Malte Bauch's avatar
    Malte Bauch committed
    	}
    
    	if prevHop != nil {
    		prevHopString = prevHop.GetNodeId()
    
    Malte Bauch's avatar
    Malte Bauch committed
    	}
    
    
    	// check if initiating kms address is set
    	if initiatingKmsAddress := forwarding.GetInitiatingKmsAddress(); initiatingKmsAddress != nil {
    
    		addressPrefix := ""
    		if initiatingKmsAddress.GetIpAddress() != "" {
    			addressPrefix = initiatingKmsAddress.GetIpAddress()
    		} else if initiatingKmsAddress.GetHostname() != "" {
    			addressPrefix = initiatingKmsAddress.GetHostname()
    		} else {
    			log.Error("initiatingKmsAddress must have either an IP address or a hostname")
    			return fmt.Errorf("initiatingKmsAddress must have either an IP address or a hostname")
    		}
    		initiatingKmsAddressString = fmt.Sprintf("%s:%d", addressPrefix, initiatingKmsAddress.GetPort())
    
    		initKMS = &kms.RemoteKMS{
    			Id:      initiatingKmsAddress.GetNodeId(),
    			Address: initiatingKmsAddressString,
    
    			Port:    initiatingKmsAddress.GetPort(),
    
    	if err := yh.kms.AssignForwardingRoute(pathId, prevHopString, nextHopString, initKMS); err != nil {
    
    Malte Bauch's avatar
    Malte Bauch committed
    		return err
    	}
    
    	return nil
    }