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  }