mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2025-03-30 19:54:46 +00:00
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.
This commit is contained in:
parent
0e1a48fdb2
commit
0e1d4a9046
27 changed files with 208 additions and 223 deletions
|
@ -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
|
|
@ -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{}
|
|
@ -19,3 +19,5 @@ limitations under the License.
|
|||
// +kubebuilder:object:generate=true
|
||||
// +groupName=nfd.k8s-sigs.io
|
||||
package v1alpha1
|
||||
|
||||
//go:generate ./generate.sh
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
12
pkg/apis/nfd/v1alpha1/generate.sh
Executable file
12
pkg/apis/nfd/v1alpha1/generate.sh
Executable file
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<string, string> labels = 3;
|
||||
map<string, feature.DomainFeatures> features = 4;
|
||||
map<string, v1alpha1.DomainFeatures> features = 4;
|
||||
}
|
||||
|
||||
message SetLabelsReply {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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-<flag> 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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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)
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue