go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/ifplugin/descriptor/bonded_interface.go (about) 1 // Copyright (c) 2019 PANTHEON.tech 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/go-errors/errors" 19 "go.ligato.io/cn-infra/v2/logging" 20 "google.golang.org/protobuf/proto" 21 22 kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 23 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/descriptor/adapter" 24 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" 25 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" 26 interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" 27 ) 28 29 const ( 30 // BondInterfaceDescriptorName is the name of the descriptor for the bond-interface 31 // config-subsection of VPP interfaces. 32 BondedInterfaceDescriptorName = "bond-interface" 33 34 // dependency labels 35 interfaceDep = "interface-exists" 36 ) 37 38 // BondedInterfaceDescriptor sets/unsets VPP interfaces as a slave for the bond interface. 39 type BondedInterfaceDescriptor struct { 40 log logging.Logger 41 ifHandler vppcalls.InterfaceVppAPI 42 ifIndex ifaceidx.IfaceMetadataIndex 43 } 44 45 // NewBondedInterfaceDescriptor creates a new instance of BondedInterfaceDescriptor. 46 func NewBondedInterfaceDescriptor(ifHandler vppcalls.InterfaceVppAPI, ifIndex ifaceidx.IfaceMetadataIndex, 47 log logging.PluginLogger) (*kvs.KVDescriptor, *BondedInterfaceDescriptor) { 48 descriptorCtx := &BondedInterfaceDescriptor{ 49 ifHandler: ifHandler, 50 log: log.NewLogger("bonded-interface-descriptor"), 51 ifIndex: ifIndex, 52 } 53 typedDescriptor := &adapter.BondedInterfaceDescriptor{ 54 Name: BondedInterfaceDescriptorName, 55 KeySelector: descriptorCtx.IsBondEnslaveKey, 56 ValueTypeName: string(proto.MessageName(&interfaces.BondLink_BondedInterface{})), 57 Create: descriptorCtx.Create, 58 Delete: descriptorCtx.Delete, 59 Dependencies: descriptorCtx.Dependencies, 60 } 61 return adapter.NewBondedInterfaceDescriptor(typedDescriptor), descriptorCtx 62 } 63 64 // IsBondEnslaveKey returns true if the key is identifying bond VPP interface. 65 func (d *BondedInterfaceDescriptor) IsBondEnslaveKey(key string) bool { 66 _, _, isValid := interfaces.ParseBondedInterfaceKey(key) 67 return isValid 68 } 69 70 // Create sets an interface as a bond interface slave. 71 func (d *BondedInterfaceDescriptor) Create(key string, bondedIf *interfaces.BondLink_BondedInterface) (metadata interface{}, err error) { 72 bondIf, _, _ := interfaces.ParseBondedInterfaceKey(key) 73 74 bondIfMeta, found := d.ifIndex.LookupByName(bondIf) 75 if !found { 76 err = errors.Errorf("failed to find bond interface %s", bondIf) 77 d.log.Error(err) 78 return nil, err 79 } 80 81 slaveMeta, found := d.ifIndex.LookupByName(bondedIf.Name) 82 if !found { 83 err = errors.Errorf("failed to find bond %s slave interface %s", bondIf, bondedIf.Name) 84 d.log.Error(err) 85 return nil, err 86 } 87 88 err = d.ifHandler.AttachInterfaceToBond(slaveMeta.SwIfIndex, bondIfMeta.SwIfIndex, bondedIf.IsPassive, bondedIf.IsLongTimeout) 89 if err != nil { 90 d.log.Error(err) 91 } 92 return nil, err 93 } 94 95 // Delete detaches interface as a bond slave 96 func (d *BondedInterfaceDescriptor) Delete(key string, bondedIf *interfaces.BondLink_BondedInterface, metadata interface{}) error { 97 bondIf, _, _ := interfaces.ParseBondedInterfaceKey(key) 98 99 slaveIfMeta, found := d.ifIndex.LookupByName(bondedIf.Name) 100 if !found { 101 err := errors.Errorf("failed to find bond %s slave interface %s", bondIf, bondedIf.Name) 102 d.log.Error(err) 103 return err 104 } 105 106 err := d.ifHandler.DetachInterfaceFromBond(slaveIfMeta.SwIfIndex) 107 if err != nil { 108 d.log.Error(err) 109 } 110 111 return err 112 } 113 114 // Dependencies lists dependencies for an bond slave VPP interface. 115 func (d *BondedInterfaceDescriptor) Dependencies(key string, bondedIf *interfaces.BondLink_BondedInterface) []kvs.Dependency { 116 // link between slave interface and the referenced bond interface 117 // - satisfied as along as the referenced interface is configured 118 return []kvs.Dependency{{ 119 Label: interfaceDep, 120 Key: interfaces.InterfaceKey(bondedIf.Name), 121 }} 122 }