go.ligato.io/vpp-agent/v3@v3.5.0/examples/tutorials/05_kv-scheduler/descriptors.go (about)

     1  package main
     2  
     3  import (
     4  	"strings"
     5  
     6  	"go.ligato.io/cn-infra/v2/logging"
     7  	"google.golang.org/protobuf/proto"
     8  
     9  	"go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/adapter"
    10  	"go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/model"
    11  	"go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api"
    12  )
    13  
    14  /* Interface Descriptor */
    15  
    16  const (
    17  	ifDescriptorName = "if-descriptor"
    18  	ifPrefix         = "/interface/"
    19  )
    20  
    21  // NewIfDescriptor creates a new instance of the descriptor
    22  func NewIfDescriptor(logger logging.PluginLogger) *api.KVDescriptor {
    23  	// convert typed descriptor into generic descriptor API using adapter
    24  	typedDescriptor := &adapter.InterfaceDescriptor{
    25  		// Descriptor name, must be unique across all descriptors
    26  		Name: ifDescriptorName,
    27  		// Prefix for the descriptor-specific configuration
    28  		NBKeyPrefix: ifPrefix,
    29  		// A string value defining descriptor type
    30  		ValueTypeName: string(proto.MessageName(&model.Interface{})),
    31  		// A unique identifier of the configuration (name, label)
    32  		KeyLabel: func(key string) string {
    33  			return strings.TrimPrefix(key, ifPrefix)
    34  		},
    35  		// Returns true if the provided key is relevant for this descriptor is some way
    36  		KeySelector: func(key string) bool {
    37  			if strings.HasPrefix(key, ifPrefix) {
    38  				return true
    39  			}
    40  			return false
    41  		},
    42  		// Enables metadata in the KV scheduler
    43  		WithMetadata: true,
    44  		// Add a new configuration item
    45  		Create: func(key string, value *model.Interface) (metadata interface{}, err error) {
    46  			logger.Infof("Interface %s created", value.Name)
    47  			// Return interface name so the scheduler remembers it
    48  			return value.Name, nil
    49  		},
    50  	}
    51  	return adapter.NewInterfaceDescriptor(typedDescriptor)
    52  }
    53  
    54  /* Route Descriptor */
    55  
    56  const (
    57  	routeDescriptorName    = "route-descriptor"
    58  	routePrefix            = "/route/"
    59  	routeInterfaceDepLabel = "route-interface"
    60  )
    61  
    62  // RouteDescriptor is a descriptor object with
    63  type RouteDescriptor struct {
    64  	// dependencies
    65  	log logging.PluginLogger
    66  }
    67  
    68  // GetDescriptor returns type safe descriptor structure
    69  func NewRouteDescriptor(logger logging.PluginLogger) *api.KVDescriptor {
    70  	descriptorCtx := &RouteDescriptor{
    71  		log: logger,
    72  	}
    73  	typedDescriptor := &adapter.RouteDescriptor{
    74  		// Descriptor name, must be unique across all descriptors
    75  		Name: routeDescriptorName,
    76  		// Prefix for the descriptor-specific configuration
    77  		NBKeyPrefix: routePrefix,
    78  		// A string value defining descriptor type
    79  		ValueTypeName: string(proto.MessageName(&model.Route{})),
    80  		// A unique identifier of the configuration (name, label)
    81  		KeyLabel: descriptorCtx.KeyLabel,
    82  		// Returns true if the provided key is relevant for this descriptor is some way
    83  		KeySelector: descriptorCtx.KeySelector,
    84  		// All other keys that must exist before the item is configured
    85  		Dependencies: descriptorCtx.Dependencies,
    86  		// A list of descriptors expected to handle dependencies
    87  		RetrieveDependencies: []string{ifDescriptorName},
    88  		// Add a new configuration item
    89  		Create: descriptorCtx.Create,
    90  	}
    91  	return adapter.NewRouteDescriptor(typedDescriptor)
    92  }
    93  
    94  func (d *RouteDescriptor) KeyLabel(key string) string {
    95  	return strings.TrimPrefix(key, routePrefix)
    96  }
    97  
    98  func (d *RouteDescriptor) KeySelector(key string) bool {
    99  	if strings.HasPrefix(key, routePrefix) {
   100  		return true
   101  	}
   102  	return false
   103  }
   104  
   105  func (d *RouteDescriptor) Dependencies(key string, value *model.Route) []api.Dependency {
   106  	return []api.Dependency{
   107  		{
   108  			Label: routeInterfaceDepLabel,
   109  			Key:   ifPrefix + value.InterfaceName,
   110  		},
   111  	}
   112  }
   113  
   114  func (d *RouteDescriptor) Create(key string, value *model.Route) (metadata interface{}, err error) {
   115  	d.log.Infof("Created route %s dependent on interface %s", value.Name, value.InterfaceName)
   116  	return nil, nil
   117  }