go.ligato.io/vpp-agent/v3@v3.5.0/examples/customize/custom_vpp_plugin/syslog/descriptor/sender.go (about) 1 // Copyright (c) 2020 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 "errors" 19 "net" 20 21 "go.ligato.io/cn-infra/v2/logging" 22 "google.golang.org/protobuf/proto" 23 24 vpp_syslog "go.ligato.io/vpp-agent/v3/examples/customize/custom_vpp_plugin/proto/custom/vpp/syslog" 25 "go.ligato.io/vpp-agent/v3/examples/customize/custom_vpp_plugin/syslog/descriptor/adapter" 26 "go.ligato.io/vpp-agent/v3/examples/customize/custom_vpp_plugin/syslog/vppcalls" 27 "go.ligato.io/vpp-agent/v3/pkg/models" 28 kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 29 ) 30 31 const ( 32 SyslogSenderDescriptorName = "vpp-syslog-sender" 33 ) 34 35 var ( 36 ErrSyslogSenderWithoutCollector = errors.New("VPP syslog sender defined without collector IP") 37 ) 38 39 type SenderDescriptor struct { 40 log logging.Logger 41 handler vppcalls.SyslogVppAPI 42 } 43 44 func NewSenderDescriptor(handler vppcalls.SyslogVppAPI, log logging.LoggerFactory) *SenderDescriptor { 45 return &SenderDescriptor{ 46 handler: handler, 47 log: log.NewLogger("syslog-descriptor"), 48 } 49 } 50 51 func (d *SenderDescriptor) GetDescriptor() *adapter.SyslogSenderDescriptor { 52 return &adapter.SyslogSenderDescriptor{ 53 Name: SyslogSenderDescriptorName, 54 NBKeyPrefix: vpp_syslog.ModelSyslogSender.KeyPrefix(), 55 ValueTypeName: vpp_syslog.ModelSyslogSender.ProtoName(), 56 KeySelector: vpp_syslog.ModelSyslogSender.IsKeyValid, 57 KeyLabel: vpp_syslog.ModelSyslogSender.StripKeyPrefix, 58 ValueComparator: d.EquivalentIPRedirect, 59 Validate: d.Validate, 60 Create: d.Create, 61 Delete: d.Delete, 62 Retrieve: d.Retrieve, 63 } 64 } 65 66 // EquivalentIPRedirect is case-insensitive comparison function for punt.IpRedirect. 67 func (d *SenderDescriptor) EquivalentIPRedirect(key string, oldSender, newSender *vpp_syslog.Sender) bool { 68 // parameters compared by proto equal 69 return proto.Equal(oldSender, newSender) 70 } 71 72 func (d *SenderDescriptor) Validate(key string, sender *vpp_syslog.Sender) error { 73 74 // validate collector IP 75 if sender.Collector == "" || net.ParseIP(sender.Collector).IsUnspecified() { 76 return kvs.NewInvalidValueError(ErrSyslogSenderWithoutCollector, "collector") 77 } 78 79 return nil 80 } 81 82 func (d *SenderDescriptor) Create(key string, sender *vpp_syslog.Sender) (metadata interface{}, err error) { 83 // add Punt to host/socket 84 err = d.handler.SetSender(vppcalls.SenderConfig{ 85 Source: net.ParseIP(sender.Source), 86 Collector: net.ParseIP(sender.Collector), 87 Port: int(sender.Port), 88 }) 89 if err != nil { 90 d.log.Error(err) 91 return nil, err 92 } 93 return nil, nil 94 } 95 96 func (d *SenderDescriptor) Delete(key string, sender *vpp_syslog.Sender, metadata interface{}) error { 97 err := d.handler.DisableSender() 98 if err != nil { 99 d.log.Error(err) 100 return err 101 } 102 return nil 103 } 104 105 func (d *SenderDescriptor) Retrieve(correlate []adapter.SyslogSenderKVWithMetadata) (dump []adapter.SyslogSenderKVWithMetadata, err error) { 106 cfg, err := d.handler.GetSender() 107 if err != nil { 108 d.log.Error(err) 109 return nil, err 110 } 111 112 if cfg.Source != nil && cfg.Collector != nil { 113 sender := &vpp_syslog.Sender{ 114 Source: cfg.Source.String(), 115 Collector: cfg.Collector.String(), 116 Port: int32(cfg.Port), 117 } 118 dump = append(dump, adapter.SyslogSenderKVWithMetadata{ 119 Key: models.Key(sender), 120 Value: sender, 121 Origin: kvs.FromNB, 122 }) 123 } 124 125 return dump, nil 126 }