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 `