go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/l2plugin/descriptor/bd_interface.go (about) 1 // Copyright (c) 2018 Cisco and/or its affiliates. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package descriptor 16 17 import ( 18 "github.com/pkg/errors" 19 "go.ligato.io/cn-infra/v2/logging" 20 "google.golang.org/protobuf/proto" 21 22 "go.ligato.io/vpp-agent/v3/pkg/idxvpp" 23 kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 24 "go.ligato.io/vpp-agent/v3/plugins/vpp/l2plugin/descriptor/adapter" 25 "go.ligato.io/vpp-agent/v3/plugins/vpp/l2plugin/vppcalls" 26 interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" 27 l2 "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l2" 28 ) 29 30 const ( 31 // BDInterfaceDescriptorName is the name of the descriptor for bindings between 32 // VPP bridge domains and interfaces. 33 BDInterfaceDescriptorName = "vpp-bd-interface" 34 35 // dependency labels 36 interfaceDep = "interface-exists" 37 ) 38 39 // BDInterfaceDescriptor teaches KVScheduler how to put interface into VPP bridge 40 // domain. 41 type BDInterfaceDescriptor struct { 42 // dependencies 43 log logging.Logger 44 bdIndex idxvpp.NameToIndex 45 bdHandler vppcalls.BridgeDomainVppAPI 46 } 47 48 // NewBDInterfaceDescriptor creates a new instance of the BDInterface descriptor. 49 func NewBDInterfaceDescriptor(bdIndex idxvpp.NameToIndex, bdHandler vppcalls.BridgeDomainVppAPI, log logging.PluginLogger) *BDInterfaceDescriptor { 50 51 return &BDInterfaceDescriptor{ 52 bdIndex: bdIndex, 53 bdHandler: bdHandler, 54 log: log.NewLogger("bd-iface-descriptor"), 55 } 56 } 57 58 // GetDescriptor returns descriptor suitable for registration (via adapter) with 59 // the KVScheduler. 60 func (d *BDInterfaceDescriptor) GetDescriptor() *adapter.BDInterfaceDescriptor { 61 return &adapter.BDInterfaceDescriptor{ 62 Name: BDInterfaceDescriptorName, 63 KeySelector: d.IsBDInterfaceKey, 64 ValueTypeName: string(proto.MessageName(&l2.BridgeDomain_Interface{})), 65 Create: d.Create, 66 Delete: d.Delete, 67 Dependencies: d.Dependencies, 68 } 69 } 70 71 // IsBDInterfaceKey returns true if the key is identifying binding between 72 // VPP bridge domain and interface. 73 func (d *BDInterfaceDescriptor) IsBDInterfaceKey(key string) bool { 74 _, _, isBDIfaceKey := l2.ParseBDInterfaceKey(key) 75 return isBDIfaceKey 76 } 77 78 // Create puts interface into bridge domain. 79 func (d *BDInterfaceDescriptor) Create(key string, bdIface *l2.BridgeDomain_Interface) (metadata interface{}, err error) { 80 // get bridge domain index 81 bdName, _, _ := l2.ParseBDInterfaceKey(key) 82 bdMeta, found := d.bdIndex.LookupByName(bdName) 83 if !found { 84 err = errors.Errorf("failed to obtain metadata for bridge domain %s", bdName) 85 d.log.Error(err) 86 return nil, err 87 } 88 89 // put interface into the bridge domain 90 err = d.bdHandler.AddInterfaceToBridgeDomain(bdMeta.GetIndex(), bdIface) 91 if err != nil { 92 d.log.Error(err) 93 return nil, err 94 95 } 96 return nil, nil 97 } 98 99 // Delete removes interface from bridge domain. 100 func (d *BDInterfaceDescriptor) Delete(key string, bdIface *l2.BridgeDomain_Interface, metadata interface{}) error { 101 // get bridge domain index 102 bdName, _, _ := l2.ParseBDInterfaceKey(key) 103 bdMeta, found := d.bdIndex.LookupByName(bdName) 104 if !found { 105 err := errors.Errorf("failed to obtain metadata for bridge domain %s", bdName) 106 d.log.Error(err) 107 return err 108 } 109 110 err := d.bdHandler.DeleteInterfaceFromBridgeDomain(bdMeta.GetIndex(), bdIface) 111 if err != nil { 112 d.log.Error(err) 113 return err 114 115 } 116 return nil 117 } 118 119 // Dependencies lists the interface as the only dependency for the binding. 120 func (d *BDInterfaceDescriptor) Dependencies(key string, value *l2.BridgeDomain_Interface) []kvs.Dependency { 121 return []kvs.Dependency{ 122 { 123 Label: interfaceDep, 124 Key: interfaces.InterfaceKey(value.Name), 125 }, 126 } 127 }