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 }