go.ligato.io/vpp-agent/v3@v3.5.0/plugins/kvscheduler/descriptor-adapter/template.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 main
    16  
    17  const adapterTemplate = `// Code generated by adapter-generator. DO NOT EDIT.
    18  
    19  package adapter
    20  
    21  import (
    22  	"google.golang.org/protobuf/proto"
    23  	. "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api"
    24  
    25      {{- range $i, $path := .Imports }}
    26  	"{{ $path }}"
    27  	{{- end }}
    28  )
    29  
    30  ////////// type-safe key-value pair with metadata //////////
    31  
    32  type {{ .DescriptorName }}KVWithMetadata struct {
    33  	Key      string
    34  	Value    {{ .ValueT }}
    35  	Metadata {{ .MetadataT }}
    36  	Origin   ValueOrigin
    37  }
    38  
    39  ////////// type-safe Descriptor structure //////////
    40  
    41  type {{ .DescriptorName }}Descriptor struct {
    42  	Name                 string
    43  	KeySelector          KeySelector
    44  	ValueTypeName        string
    45  	KeyLabel             func(key string) string
    46  	ValueComparator      func(key string, oldValue, newValue {{ .ValueT }}) bool
    47  	NBKeyPrefix          string
    48  	WithMetadata         bool
    49  	MetadataMapFactory   MetadataMapFactory
    50  	Validate             func(key string, value {{ .ValueT }}) error
    51  	Create               func(key string, value {{ .ValueT }}) (metadata {{ .MetadataT }}, err error)
    52  	Delete               func(key string, value {{ .ValueT }}, metadata {{ .MetadataT }}) error
    53  	Update               func(key string, oldValue, newValue {{ .ValueT }}, oldMetadata {{ .MetadataT }}) (newMetadata {{ .MetadataT }}, err error)
    54  	UpdateWithRecreate   func(key string, oldValue, newValue {{ .ValueT }}, metadata {{ .MetadataT }}) bool
    55  	Retrieve             func(correlate []{{ .DescriptorName }}KVWithMetadata) ([]{{ .DescriptorName }}KVWithMetadata, error)
    56  	IsRetriableFailure   func(err error) bool
    57  	DerivedValues        func(key string, value {{ .ValueT }}) []KeyValuePair
    58  	Dependencies         func(key string, value {{ .ValueT }}) []Dependency
    59  	RetrieveDependencies []string /* descriptor name */
    60  }
    61  
    62  ////////// Descriptor adapter //////////
    63  
    64  type {{ .DescriptorName }}DescriptorAdapter struct {
    65  	descriptor *{{ .DescriptorName }}Descriptor
    66  }
    67  
    68  func New{{ .DescriptorName }}Descriptor(typedDescriptor *{{ .DescriptorName }}Descriptor) *KVDescriptor {
    69  	adapter := &{{ .DescriptorName }}DescriptorAdapter{descriptor: typedDescriptor}
    70  	descriptor := &KVDescriptor{
    71  		Name:                 typedDescriptor.Name,
    72  		KeySelector:          typedDescriptor.KeySelector,
    73  		ValueTypeName:        typedDescriptor.ValueTypeName,
    74  		KeyLabel:             typedDescriptor.KeyLabel,
    75  		NBKeyPrefix:          typedDescriptor.NBKeyPrefix,
    76  		WithMetadata:         typedDescriptor.WithMetadata,
    77  		MetadataMapFactory:   typedDescriptor.MetadataMapFactory,
    78  		IsRetriableFailure:   typedDescriptor.IsRetriableFailure,
    79  		RetrieveDependencies: typedDescriptor.RetrieveDependencies,
    80  	}
    81  	if typedDescriptor.ValueComparator != nil {
    82  		descriptor.ValueComparator = adapter.ValueComparator
    83  	}
    84  	if typedDescriptor.Validate != nil {
    85  		descriptor.Validate = adapter.Validate
    86  	}
    87  	if typedDescriptor.Create != nil {
    88  		descriptor.Create = adapter.Create
    89  	}
    90  	if typedDescriptor.Delete != nil {
    91  		descriptor.Delete = adapter.Delete
    92  	}
    93  	if typedDescriptor.Update != nil {
    94  		descriptor.Update = adapter.Update
    95  	}
    96  	if typedDescriptor.UpdateWithRecreate != nil {
    97  		descriptor.UpdateWithRecreate = adapter.UpdateWithRecreate
    98  	}
    99  	if typedDescriptor.Retrieve != nil {
   100  		descriptor.Retrieve = adapter.Retrieve
   101  	}
   102  	if typedDescriptor.Dependencies != nil {
   103  		descriptor.Dependencies = adapter.Dependencies
   104  	}
   105  	if typedDescriptor.DerivedValues != nil {
   106  		descriptor.DerivedValues = adapter.DerivedValues
   107  	}
   108  	return descriptor
   109  }
   110  
   111  func (da *{{ .DescriptorName }}DescriptorAdapter) ValueComparator(key string, oldValue, newValue proto.Message) bool {
   112  	typedOldValue, err1 := cast{{ .DescriptorName }}Value(key, oldValue)
   113  	typedNewValue, err2 := cast{{ .DescriptorName }}Value(key, newValue)
   114  	if err1 != nil || err2 != nil {
   115  		return false
   116  	}
   117  	return da.descriptor.ValueComparator(key, typedOldValue, typedNewValue)
   118  }
   119  
   120  func (da *{{ .DescriptorName }}DescriptorAdapter) Validate(key string, value proto.Message) (err error) {
   121  	typedValue, err := cast{{ .DescriptorName }}Value(key, value)
   122  	if err != nil {
   123  		return err
   124  	}
   125  	return da.descriptor.Validate(key, typedValue)
   126  }
   127  
   128  func (da *{{ .DescriptorName }}DescriptorAdapter) Create(key string, value proto.Message) (metadata Metadata, err error) {
   129  	typedValue, err := cast{{ .DescriptorName }}Value(key, value)
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  	return da.descriptor.Create(key, typedValue)
   134  }
   135  
   136  func (da *{{ .DescriptorName }}DescriptorAdapter) Update(key string, oldValue, newValue proto.Message, oldMetadata Metadata) (newMetadata Metadata, err error) {
   137  	oldTypedValue, err := cast{{ .DescriptorName }}Value(key, oldValue)
   138  	if err != nil {
   139  		return nil, err
   140  	}
   141  	newTypedValue, err := cast{{ .DescriptorName }}Value(key, newValue)
   142  	if err != nil {
   143  		return nil, err
   144  	}
   145  	typedOldMetadata, err := cast{{ .DescriptorName }}Metadata(key, oldMetadata)
   146  	if err != nil {
   147  		return nil, err
   148  	}
   149  	return da.descriptor.Update(key, oldTypedValue, newTypedValue, typedOldMetadata)
   150  }
   151  
   152  func (da *{{ .DescriptorName }}DescriptorAdapter) Delete(key string, value proto.Message, metadata Metadata) error {
   153  	typedValue, err := cast{{ .DescriptorName }}Value(key, value)
   154  	if err != nil {
   155  		return err
   156  	}
   157  	typedMetadata, err := cast{{ .DescriptorName }}Metadata(key, metadata)
   158  	if err != nil {
   159  		return err
   160  	}
   161  	return da.descriptor.Delete(key, typedValue, typedMetadata)
   162  }
   163  
   164  func (da *{{ .DescriptorName }}DescriptorAdapter) UpdateWithRecreate(key string, oldValue, newValue proto.Message, metadata Metadata) bool {
   165  	oldTypedValue, err := cast{{ .DescriptorName }}Value(key, oldValue)
   166  	if err != nil {
   167  		return true
   168  	}
   169  	newTypedValue, err := cast{{ .DescriptorName }}Value(key, newValue)
   170  	if err != nil {
   171  		return true
   172  	}
   173  	typedMetadata, err := cast{{ .DescriptorName }}Metadata(key, metadata)
   174  	if err != nil {
   175  		return true
   176  	}
   177  	return da.descriptor.UpdateWithRecreate(key, oldTypedValue, newTypedValue, typedMetadata)
   178  }
   179  
   180  func (da *{{ .DescriptorName }}DescriptorAdapter) Retrieve(correlate []KVWithMetadata) ([]KVWithMetadata, error) {
   181  	var correlateWithType []{{ .DescriptorName }}KVWithMetadata
   182  	for _, kvpair := range correlate {
   183  		typedValue, err := cast{{ .DescriptorName }}Value(kvpair.Key, kvpair.Value)
   184  		if err != nil {
   185  			continue
   186  		}
   187  		typedMetadata, err := cast{{ .DescriptorName }}Metadata(kvpair.Key, kvpair.Metadata)
   188  		if err != nil {
   189  			continue
   190  		}
   191  		correlateWithType = append(correlateWithType,
   192  			{{ .DescriptorName }}KVWithMetadata{
   193  				Key:      kvpair.Key,
   194  				Value:    typedValue,
   195  				Metadata: typedMetadata,
   196  				Origin:   kvpair.Origin,
   197  			})
   198  	}
   199  
   200  	typedValues, err := da.descriptor.Retrieve(correlateWithType)
   201  	if err != nil {
   202  		return nil, err
   203  	}
   204  	var values []KVWithMetadata
   205  	for _, typedKVWithMetadata := range typedValues {
   206  		kvWithMetadata := KVWithMetadata{
   207  			Key:      typedKVWithMetadata.Key,
   208  			Metadata: typedKVWithMetadata.Metadata,
   209  			Origin:   typedKVWithMetadata.Origin,
   210  		}
   211  		kvWithMetadata.Value = typedKVWithMetadata.Value
   212  		values = append(values, kvWithMetadata)
   213  	}
   214  	return values, err
   215  }
   216  
   217  func (da *{{ .DescriptorName }}DescriptorAdapter) DerivedValues(key string, value proto.Message) []KeyValuePair {
   218  	typedValue, err := cast{{ .DescriptorName }}Value(key, value)
   219  	if err != nil {
   220  		return nil
   221  	}
   222  	return da.descriptor.DerivedValues(key, typedValue)
   223  }
   224  
   225  func (da *{{ .DescriptorName }}DescriptorAdapter) Dependencies(key string, value proto.Message) []Dependency {
   226  	typedValue, err := cast{{ .DescriptorName }}Value(key, value)
   227  	if err != nil {
   228  		return nil
   229  	}
   230  	return da.descriptor.Dependencies(key, typedValue)
   231  }
   232  
   233  ////////// Helper methods //////////
   234  
   235  func cast{{ .DescriptorName }}Value(key string, value proto.Message) ({{ .ValueT }}, error) {
   236  	typedValue, ok := value.({{ .ValueT }})
   237  	if !ok {
   238  		return nil, ErrInvalidValueType(key, value)
   239  	}
   240  	return typedValue, nil
   241  }
   242  
   243  func cast{{ .DescriptorName }}Metadata(key string, metadata Metadata) ({{ .MetadataT }}, error) {
   244  	if metadata == nil {
   245  		return nil, nil
   246  	}
   247  	typedMetadata, ok := metadata.({{ .MetadataT }})
   248  	if !ok {
   249  		return nil, ErrInvalidMetadataType(key)
   250  	}
   251  	return typedMetadata, nil
   252  }
   253  `