1
0
Fork 0
mirror of https://github.com/kubernetes-sigs/node-feature-discovery.git synced 2025-03-15 04:57:56 +00:00

topology-updater: Refactor Scan to expand response

We are gonna add new data to Scan response so better introduce a new
ScanResponse struct as Scan return value to make it easier.
This commit is contained in:
Jose Luis Ojosnegros Manchón 2023-02-07 12:13:29 +01:00
parent 69440d7820
commit 1a687cb286
4 changed files with 39 additions and 35 deletions

View file

@ -154,13 +154,13 @@ func (w *nfdTopologyUpdater) Run() error {
select {
case <-crTrigger.C:
klog.Infof("Scanning")
podResources, err := resScan.Scan()
utils.KlogDump(1, "podResources are", " ", podResources)
scanResponse, err := resScan.Scan()
utils.KlogDump(1, "podResources are", " ", scanResponse.PodResources)
if err != nil {
klog.Warningf("Scan failed: %v", err)
continue
}
zones = resAggr.Aggregate(podResources)
zones = resAggr.Aggregate(scanResponse.PodResources)
utils.KlogDump(1, "After aggregating resources identified zones are", " ", zones)
if !w.args.NoPublish {
if err = w.updateNodeResourceTopology(zones); err != nil {

View file

@ -113,14 +113,14 @@ func hasIntegralCPUs(pod *corev1.Pod, container *corev1.Container) bool {
}
// Scan gathers all the PodResources from the system, using the podresources API client.
func (resMon *PodResourcesScanner) Scan() ([]PodResources, error) {
func (resMon *PodResourcesScanner) Scan() (ScanResponse, error) {
ctx, cancel := context.WithTimeout(context.Background(), defaultPodResourcesTimeout)
defer cancel()
// Pod Resource API client
resp, err := resMon.podResourceClient.List(ctx, &podresourcesapi.ListPodResourcesRequest{})
if err != nil {
return nil, fmt.Errorf("can't receive response: %v.Get(_) = _, %w", resMon.podResourceClient, err)
return ScanResponse{}, fmt.Errorf("can't receive response: %v.Get(_) = _, %w", resMon.podResourceClient, err)
}
var podResData []PodResources
@ -130,7 +130,7 @@ func (resMon *PodResourcesScanner) Scan() ([]PodResources, error) {
hasDevice := hasDevice(podResource)
isWatchable, isIntegralGuaranteed, err := resMon.isWatchable(podResource.GetNamespace(), podResource.GetName(), hasDevice)
if err != nil {
return nil, fmt.Errorf("checking if pod in a namespace is watchable, namespace:%v, pod name %v: %v", podResource.GetNamespace(), podResource.GetName(), err)
return ScanResponse{}, fmt.Errorf("checking if pod in a namespace is watchable, namespace:%v, pod name %v: %v", podResource.GetNamespace(), podResource.GetName(), err)
}
if !isWatchable {
continue
@ -198,7 +198,7 @@ func (resMon *PodResourcesScanner) Scan() ([]PodResources, error) {
}
return podResData, nil
return ScanResponse{PodResources: podResData}, nil
}
func hasDevice(podResource *podresourcesapi.PodResources) bool {

View file

@ -58,7 +58,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldNotBeNil)
})
Convey("Return PodResources should be nil", func() {
So(res, ShouldBeNil)
So(res.PodResources, ShouldBeNil)
})
})
@ -70,7 +70,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should be zero", func() {
So(len(res), ShouldEqual, 0)
So(len(res.PodResources), ShouldEqual, 0)
})
})
@ -160,7 +160,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
expected := []PodResources{
{
@ -194,14 +194,14 @@ func TestPodScanner(t *testing.T) {
},
},
}
for _, podresource := range res {
for _, podresource := range res.PodResources {
for _, container := range podresource.Containers {
sort.Slice(res, func(i, j int) bool {
sort.Slice(res.PodResources, func(i, j int) bool {
return container.Resources[i].Name < container.Resources[j].Name
})
}
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -266,7 +266,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
expected := []PodResources{
{
@ -290,7 +290,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -345,7 +345,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
expected := []PodResources{
{
@ -365,7 +365,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -427,7 +427,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
expected := []PodResources{
{
@ -447,7 +447,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -505,7 +505,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
})
expected := []PodResources{
@ -526,7 +526,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
Convey("When I successfully get valid response for (non-guaranteed) pods with devices with cpus", func() {
@ -589,7 +589,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
})
expected := []PodResources{
@ -609,7 +609,7 @@ func TestPodScanner(t *testing.T) {
},
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -632,7 +632,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldNotBeNil)
})
Convey("Return PodResources should be nil", func() {
So(res, ShouldBeNil)
So(res.PodResources, ShouldBeNil)
})
})
@ -644,7 +644,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should be zero", func() {
So(len(res), ShouldEqual, 0)
So(len(res.PodResources), ShouldEqual, 0)
})
})
@ -712,7 +712,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should be zero", func() {
So(len(res), ShouldEqual, 0)
So(len(res.PodResources), ShouldEqual, 0)
})
})
@ -778,7 +778,7 @@ func TestPodScanner(t *testing.T) {
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
expected := []PodResources{
{
@ -802,7 +802,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})
@ -858,7 +858,7 @@ func TestPodScanner(t *testing.T) {
})
Convey("Return PodResources should have values", func() {
Convey("Return PodResources should be zero", func() {
So(len(res), ShouldEqual, 0)
So(len(res.PodResources), ShouldEqual, 0)
})
})
})
@ -923,7 +923,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldEqual, 0)
So(len(res.PodResources), ShouldEqual, 0)
})
})
@ -981,7 +981,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
})
expected := []PodResources{
@ -1002,7 +1002,7 @@ func TestPodScanner(t *testing.T) {
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
Convey("When I successfully get valid response for (non-guaranteed) pods with devices with cpus", func() {
@ -1065,7 +1065,7 @@ func TestPodScanner(t *testing.T) {
So(err, ShouldBeNil)
})
Convey("Return PodResources should have values", func() {
So(len(res), ShouldBeGreaterThan, 0)
So(len(res.PodResources), ShouldBeGreaterThan, 0)
})
expected := []PodResources{
@ -1085,7 +1085,7 @@ func TestPodScanner(t *testing.T) {
},
},
}
So(reflect.DeepEqual(res, expected), ShouldBeTrue)
So(reflect.DeepEqual(res.PodResources, expected), ShouldBeTrue)
})
})

View file

@ -53,9 +53,13 @@ type PodResources struct {
Containers []ContainerResources
}
type ScanResponse struct {
PodResources []PodResources
}
// ResourcesScanner gathers all the PodResources from the system, using the podresources API client
type ResourcesScanner interface {
Scan() ([]PodResources, error)
Scan() (ScanResponse, error)
}
// ResourcesAggregator aggregates resource information based on the received data from underlying hardware and podresource API