@@ -20,9 +20,12 @@ import (
2020 "context"
2121 "net/http"
2222
23+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+ "k8s.io/apimachinery/pkg/labels"
2325 "k8s.io/client-go/kubernetes"
2426 "k8s.io/client-go/rest"
2527
28+ "github.com/NVIDIA/topograph/internal/config"
2629 "github.com/NVIDIA/topograph/internal/httperr"
2730 "github.com/NVIDIA/topograph/pkg/engines"
2831 "github.com/NVIDIA/topograph/pkg/topology"
@@ -33,13 +36,27 @@ const NAME = "k8s"
3336type K8sEngine struct {
3437 config * rest.Config
3538 client * kubernetes.Clientset
39+ params * Params
40+ }
41+
42+ type Params struct {
43+ // NodeSelector (optional) specifies nodes participating in the topology
44+ NodeSelector map [string ]string `mapstructure:"nodeSelector"`
45+
46+ // derived fields
47+ nodeListOpt * metav1.ListOptions
3648}
3749
3850func NamedLoader () (string , engines.Loader ) {
3951 return NAME , Loader
4052}
4153
42- func Loader (_ context.Context , _ engines.Config ) (engines.Engine , * httperr.Error ) {
54+ func Loader (_ context.Context , params engines.Config ) (engines.Engine , * httperr.Error ) {
55+ p , err := getParameters (params )
56+ if err != nil {
57+ return nil , httperr .NewError (http .StatusBadRequest , err .Error ())
58+ }
59+
4360 config , err := rest .InClusterConfig ()
4461 if err != nil {
4562 return nil , httperr .NewError (http .StatusBadGateway , err .Error ())
@@ -53,9 +70,25 @@ func Loader(_ context.Context, _ engines.Config) (engines.Engine, *httperr.Error
5370 return & K8sEngine {
5471 config : config ,
5572 client : client ,
73+ params : p ,
5674 }, nil
5775}
5876
77+ func getParameters (params engines.Config ) (* Params , error ) {
78+ p := & Params {}
79+ if err := config .Decode (params , p ); err != nil {
80+ return nil , err
81+ }
82+
83+ if len (p .NodeSelector ) != 0 {
84+ p .nodeListOpt = & metav1.ListOptions {
85+ LabelSelector : labels .Set (p .NodeSelector ).String (),
86+ }
87+ }
88+
89+ return p , nil
90+ }
91+
5992func (eng * K8sEngine ) GenerateOutput (ctx context.Context , tree * topology.Vertex , params map [string ]any ) ([]byte , * httperr.Error ) {
6093 if err := NewTopologyLabeler ().ApplyNodeLabels (ctx , tree , eng ); err != nil {
6194 return nil , httperr .NewError (http .StatusBadGateway , err .Error ())
0 commit comments