mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2025-03-30 19:54:46 +00:00
pkg/apis/nfd: helpers for handling templates in Rule names
Implement a private helper type (nameTemplateHelper) for handling (executing and caching) of templated names. DeepCopy methods are manually implemented as controller-gen is not able to help with that.
This commit is contained in:
parent
ad933e44b4
commit
085af7c2c7
1 changed files with 63 additions and 0 deletions
|
@ -17,7 +17,9 @@ limitations under the License.
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"strings"
|
"strings"
|
||||||
|
"text/template"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
@ -98,3 +100,64 @@ func (m *FeatureMatcher) match(features map[string]*feature.DomainFeatures) (boo
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type templateHelper struct {
|
||||||
|
template *template.Template
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTemplateHelper(name string) (*templateHelper, error) {
|
||||||
|
tmpl, err := template.New("").Option("missingkey=error").Parse(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid template: %w", err)
|
||||||
|
}
|
||||||
|
return &templateHelper{template: tmpl}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is a stub to augment the auto-generated code
|
||||||
|
func (in *templateHelper) DeepCopy() *templateHelper {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(templateHelper)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is a stub to augment the auto-generated code
|
||||||
|
func (in *templateHelper) DeepCopyInto(out *templateHelper) {
|
||||||
|
// HACK: just re-use the template
|
||||||
|
out.template = in.template
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *templateHelper) execute(data interface{}) (string, error) {
|
||||||
|
var tmp bytes.Buffer
|
||||||
|
if err := h.template.Execute(&tmp, data); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return tmp.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// expandMap is a helper for expanding a template in to a map of strings. Data
|
||||||
|
// after executing the template is expexted to be key=value pairs separated by
|
||||||
|
// newlines.
|
||||||
|
func (h *templateHelper) expandMap(data interface{}) (map[string]string, error) {
|
||||||
|
expanded, err := h.execute(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split out individual key-value pairs
|
||||||
|
out := make(map[string]string)
|
||||||
|
for _, item := range strings.Split(expanded, "\n") {
|
||||||
|
// Remove leading/trailing whitespace and skip empty lines
|
||||||
|
if trimmed := strings.TrimSpace(item); trimmed != "" {
|
||||||
|
split := strings.SplitN(trimmed, "=", 2)
|
||||||
|
if len(split) == 1 {
|
||||||
|
out[split[0]] = ""
|
||||||
|
} else {
|
||||||
|
out[split[0]] = split[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue