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