From 0e1d4a904662a35da84e56eff3d15dc5b41ddd07 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Mon, 4 Jul 2022 10:56:35 +0300 Subject: [PATCH] apis/nfd: migrate pkg/api/feature Move the previously-protobuf-only internal "feature api" over to the public "nfd api" package. This is in preparation for introducing a new CRD API for communicating features. This patch carries no functional changes. Just moving code around. --- pkg/api/feature/generate.sh | 16 ------ pkg/api/feature/types.go | 53 ------------------- pkg/apis/nfd/v1alpha1/doc.go | 2 + pkg/apis/nfd/v1alpha1/expression.go | 12 ++--- pkg/apis/nfd/v1alpha1/expression_test.go | 7 ++- .../feature => apis/nfd/v1alpha1}/feature.go | 2 +- pkg/apis/nfd/v1alpha1/generate.sh | 12 +++++ pkg/apis/nfd/v1alpha1/rule.go | 7 ++- pkg/apis/nfd/v1alpha1/rule_test.go | 39 +++++++------- pkg/apis/nfd/v1alpha1/types.go | 47 ++++++++++++++++ pkg/labeler/labeler.proto | 4 +- pkg/nfd-client/worker/nfd-worker.go | 6 +-- pkg/nfd-master/nfd-master.go | 5 +- source/cpu/cpu.go | 30 +++++------ source/custom/custom.go | 11 ++-- source/fake/fake.go | 20 +++---- source/kernel/kernel.go | 18 +++---- source/local/local.go | 12 ++--- source/memory/memory.go | 22 ++++---- source/network/network.go | 20 +++---- source/pci/pci.go | 12 ++--- source/pci/utils.go | 10 ++-- source/source.go | 4 +- source/storage/storage.go | 20 +++---- source/system/system.go | 14 ++--- source/usb/usb.go | 12 ++--- source/usb/utils.go | 14 ++--- 27 files changed, 208 insertions(+), 223 deletions(-) delete mode 100755 pkg/api/feature/generate.sh delete mode 100644 pkg/api/feature/types.go rename pkg/{api/feature => apis/nfd/v1alpha1}/feature.go (99%) create mode 100755 pkg/apis/nfd/v1alpha1/generate.sh diff --git a/pkg/api/feature/generate.sh b/pkg/api/feature/generate.sh deleted file mode 100755 index a9785cafe..000000000 --- a/pkg/api/feature/generate.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -ex - -# go-to-protobuf seems unable to run in the package directory -> move to parent dir -cd .. -go-to-protobuf \ - --output-base=. \ - --go-header-file ../../hack/boilerplate.go.txt \ - --proto-import ../../vendor \ - --packages ./feature=feature \ - --keep-gogoproto=false \ - --apimachinery-packages "-k8s.io/apimachinery/pkg/util/intstr" -cd - - -# Mangle the go_package option to comply with newer versions protoc-gen-go -sed s',go_package =.*,go_package = "sigs.k8s.io/node-feature-discovery/pkg/api/feature";,' \ - -i generated.proto diff --git a/pkg/api/feature/types.go b/pkg/api/feature/types.go deleted file mode 100644 index 505081414..000000000 --- a/pkg/api/feature/types.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2021 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package feature - -//go:generate ./generate.sh - -// Features is a collection of all features of the system, arranged by domain. -// +protobuf -type Features map[string]*DomainFeatures - -// DomainFeatures is the collection of all discovered features of one domain. -type DomainFeatures struct { - Flags map[string]FlagFeatureSet `protobuf:"bytes,1,rep,name=flags"` - Attributes map[string]AttributeFeatureSet `protobuf:"bytes,2,rep,name=vattributes"` - Instances map[string]InstanceFeatureSet `protobuf:"bytes,3,rep,name=instances"` -} - -// FlagFeatureSet is a set of simple features only containing names without values. -type FlagFeatureSet struct { - Elements map[string]Nil `protobuf:"bytes,1,rep,name=elements"` -} - -// AttributeFeatureSet is a set of features having string value. -type AttributeFeatureSet struct { - Elements map[string]string `protobuf:"bytes,1,rep,name=elements"` -} - -// InstanceFeatureSet is a set of features each of which is an instance having multiple attributes. -type InstanceFeatureSet struct { - Elements []InstanceFeature `protobuf:"bytes,1,rep,name=elements"` -} - -// InstanceFeature represents one instance of a complex features, e.g. a device. -type InstanceFeature struct { - Attributes map[string]string `protobuf:"bytes,1,rep,name=attributes"` -} - -// Nil is a dummy empty struct for protobuf compatibility -type Nil struct{} diff --git a/pkg/apis/nfd/v1alpha1/doc.go b/pkg/apis/nfd/v1alpha1/doc.go index 32b425965..17b8fc585 100644 --- a/pkg/apis/nfd/v1alpha1/doc.go +++ b/pkg/apis/nfd/v1alpha1/doc.go @@ -19,3 +19,5 @@ limitations under the License. // +kubebuilder:object:generate=true // +groupName=nfd.k8s-sigs.io package v1alpha1 + +//go:generate ./generate.sh diff --git a/pkg/apis/nfd/v1alpha1/expression.go b/pkg/apis/nfd/v1alpha1/expression.go index fefc6c90e..47108ab22 100644 --- a/pkg/apis/nfd/v1alpha1/expression.go +++ b/pkg/apis/nfd/v1alpha1/expression.go @@ -25,8 +25,6 @@ import ( "strings" "k8s.io/klog/v2" - - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" ) var matchOps = map[MatchOp]struct{}{ @@ -197,7 +195,7 @@ func (m *MatchExpression) Match(valid bool, value interface{}) (bool, error) { } // MatchKeys evaluates the MatchExpression against a set of keys. -func (m *MatchExpression) MatchKeys(name string, keys map[string]feature.Nil) (bool, error) { +func (m *MatchExpression) MatchKeys(name string, keys map[string]Nil) (bool, error) { matched := false _, ok := keys[name] @@ -303,7 +301,7 @@ func (m *MatchExpression) UnmarshalJSON(data []byte) error { } // MatchKeys evaluates the MatchExpressionSet against a set of keys. -func (m *MatchExpressionSet) MatchKeys(keys map[string]feature.Nil) (bool, error) { +func (m *MatchExpressionSet) MatchKeys(keys map[string]Nil) (bool, error) { matched, _, err := m.MatchGetKeys(keys) return matched, err } @@ -318,7 +316,7 @@ type MatchedKey struct { // empty MatchExpressionSet returns all existing keys are returned. Note that // an empty MatchExpressionSet and an empty set of keys returns an empty slice // which is not nil and is treated as a match. -func (m *MatchExpressionSet) MatchGetKeys(keys map[string]feature.Nil) (bool, []MatchedKey, error) { +func (m *MatchExpressionSet) MatchGetKeys(keys map[string]Nil) (bool, []MatchedKey, error) { ret := make([]MatchedKey, 0, len(*m)) for n, e := range *m { @@ -374,7 +372,7 @@ func (m *MatchExpressionSet) MatchGetValues(values map[string]string) (bool, []M // MatchInstances evaluates the MatchExpressionSet against a set of instance // features, each of which is an individual set of key-value pairs // (attributes). -func (m *MatchExpressionSet) MatchInstances(instances []feature.InstanceFeature) (bool, error) { +func (m *MatchExpressionSet) MatchInstances(instances []InstanceFeature) (bool, error) { v, err := m.MatchGetInstances(instances) return len(v) > 0, err } @@ -386,7 +384,7 @@ type MatchedInstance map[string]string // features, each of which is an individual set of key-value pairs // (attributes). A slice containing all matching instances is returned. An // empty (non-nil) slice is returned if no matching instances were found. -func (m *MatchExpressionSet) MatchGetInstances(instances []feature.InstanceFeature) ([]MatchedInstance, error) { +func (m *MatchExpressionSet) MatchGetInstances(instances []InstanceFeature) ([]MatchedInstance, error) { ret := []MatchedInstance{} for _, i := range instances { diff --git a/pkg/apis/nfd/v1alpha1/expression_test.go b/pkg/apis/nfd/v1alpha1/expression_test.go index 6dcd5f3e9..aeb5f3638 100644 --- a/pkg/apis/nfd/v1alpha1/expression_test.go +++ b/pkg/apis/nfd/v1alpha1/expression_test.go @@ -22,7 +22,6 @@ import ( "github.com/stretchr/testify/assert" "sigs.k8s.io/yaml" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" api "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" ) @@ -182,7 +181,7 @@ func TestMatch(t *testing.T) { func TestMatchKeys(t *testing.T) { type V = api.MatchValue - type I = map[string]feature.Nil + type I = map[string]api.Nil type TC struct { op api.MatchOp values V @@ -290,7 +289,7 @@ func TestMatchValues(t *testing.T) { } func TestMESMatchKeys(t *testing.T) { - type I = map[string]feature.Nil + type I = map[string]api.Nil type MK = api.MatchedKey type O = []MK type TC struct { @@ -413,7 +412,7 @@ baz: { op: Gt, value: ["10"] } } func TestMESMatchInstances(t *testing.T) { - type I = feature.InstanceFeature + type I = api.InstanceFeature type MI = api.MatchedInstance type O = []MI type A = map[string]string diff --git a/pkg/api/feature/feature.go b/pkg/apis/nfd/v1alpha1/feature.go similarity index 99% rename from pkg/api/feature/feature.go rename to pkg/apis/nfd/v1alpha1/feature.go index bd23af277..b54117cfe 100644 --- a/pkg/api/feature/feature.go +++ b/pkg/apis/nfd/v1alpha1/feature.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package feature +package v1alpha1 // NewDomainFeatures creates a new instance of Features, initializing specified // features to empty values diff --git a/pkg/apis/nfd/v1alpha1/generate.sh b/pkg/apis/nfd/v1alpha1/generate.sh new file mode 100755 index 000000000..d4fe85392 --- /dev/null +++ b/pkg/apis/nfd/v1alpha1/generate.sh @@ -0,0 +1,12 @@ +#!/bin/sh -ex + +go-to-protobuf \ + --output-base=. \ + --go-header-file ../../../../hack/boilerplate.go.txt \ + --proto-import ../../../../vendor/ \ + --packages +sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1=v1alpha1 \ + --keep-gogoproto=false \ + --apimachinery-packages "-k8s.io/apimachinery/pkg/util/intstr" + +mv sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1/* . +rm -rf sigs.k8s.io diff --git a/pkg/apis/nfd/v1alpha1/rule.go b/pkg/apis/nfd/v1alpha1/rule.go index 1ed930269..ab0f6f913 100644 --- a/pkg/apis/nfd/v1alpha1/rule.go +++ b/pkg/apis/nfd/v1alpha1/rule.go @@ -24,7 +24,6 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" "sigs.k8s.io/node-feature-discovery/pkg/utils" ) @@ -36,7 +35,7 @@ type RuleOutput struct { } // Execute the rule against a set of input features. -func (r *Rule) Execute(features feature.Features) (RuleOutput, error) { +func (r *Rule) Execute(features Features) (RuleOutput, error) { labels := make(map[string]string) vars := make(map[string]string) @@ -150,11 +149,11 @@ type matchedFeatures map[string]domainMatchedFeatures type domainMatchedFeatures map[string]interface{} -func (e *MatchAnyElem) match(features map[string]*feature.DomainFeatures) (bool, matchedFeatures, error) { +func (e *MatchAnyElem) match(features map[string]*DomainFeatures) (bool, matchedFeatures, error) { return e.MatchFeatures.match(features) } -func (m *FeatureMatcher) match(features map[string]*feature.DomainFeatures) (bool, matchedFeatures, error) { +func (m *FeatureMatcher) match(features map[string]*DomainFeatures) (bool, matchedFeatures, error) { matches := make(matchedFeatures, len(*m)) // Logical AND over the terms diff --git a/pkg/apis/nfd/v1alpha1/rule_test.go b/pkg/apis/nfd/v1alpha1/rule_test.go index 51cf8920e..b19c2b633 100644 --- a/pkg/apis/nfd/v1alpha1/rule_test.go +++ b/pkg/apis/nfd/v1alpha1/rule_test.go @@ -20,11 +20,10 @@ import ( "testing" "github.com/stretchr/testify/assert" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" ) func TestRule(t *testing.T) { - f := map[string]*feature.DomainFeatures{} + f := map[string]*DomainFeatures{} r1 := Rule{Labels: map[string]string{"label-1": "", "label-2": "true"}} r2 := Rule{ Labels: map[string]string{"label-1": "label-val-1"}, @@ -48,7 +47,7 @@ func TestRule(t *testing.T) { assert.Error(t, err, "matching against a missing domain should have returned an error") // Test empty domain - d := feature.NewDomainFeatures() + d := NewDomainFeatures() f["domain-1"] = d m, err = r1.Execute(f) @@ -60,9 +59,9 @@ func TestRule(t *testing.T) { assert.Error(t, err, "matching against a missing feature type should have returned an error") // Test empty feature sets - d.Flags["kf-1"] = feature.NewFlagFeatures() - d.Attributes["vf-1"] = feature.NewAttributeFeatures(nil) - d.Instances["if-1"] = feature.NewInstanceFeatures(nil) + d.Flags["kf-1"] = NewFlagFeatures() + d.Attributes["vf-1"] = NewAttributeFeatures(nil) + d.Instances["if-1"] = NewInstanceFeatures(nil) m, err = r1.Execute(f) assert.Nilf(t, err, "unexpected error: %v", err) @@ -73,10 +72,10 @@ func TestRule(t *testing.T) { assert.Nil(t, m.Labels, "unexpected match") // Test non-empty feature sets - d.Flags["kf-1"].Elements["key-x"] = feature.Nil{} + d.Flags["kf-1"].Elements["key-x"] = Nil{} d.Attributes["vf-1"].Elements["key-1"] = "val-x" - d.Instances["if-1"] = feature.NewInstanceFeatures([]feature.InstanceFeature{ - *feature.NewInstanceFeature(map[string]string{"attr-1": "val-x"})}) + d.Instances["if-1"] = NewInstanceFeatures([]InstanceFeature{ + *NewInstanceFeature(map[string]string{"attr-1": "val-x"})}) m, err = r1.Execute(f) assert.Nilf(t, err, "unexpected error: %v", err) @@ -98,7 +97,7 @@ func TestRule(t *testing.T) { assert.Nilf(t, err, "unexpected error: %v", err) assert.Nil(t, m.Labels, "keys should not have matched") - d.Flags["kf-1"].Elements["key-1"] = feature.Nil{} + d.Flags["kf-1"].Elements["key-1"] = Nil{} m, err = r2.Execute(f) assert.Nilf(t, err, "unexpected error: %v", err) assert.Equal(t, r2.Labels, m.Labels, "keys should have matched") @@ -208,19 +207,19 @@ func TestRule(t *testing.T) { } func TestTemplating(t *testing.T) { - f := map[string]*feature.DomainFeatures{ - "domain_1": { - Flags: map[string]feature.FlagFeatureSet{ - "kf_1": { - Elements: map[string]feature.Nil{ + f := map[string]*DomainFeatures{ + "domain_1": &DomainFeatures{ + Flags: map[string]FlagFeatureSet{ + "kf_1": FlagFeatureSet{ + Elements: map[string]Nil{ "key-a": {}, "key-b": {}, "key-c": {}, }, }, }, - Attributes: map[string]feature.AttributeFeatureSet{ - "vf_1": { + Attributes: map[string]AttributeFeatureSet{ + "vf_1": AttributeFeatureSet{ Elements: map[string]string{ "key-1": "val-1", "keu-2": "val-2", @@ -228,9 +227,9 @@ func TestTemplating(t *testing.T) { }, }, }, - Instances: map[string]feature.InstanceFeatureSet{ - "if_1": { - Elements: []feature.InstanceFeature{ + Instances: map[string]InstanceFeatureSet{ + "if_1": InstanceFeatureSet{ + Elements: []InstanceFeature{ { Attributes: map[string]string{ "attr-1": "1", diff --git a/pkg/apis/nfd/v1alpha1/types.go b/pkg/apis/nfd/v1alpha1/types.go index 1e486768d..4c3606b2f 100644 --- a/pkg/apis/nfd/v1alpha1/types.go +++ b/pkg/apis/nfd/v1alpha1/types.go @@ -20,6 +20,53 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +// Features is a collection of all features of the system, arranged by domain. +// +// +protobuf=true +type Features map[string]*DomainFeatures + +// DomainFeatures is the collection of all discovered features of one domain. +// +// +protobuf=true +type DomainFeatures struct { + Flags map[string]FlagFeatureSet `json:"flags" protobuf:"bytes,2,rep,name=flags"` + Attributes map[string]AttributeFeatureSet `json:"attributes" protobuf:"bytes,3,rep,name=vattributes"` + Instances map[string]InstanceFeatureSet `json:"instances" protobuf:"bytes,4,rep,name=instances"` +} + +// FlagFeatureSet is a set of simple features only containing names without values. +// +// +protobuf=true +type FlagFeatureSet struct { + Elements map[string]Nil `json:"elements" protobuf:"bytes,1,rep,name=elements"` +} + +// AttributeFeatureSet is a set of features having string value. +// +// +protobuf=true +type AttributeFeatureSet struct { + Elements map[string]string `json:"elements" protobuf:"bytes,1,rep,name=elements"` +} + +// InstanceFeatureSet is a set of features each of which is an instance having multiple attributes. +// +// +protobuf=true +type InstanceFeatureSet struct { + Elements []InstanceFeature `json:"elements" protobuf:"bytes,1,rep,name=elements"` +} + +// InstanceFeature represents one instance of a complex features, e.g. a device. +// +// +protobuf=true +type InstanceFeature struct { + Attributes map[string]string `json:"attributes" protobuf:"bytes,1,rep,name=attributes"` +} + +// Nil is a dummy empty struct for protobuf compatibility +// +// +protobuf=true +type Nil struct{} + // NodeFeatureRuleList contains a list of NodeFeatureRule objects. // +kubebuilder:object:root=true // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/labeler/labeler.proto b/pkg/labeler/labeler.proto index 6448e6044..e0119103d 100644 --- a/pkg/labeler/labeler.proto +++ b/pkg/labeler/labeler.proto @@ -18,7 +18,7 @@ syntax = "proto3"; option go_package = "sigs.k8s.io/node-feature-discovery/pkg/labeler"; -import "pkg/api/feature/generated.proto"; +import "pkg/apis/nfd/v1alpha1/generated.proto"; package labeler; @@ -30,7 +30,7 @@ message SetLabelsRequest { string nfd_version = 1; string node_name = 2; map labels = 3; - map features = 4; + map features = 4; } message SetLabelsReply { diff --git a/pkg/nfd-client/worker/nfd-worker.go b/pkg/nfd-client/worker/nfd-worker.go index e80d954b6..f97fade42 100644 --- a/pkg/nfd-client/worker/nfd-worker.go +++ b/pkg/nfd-client/worker/nfd-worker.go @@ -31,7 +31,7 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/yaml" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" pb "sigs.k8s.io/node-feature-discovery/pkg/labeler" clientcommon "sigs.k8s.io/node-feature-discovery/pkg/nfd-client" "sigs.k8s.io/node-feature-discovery/pkg/utils" @@ -533,8 +533,8 @@ func getFeatureLabels(source source.LabelSource, labelWhiteList regexp.Regexp) ( } // getFeatures returns raw features from all feature sources -func getFeatures() map[string]*feature.DomainFeatures { - features := make(map[string]*feature.DomainFeatures) +func getFeatures() map[string]*nfdv1alpha1.DomainFeatures { + features := make(map[string]*nfdv1alpha1.DomainFeatures) for name, src := range source.GetAllFeatureSources() { features[name] = src.GetFeatures() diff --git a/pkg/nfd-master/nfd-master.go b/pkg/nfd-master/nfd-master.go index dcf094859..812aa3baf 100644 --- a/pkg/nfd-master/nfd-master.go +++ b/pkg/nfd-master/nfd-master.go @@ -43,7 +43,6 @@ import ( restclient "k8s.io/client-go/rest" "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" "sigs.k8s.io/node-feature-discovery/pkg/apihelper" nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" pb "sigs.k8s.io/node-feature-discovery/pkg/labeler" @@ -523,8 +522,8 @@ func (m *nfdMaster) crLabels(r *pb.SetLabelsRequest) map[string]string { } // Feed back rule output to features map for subsequent rules to match - feature.InsertAttributeFeatures(r.Features, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Labels) - feature.InsertAttributeFeatures(r.Features, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Vars) + nfdv1alpha1.InsertAttributeFeatures(r.Features, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Labels) + nfdv1alpha1.InsertAttributeFeatures(r.Features, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Vars) } } diff --git a/source/cpu/cpu.go b/source/cpu/cpu.go index 62d14af30..b2db7d8e0 100644 --- a/source/cpu/cpu.go +++ b/source/cpu/cpu.go @@ -24,7 +24,7 @@ import ( "github.com/klauspost/cpuid/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" "sigs.k8s.io/node-feature-discovery/source" @@ -102,7 +102,7 @@ type keyFilter struct { type cpuSource struct { config *Config cpuidFilter *keyFilter - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -197,20 +197,20 @@ func (s *cpuSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource Interface func (s *cpuSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() // Detect CPUID - s.features.Flags[CpuidFeature] = feature.NewFlagFeatures(getCpuidFlags()...) + s.features.Flags[CpuidFeature] = nfdv1alpha1.NewFlagFeatures(getCpuidFlags()...) // Detect CPU model - s.features.Attributes[Cpumodel] = feature.NewAttributeFeatures(getCPUModel()) + s.features.Attributes[Cpumodel] = nfdv1alpha1.NewAttributeFeatures(getCPUModel()) // Detect cstate configuration cstate, err := detectCstate() if err != nil { klog.Errorf("failed to detect cstate: %v", err) } else { - s.features.Attributes[CstateFeature] = feature.NewAttributeFeatures(cstate) + s.features.Attributes[CstateFeature] = nfdv1alpha1.NewAttributeFeatures(cstate) } // Detect pstate features @@ -218,33 +218,33 @@ func (s *cpuSource) Discover() error { if err != nil { klog.Error(err) } - s.features.Attributes[PstateFeature] = feature.NewAttributeFeatures(pstate) + s.features.Attributes[PstateFeature] = nfdv1alpha1.NewAttributeFeatures(pstate) // Detect RDT features - s.features.Flags[RdtFeature] = feature.NewFlagFeatures(discoverRDT()...) + s.features.Flags[RdtFeature] = nfdv1alpha1.NewFlagFeatures(discoverRDT()...) // Detect SGX features - s.features.Attributes[SecurityFeature] = feature.NewAttributeFeatures(discoverSecurity()) + s.features.Attributes[SecurityFeature] = nfdv1alpha1.NewAttributeFeatures(discoverSecurity()) // Detect SGX features // // DEPRECATED in v0.12: will be removed in the future if val, ok := s.features.Attributes[SecurityFeature].Elements["sgx.enabled"]; ok { - s.features.Attributes[SgxFeature] = feature.NewAttributeFeatures(map[string]string{"enabled": val}) + s.features.Attributes[SgxFeature] = nfdv1alpha1.NewAttributeFeatures(map[string]string{"enabled": val}) } // Detect Secure Execution features // // DEPRECATED in v0.12: will be removed in the future if val, ok := s.features.Attributes[SecurityFeature].Elements["se.enabled"]; ok { - s.features.Attributes[SeFeature] = feature.NewAttributeFeatures(map[string]string{"enabled": val}) + s.features.Attributes[SeFeature] = nfdv1alpha1.NewAttributeFeatures(map[string]string{"enabled": val}) } // Detect SST features - s.features.Attributes[SstFeature] = feature.NewAttributeFeatures(discoverSST()) + s.features.Attributes[SstFeature] = nfdv1alpha1.NewAttributeFeatures(discoverSST()) // Detect hyper-threading - s.features.Attributes[TopologyFeature] = feature.NewAttributeFeatures(discoverTopology()) + s.features.Attributes[TopologyFeature] = nfdv1alpha1.NewAttributeFeatures(discoverTopology()) utils.KlogDump(3, "discovered cpu features:", " ", s.features) @@ -252,9 +252,9 @@ func (s *cpuSource) Discover() error { } // GetFeatures method of the FeatureSource Interface -func (s *cpuSource) GetFeatures() *feature.DomainFeatures { +func (s *cpuSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/custom/custom.go b/source/custom/custom.go index 9b2484e95..80e374060 100644 --- a/source/custom/custom.go +++ b/source/custom/custom.go @@ -25,7 +25,6 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/yaml" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" @@ -108,7 +107,7 @@ func (s *customSource) Priority() int { return 10 } // GetLabels method of the LabelSource interface func (s *customSource) GetLabels() (source.FeatureLabels, error) { // Get raw features from all sources - domainFeatures := make(map[string]*feature.DomainFeatures) + domainFeatures := make(map[string]*nfdv1alpha1.DomainFeatures) for n, s := range source.GetAllFeatureSources() { domainFeatures[n] = s.GetFeatures() } @@ -129,13 +128,13 @@ func (s *customSource) GetLabels() (source.FeatureLabels, error) { labels[n] = v } // Feed back rule output to features map for subsequent rules to match - feature.InsertAttributeFeatures(domainFeatures, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Labels) - feature.InsertAttributeFeatures(domainFeatures, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Vars) + nfdv1alpha1.InsertAttributeFeatures(domainFeatures, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Labels) + nfdv1alpha1.InsertAttributeFeatures(domainFeatures, nfdv1alpha1.RuleBackrefDomain, nfdv1alpha1.RuleBackrefFeature, ruleOut.Vars) } return labels, nil } -func (r *CustomRule) execute(features map[string]*feature.DomainFeatures) (nfdv1alpha1.RuleOutput, error) { +func (r *CustomRule) execute(features map[string]*nfdv1alpha1.DomainFeatures) (nfdv1alpha1.RuleOutput, error) { if r.LegacyRule != nil { ruleOut, err := r.LegacyRule.execute(features) if err != nil { @@ -155,7 +154,7 @@ func (r *CustomRule) execute(features map[string]*feature.DomainFeatures) (nfdv1 return nfdv1alpha1.RuleOutput{}, fmt.Errorf("BUG: an empty rule, this really should not happen") } -func (r *LegacyRule) execute(features map[string]*feature.DomainFeatures) (map[string]string, error) { +func (r *LegacyRule) execute(features map[string]*nfdv1alpha1.DomainFeatures) (map[string]string, error) { if len(r.MatchOn) > 0 { // Logical OR over the legacy rules matched := false diff --git a/source/fake/fake.go b/source/fake/fake.go index d1d71393c..9a155f6aa 100644 --- a/source/fake/fake.go +++ b/source/fake/fake.go @@ -19,7 +19,7 @@ package fake import ( "fmt" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" ) @@ -84,7 +84,7 @@ func newDefaultConfig() *Config { // fakeSource implements the FeatureSource, LabelSource and ConfigurableSource interfaces. type fakeSource struct { config *Config - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -116,16 +116,16 @@ func (s *fakeSource) SetConfig(conf source.Config) { // Discover method of the FeatureSource interface func (s *fakeSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() - s.features.Flags[FlagFeature] = feature.NewFlagFeatures(s.config.FlagFeatures...) - s.features.Attributes[AttributeFeature] = feature.NewAttributeFeatures(s.config.AttributeFeatures) + s.features.Flags[FlagFeature] = nfdv1alpha1.NewFlagFeatures(s.config.FlagFeatures...) + s.features.Attributes[AttributeFeature] = nfdv1alpha1.NewAttributeFeatures(s.config.AttributeFeatures) - instances := make([]feature.InstanceFeature, len(s.config.InstanceFeatures)) + instances := make([]nfdv1alpha1.InstanceFeature, len(s.config.InstanceFeatures)) for i, instanceAttributes := range s.config.InstanceFeatures { - instances[i] = *feature.NewInstanceFeature(instanceAttributes) + instances[i] = *nfdv1alpha1.NewInstanceFeature(instanceAttributes) } - s.features.Instances[InstanceFeature] = feature.NewInstanceFeatures(instances) + s.features.Instances[InstanceFeature] = nfdv1alpha1.NewInstanceFeatures(instances) utils.KlogDump(3, "discovered fake features:", " ", s.features) @@ -133,9 +133,9 @@ func (s *fakeSource) Discover() error { } // GetFeatures method of the FeatureSource Interface. -func (s *fakeSource) GetFeatures() *feature.DomainFeatures { +func (s *fakeSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/kernel/kernel.go b/source/kernel/kernel.go index f2299e240..a96041104 100644 --- a/source/kernel/kernel.go +++ b/source/kernel/kernel.go @@ -21,7 +21,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" ) @@ -58,7 +58,7 @@ func newDefaultConfig() *Config { // kernelSource implements the FeatureSource, LabelSource and ConfigurableSource interfaces. type kernelSource struct { config *Config - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures // legacyKconfig contains mangled kconfig values used for // kernel.config- labels and legacy kConfig custom rules. legacyKconfig map[string]string @@ -117,13 +117,13 @@ func (s *kernelSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *kernelSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() // Read kernel version if version, err := parseVersion(); err != nil { klog.Errorf("failed to get kernel version: %s", err) } else { - s.features.Attributes[VersionFeature] = feature.NewAttributeFeatures(version) + s.features.Attributes[VersionFeature] = nfdv1alpha1.NewAttributeFeatures(version) } // Read kconfig @@ -131,20 +131,20 @@ func (s *kernelSource) Discover() error { s.legacyKconfig = nil klog.Errorf("failed to read kconfig: %s", err) } else { - s.features.Attributes[ConfigFeature] = feature.NewAttributeFeatures(realKconfig) + s.features.Attributes[ConfigFeature] = nfdv1alpha1.NewAttributeFeatures(realKconfig) s.legacyKconfig = legacyKconfig } if kmods, err := getLoadedModules(); err != nil { klog.Errorf("failed to get loaded kernel modules: %v", err) } else { - s.features.Flags[LoadedModuleFeature] = feature.NewFlagFeatures(kmods...) + s.features.Flags[LoadedModuleFeature] = nfdv1alpha1.NewFlagFeatures(kmods...) } if selinux, err := SelinuxEnabled(); err != nil { klog.Warning(err) } else { - s.features.Attributes[SelinuxFeature] = feature.NewAttributeFeatures(nil) + s.features.Attributes[SelinuxFeature] = nfdv1alpha1.NewAttributeFeatures(nil) s.features.Attributes[SelinuxFeature].Elements["enabled"] = strconv.FormatBool(selinux) } @@ -153,9 +153,9 @@ func (s *kernelSource) Discover() error { return nil } -func (s *kernelSource) GetFeatures() *feature.DomainFeatures { +func (s *kernelSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/local/local.go b/source/local/local.go index 99ce32339..2187d0b27 100644 --- a/source/local/local.go +++ b/source/local/local.go @@ -26,7 +26,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" ) @@ -45,7 +45,7 @@ var ( // localSource implements the FeatureSource and LabelSource interfaces. type localSource struct { - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures config *Config } @@ -103,7 +103,7 @@ func newDefaultConfig() *Config { // Discover method of the FeatureSource interface func (s *localSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() featuresFromFiles, err := getFeaturesFromFiles() if err != nil { @@ -129,7 +129,7 @@ func (s *localSource) Discover() error { } } - s.features.Attributes[LabelFeature] = feature.NewAttributeFeatures(featuresFromFiles) + s.features.Attributes[LabelFeature] = nfdv1alpha1.NewAttributeFeatures(featuresFromFiles) utils.KlogDump(3, "discovered local features:", " ", s.features) @@ -137,9 +137,9 @@ func (s *localSource) Discover() error { } // GetFeatures method of the FeatureSource Interface -func (s *localSource) GetFeatures() *feature.DomainFeatures { +func (s *localSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/memory/memory.go b/source/memory/memory.go index 0155da214..c9390fd7c 100644 --- a/source/memory/memory.go +++ b/source/memory/memory.go @@ -25,7 +25,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" "sigs.k8s.io/node-feature-discovery/source" @@ -42,7 +42,7 @@ const NumaFeature = "numa" // memorySource implements the FeatureSource and LabelSource interfaces. type memorySource struct { - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -84,20 +84,20 @@ func (s *memorySource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *memorySource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() // Detect NUMA if numa, err := detectNuma(); err != nil { klog.Errorf("failed to detect NUMA nodes: %v", err) } else { - s.features.Attributes[NumaFeature] = feature.AttributeFeatureSet{Elements: numa} + s.features.Attributes[NumaFeature] = nfdv1alpha1.AttributeFeatureSet{Elements: numa} } // Detect NVDIMM if nv, err := detectNv(); err != nil { klog.Errorf("failed to detect nvdimm devices: %v", err) } else { - s.features.Instances[NvFeature] = feature.InstanceFeatureSet{Elements: nv} + s.features.Instances[NvFeature] = nfdv1alpha1.InstanceFeatureSet{Elements: nv} } utils.KlogDump(3, "discovered memory features:", " ", s.features) @@ -106,9 +106,9 @@ func (s *memorySource) Discover() error { } // GetFeatures method of the FeatureSource Interface. -func (s *memorySource) GetFeatures() *feature.DomainFeatures { +func (s *memorySource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } @@ -129,9 +129,9 @@ func detectNuma() (map[string]string, error) { } // detectNv detects NVDIMM devices -func detectNv() ([]feature.InstanceFeature, error) { +func detectNv() ([]nfdv1alpha1.InstanceFeature, error) { sysfsBasePath := hostpath.SysfsDir.Path("bus/nd/devices") - info := make([]feature.InstanceFeature, 0) + info := make([]nfdv1alpha1.InstanceFeature, 0) devices, err := os.ReadDir(sysfsBasePath) if os.IsNotExist(err) { @@ -153,7 +153,7 @@ func detectNv() ([]feature.InstanceFeature, error) { // ndDevAttrs is the list of sysfs files (under each nd device) that we're trying to read var ndDevAttrs = []string{"devtype", "mode"} -func readNdDeviceInfo(path string) feature.InstanceFeature { +func readNdDeviceInfo(path string) nfdv1alpha1.InstanceFeature { attrs := map[string]string{"name": filepath.Base(path)} for _, attrName := range ndDevAttrs { data, err := os.ReadFile(filepath.Join(path, attrName)) @@ -163,7 +163,7 @@ func readNdDeviceInfo(path string) feature.InstanceFeature { } attrs[attrName] = strings.TrimSpace(string(data)) } - return *feature.NewInstanceFeature(attrs) + return *nfdv1alpha1.NewInstanceFeature(attrs) } func init() { diff --git a/source/network/network.go b/source/network/network.go index 7a36150b8..c906c1d61 100644 --- a/source/network/network.go +++ b/source/network/network.go @@ -25,7 +25,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" "sigs.k8s.io/node-feature-discovery/source" @@ -40,7 +40,7 @@ const sysfsBaseDir = "class/net" // networkSource implements the FeatureSource and LabelSource interfaces. type networkSource struct { - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -91,13 +91,13 @@ func (s *networkSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface. func (s *networkSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() devs, err := detectNetDevices() if err != nil { return fmt.Errorf("failed to detect network devices: %w", err) } - s.features.Instances[DeviceFeature] = feature.InstanceFeatureSet{Elements: devs} + s.features.Instances[DeviceFeature] = nfdv1alpha1.InstanceFeatureSet{Elements: devs} utils.KlogDump(3, "discovered network features:", " ", s.features) @@ -105,14 +105,14 @@ func (s *networkSource) Discover() error { } // GetFeatures method of the FeatureSource Interface. -func (s *networkSource) GetFeatures() *feature.DomainFeatures { +func (s *networkSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } -func detectNetDevices() ([]feature.InstanceFeature, error) { +func detectNetDevices() ([]nfdv1alpha1.InstanceFeature, error) { sysfsBasePath := hostpath.SysfsDir.Path(sysfsBaseDir) ifaces, err := os.ReadDir(sysfsBasePath) @@ -121,7 +121,7 @@ func detectNetDevices() ([]feature.InstanceFeature, error) { } // Iterate over devices - info := make([]feature.InstanceFeature, 0, len(ifaces)) + info := make([]nfdv1alpha1.InstanceFeature, 0, len(ifaces)) for _, iface := range ifaces { name := iface.Name() if _, err := os.Stat(filepath.Join(sysfsBasePath, name, "device")); err == nil { @@ -134,7 +134,7 @@ func detectNetDevices() ([]feature.InstanceFeature, error) { return info, nil } -func readIfaceInfo(path string) feature.InstanceFeature { +func readIfaceInfo(path string) nfdv1alpha1.InstanceFeature { attrs := map[string]string{"name": filepath.Base(path)} for _, attrName := range ifaceAttrs { data, err := os.ReadFile(filepath.Join(path, attrName)) @@ -158,7 +158,7 @@ func readIfaceInfo(path string) feature.InstanceFeature { attrs[attrName] = strings.TrimSpace(string(data)) } - return *feature.NewInstanceFeature(attrs) + return *nfdv1alpha1.NewInstanceFeature(attrs) } diff --git a/source/pci/pci.go b/source/pci/pci.go index b7a0f58c4..93fd0bdcd 100644 --- a/source/pci/pci.go +++ b/source/pci/pci.go @@ -22,7 +22,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" ) @@ -50,7 +50,7 @@ func newDefaultConfig() *Config { // pciSource implements the FeatureSource, LabelSource and ConfigurableSource interfaces. type pciSource struct { config *Config - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -140,13 +140,13 @@ func (s *pciSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *pciSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() devs, err := detectPci() if err != nil { return fmt.Errorf("failed to detect PCI devices: %s", err.Error()) } - s.features.Instances[DeviceFeature] = feature.NewInstanceFeatures(devs) + s.features.Instances[DeviceFeature] = nfdv1alpha1.NewInstanceFeatures(devs) utils.KlogDump(3, "discovered pci features:", " ", s.features) @@ -154,9 +154,9 @@ func (s *pciSource) Discover() error { } // GetFeatures method of the FeatureSource Interface -func (s *pciSource) GetFeatures() *feature.DomainFeatures { +func (s *pciSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/pci/utils.go b/source/pci/utils.go index 0c7b1af72..d9a370217 100644 --- a/source/pci/utils.go +++ b/source/pci/utils.go @@ -24,7 +24,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" ) @@ -50,7 +50,7 @@ func readSinglePciAttribute(devPath string, attrName string) (string, error) { } // Read information of one PCI device -func readPciDevInfo(devPath string) (*feature.InstanceFeature, error) { +func readPciDevInfo(devPath string) (*nfdv1alpha1.InstanceFeature, error) { attrs := make(map[string]string) for _, attr := range mandatoryDevAttrs { attrVal, err := readSinglePciAttribute(devPath, attr) @@ -65,12 +65,12 @@ func readPciDevInfo(devPath string) (*feature.InstanceFeature, error) { attrs[attr] = attrVal } } - return feature.NewInstanceFeature(attrs), nil + return nfdv1alpha1.NewInstanceFeature(attrs), nil } // detectPci detects available PCI devices and retrieves their device attributes. // An error is returned if reading any of the mandatory attributes fails. -func detectPci() ([]feature.InstanceFeature, error) { +func detectPci() ([]nfdv1alpha1.InstanceFeature, error) { sysfsBasePath := hostpath.SysfsDir.Path("bus/pci/devices") devices, err := os.ReadDir(sysfsBasePath) @@ -79,7 +79,7 @@ func detectPci() ([]feature.InstanceFeature, error) { } // Iterate over devices - devInfo := make([]feature.InstanceFeature, 0, len(devices)) + devInfo := make([]nfdv1alpha1.InstanceFeature, 0, len(devices)) for _, device := range devices { info, err := readPciDevInfo(filepath.Join(sysfsBasePath, device.Name())) if err != nil { diff --git a/source/source.go b/source/source.go index 44a725ba8..2f0eb6dc8 100644 --- a/source/source.go +++ b/source/source.go @@ -21,7 +21,7 @@ package source import ( "fmt" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" ) // Source is the base interface for all other source interfaces @@ -38,7 +38,7 @@ type FeatureSource interface { Discover() error // GetFeatures returns discovered features in raw form - GetFeatures() *feature.DomainFeatures + GetFeatures() *nfdv1alpha1.DomainFeatures } // LabelSource represents a source of node feature labels diff --git a/source/storage/storage.go b/source/storage/storage.go index e04a8e361..e0b107b43 100644 --- a/source/storage/storage.go +++ b/source/storage/storage.go @@ -24,7 +24,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" "sigs.k8s.io/node-feature-discovery/source" @@ -37,7 +37,7 @@ const BlockFeature = "block" // storageSource implements the FeatureSource and LabelSource interfaces. type storageSource struct { - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -73,13 +73,13 @@ func (s *storageSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *storageSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() devs, err := detectBlock() if err != nil { return fmt.Errorf("failed to detect block devices: %w", err) } - s.features.Instances[BlockFeature] = feature.InstanceFeatureSet{Elements: devs} + s.features.Instances[BlockFeature] = nfdv1alpha1.InstanceFeatureSet{Elements: devs} utils.KlogDump(3, "discovered storage features:", " ", s.features) @@ -87,14 +87,14 @@ func (s *storageSource) Discover() error { } // GetFeatures method of the FeatureSource Interface. -func (s *storageSource) GetFeatures() *feature.DomainFeatures { +func (s *storageSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } -func detectBlock() ([]feature.InstanceFeature, error) { +func detectBlock() ([]nfdv1alpha1.InstanceFeature, error) { sysfsBasePath := hostpath.SysfsDir.Path("block") blockdevices, err := os.ReadDir(sysfsBasePath) @@ -103,7 +103,7 @@ func detectBlock() ([]feature.InstanceFeature, error) { } // Iterate over devices - info := make([]feature.InstanceFeature, 0, len(blockdevices)) + info := make([]nfdv1alpha1.InstanceFeature, 0, len(blockdevices)) for _, device := range blockdevices { info = append(info, *readBlockDevQueueInfo(filepath.Join(sysfsBasePath, device.Name()))) } @@ -111,7 +111,7 @@ func detectBlock() ([]feature.InstanceFeature, error) { return info, nil } -func readBlockDevQueueInfo(path string) *feature.InstanceFeature { +func readBlockDevQueueInfo(path string) *nfdv1alpha1.InstanceFeature { attrs := map[string]string{"name": filepath.Base(path)} for _, attrName := range queueAttrs { data, err := os.ReadFile(filepath.Join(path, "queue", attrName)) @@ -121,7 +121,7 @@ func readBlockDevQueueInfo(path string) *feature.InstanceFeature { } attrs[attrName] = strings.TrimSpace(string(data)) } - return feature.NewInstanceFeature(attrs) + return nfdv1alpha1.NewInstanceFeature(attrs) } func init() { diff --git a/source/system/system.go b/source/system/system.go index 8f437bbd3..304c9ed74 100644 --- a/source/system/system.go +++ b/source/system/system.go @@ -24,7 +24,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath" "sigs.k8s.io/node-feature-discovery/source" @@ -47,7 +47,7 @@ const ( // systemSource implements the FeatureSource and LabelSource interfaces. type systemSource struct { - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -78,10 +78,10 @@ func (s *systemSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *systemSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() // Get node name - s.features.Attributes[NameFeature] = feature.NewAttributeFeatures(nil) + s.features.Attributes[NameFeature] = nfdv1alpha1.NewAttributeFeatures(nil) s.features.Attributes[NameFeature].Elements["nodename"] = os.Getenv("NODE_NAME") // Get os-release information @@ -89,7 +89,7 @@ func (s *systemSource) Discover() error { if err != nil { klog.Errorf("failed to get os-release: %s", err) } else { - s.features.Attributes[OsReleaseFeature] = feature.NewAttributeFeatures(release) + s.features.Attributes[OsReleaseFeature] = nfdv1alpha1.NewAttributeFeatures(release) if v, ok := release["VERSION_ID"]; ok { versionComponents := splitVersion(v) @@ -107,9 +107,9 @@ func (s *systemSource) Discover() error { } // GetFeatures method of the FeatureSource Interface -func (s *systemSource) GetFeatures() *feature.DomainFeatures { +func (s *systemSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/usb/usb.go b/source/usb/usb.go index 200f3b236..fd8a10dbc 100644 --- a/source/usb/usb.go +++ b/source/usb/usb.go @@ -22,7 +22,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" "sigs.k8s.io/node-feature-discovery/pkg/utils" "sigs.k8s.io/node-feature-discovery/source" ) @@ -53,7 +53,7 @@ func defaultDeviceLabelFields() []string { return []string{"class", "vendor", "d // usbSource implements the LabelSource and ConfigurableSource interfaces. type usbSource struct { config *Config - features *feature.DomainFeatures + features *nfdv1alpha1.DomainFeatures } // Singleton source instance @@ -139,13 +139,13 @@ func (s *usbSource) GetLabels() (source.FeatureLabels, error) { // Discover method of the FeatureSource interface func (s *usbSource) Discover() error { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() devs, err := detectUsb() if err != nil { return fmt.Errorf("failed to detect USB devices: %s", err.Error()) } - s.features.Instances[DeviceFeature] = feature.NewInstanceFeatures(devs) + s.features.Instances[DeviceFeature] = nfdv1alpha1.NewInstanceFeatures(devs) utils.KlogDump(3, "discovered usb features:", " ", s.features) @@ -153,9 +153,9 @@ func (s *usbSource) Discover() error { } // GetFeatures method of the FeatureSource Interface -func (s *usbSource) GetFeatures() *feature.DomainFeatures { +func (s *usbSource) GetFeatures() *nfdv1alpha1.DomainFeatures { if s.features == nil { - s.features = feature.NewDomainFeatures() + s.features = nfdv1alpha1.NewDomainFeatures() } return s.features } diff --git a/source/usb/utils.go b/source/usb/utils.go index 38a5dbe35..c7772f885 100644 --- a/source/usb/utils.go +++ b/source/usb/utils.go @@ -25,7 +25,7 @@ import ( "k8s.io/klog/v2" - "sigs.k8s.io/node-feature-discovery/pkg/api/feature" + nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/pkg/apis/nfd/v1alpha1" ) var devAttrs = []string{"class", "vendor", "device", "serial"} @@ -57,8 +57,8 @@ func readSingleUsbAttribute(devPath string, attrName string) (string, error) { } // Read information of one USB device -func readUsbDevInfo(devPath string) ([]feature.InstanceFeature, error) { - instances := make([]feature.InstanceFeature, 0) +func readUsbDevInfo(devPath string) ([]nfdv1alpha1.InstanceFeature, error) { + instances := make([]nfdv1alpha1.InstanceFeature, 0) attrs := make(map[string]string) for _, attr := range devAttrs { @@ -71,7 +71,7 @@ func readUsbDevInfo(devPath string) ([]feature.InstanceFeature, error) { // USB devices encode their class information either at the device or the interface level. If the device class // is set, return as-is. if attrs["class"] != "00" { - instances = append(instances, *feature.NewInstanceFeature(attrs)) + instances = append(instances, *nfdv1alpha1.NewInstanceFeature(attrs)) } else { // Otherwise, if a 00 is presented at the device level, descend to the interface level. interfaces, err := filepath.Glob(devPath + "/*/bInterfaceClass") @@ -94,7 +94,7 @@ func readUsbDevInfo(devPath string) ([]feature.InstanceFeature, error) { } subdevAttrs["class"] = attrVal - instances = append(instances, *feature.NewInstanceFeature(subdevAttrs)) + instances = append(instances, *nfdv1alpha1.NewInstanceFeature(subdevAttrs)) } } @@ -102,7 +102,7 @@ func readUsbDevInfo(devPath string) ([]feature.InstanceFeature, error) { } // detectUsb detects available USB devices and retrieves their device attributes. -func detectUsb() ([]feature.InstanceFeature, error) { +func detectUsb() ([]nfdv1alpha1.InstanceFeature, error) { // Unlike PCI, the USB sysfs interface includes entries not just for // devices. We work around this by globbing anything that includes a // valid product ID. @@ -113,7 +113,7 @@ func detectUsb() ([]feature.InstanceFeature, error) { } // Iterate over devices - devInfo := make([]feature.InstanceFeature, 0) + devInfo := make([]nfdv1alpha1.InstanceFeature, 0) for _, devPath := range devPaths { devs, err := readUsbDevInfo(filepath.Dir(devPath)) if err != nil {