@@ -14,6 +14,7 @@ import (
1414
1515 "github.com/NVIDIA/KAI-scheduler/cmd/scheduler/app/options"
1616 kaiv1 "github.com/NVIDIA/KAI-scheduler/pkg/apis/kai/v1"
17+ kaiprometheus "github.com/NVIDIA/KAI-scheduler/pkg/apis/kai/v1/prometheus"
1718 kaiv1qc "github.com/NVIDIA/KAI-scheduler/pkg/apis/kai/v1/queue_controller"
1819 kaiv1scheduler "github.com/NVIDIA/KAI-scheduler/pkg/apis/kai/v1/scheduler"
1920 usagedbapi "github.com/NVIDIA/KAI-scheduler/pkg/scheduler/cache/usagedb/api"
@@ -719,3 +720,285 @@ usageDBConfig:
719720 err = yaml .Unmarshal ([]byte (configString ), config )
720721 assert .NoError (t , err )
721722}
723+
724+ func TestGetUsageDBConfig (t * testing.T ) {
725+ tests := []struct {
726+ name string
727+ shard * kaiv1.SchedulingShard
728+ kaiConfig * kaiv1.Config
729+ expectError bool
730+ errorMsg string
731+ validate func (t * testing.T , result * usagedbapi.UsageDBConfig )
732+ }{
733+ {
734+ name : "nil shard" ,
735+ shard : nil ,
736+ kaiConfig : & kaiv1.Config {},
737+ expectError : true ,
738+ errorMsg : "shard cannot be nil" ,
739+ },
740+ {
741+ name : "nil kaiConfig" ,
742+ shard : & kaiv1.SchedulingShard {},
743+ kaiConfig : nil ,
744+ expectError : true ,
745+ errorMsg : "kaiConfig cannot be nil" ,
746+ },
747+ {
748+ name : "nil UsageDBConfig" ,
749+ shard : & kaiv1.SchedulingShard {
750+ Spec : kaiv1.SchedulingShardSpec {
751+ UsageDBConfig : nil ,
752+ },
753+ },
754+ kaiConfig : & kaiv1.Config {},
755+ expectError : false ,
756+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
757+ assert .Nil (t , result )
758+ },
759+ },
760+ {
761+ name : "non-prometheus client type" ,
762+ shard : & kaiv1.SchedulingShard {
763+ Spec : kaiv1.SchedulingShardSpec {
764+ UsageDBConfig : & usagedbapi.UsageDBConfig {
765+ ClientType : "custom" ,
766+ ConnectionString : "http://custom-db:9090" ,
767+ },
768+ },
769+ },
770+ kaiConfig : & kaiv1.Config {},
771+ expectError : false ,
772+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
773+ assert .NotNil (t , result )
774+ assert .Equal (t , "custom" , result .ClientType )
775+ assert .Equal (t , "http://custom-db:9090" , result .ConnectionString )
776+ },
777+ },
778+ {
779+ name : "prometheus with explicit connection string" ,
780+ shard : & kaiv1.SchedulingShard {
781+ Spec : kaiv1.SchedulingShardSpec {
782+ UsageDBConfig : & usagedbapi.UsageDBConfig {
783+ ClientType : "prometheus" ,
784+ ConnectionString : "http://external-prometheus:9090" ,
785+ },
786+ },
787+ },
788+ kaiConfig : & kaiv1.Config {},
789+ expectError : false ,
790+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
791+ assert .NotNil (t , result )
792+ assert .Equal (t , "prometheus" , result .ClientType )
793+ assert .Equal (t , "http://external-prometheus:9090" , result .ConnectionString )
794+ },
795+ },
796+ {
797+ name : "prometheus with internal prometheus enabled" ,
798+ shard : & kaiv1.SchedulingShard {
799+ Spec : kaiv1.SchedulingShardSpec {
800+ UsageDBConfig : & usagedbapi.UsageDBConfig {
801+ ClientType : "prometheus" ,
802+ },
803+ },
804+ },
805+ kaiConfig : & kaiv1.Config {
806+ Spec : kaiv1.ConfigSpec {
807+ Namespace : "kai-system" ,
808+ Prometheus : & kaiprometheus.Prometheus {
809+ Enabled : ptr .To (true ),
810+ },
811+ },
812+ },
813+ expectError : false ,
814+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
815+ assert .NotNil (t , result )
816+ assert .Equal (t , "prometheus" , result .ClientType )
817+ assert .Equal (t , "http://prometheus-operated.kai-system.svc.cluster.local:9090" , result .ConnectionString )
818+ },
819+ },
820+ {
821+ name : "prometheus with external TSDB connection" ,
822+ shard : & kaiv1.SchedulingShard {
823+ Spec : kaiv1.SchedulingShardSpec {
824+ UsageDBConfig : & usagedbapi.UsageDBConfig {
825+ ClientType : "prometheus" ,
826+ },
827+ },
828+ },
829+ kaiConfig : & kaiv1.Config {
830+ Spec : kaiv1.ConfigSpec {
831+ Namespace : "kai-system" ,
832+ Global : & kaiv1.GlobalConfig {
833+ ExternalTSDBConnection : & kaiv1.Connection {
834+ URL : ptr .To ("http://external-tsdb:9090" ),
835+ },
836+ },
837+ },
838+ },
839+ expectError : false ,
840+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
841+ assert .NotNil (t , result )
842+ assert .Equal (t , "prometheus" , result .ClientType )
843+ assert .Equal (t , "http://external-tsdb:9090" , result .ConnectionString )
844+ },
845+ },
846+ {
847+ name : "prometheus with nil prometheus config" ,
848+ shard : & kaiv1.SchedulingShard {
849+ Spec : kaiv1.SchedulingShardSpec {
850+ UsageDBConfig : & usagedbapi.UsageDBConfig {
851+ ClientType : "prometheus" ,
852+ },
853+ },
854+ },
855+ kaiConfig : & kaiv1.Config {
856+ Spec : kaiv1.ConfigSpec {
857+ Namespace : "kai-system" ,
858+ Prometheus : nil ,
859+ Global : & kaiv1.GlobalConfig {
860+ ExternalTSDBConnection : & kaiv1.Connection {
861+ URL : ptr .To ("http://external-tsdb:9090" ),
862+ },
863+ },
864+ },
865+ },
866+ expectError : false ,
867+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
868+ assert .NotNil (t , result )
869+ assert .Equal (t , "prometheus" , result .ClientType )
870+ assert .Equal (t , "http://external-tsdb:9090" , result .ConnectionString )
871+ },
872+ },
873+ {
874+ name : "prometheus with prometheus.enabled = false" ,
875+ shard : & kaiv1.SchedulingShard {
876+ Spec : kaiv1.SchedulingShardSpec {
877+ UsageDBConfig : & usagedbapi.UsageDBConfig {
878+ ClientType : "prometheus" ,
879+ },
880+ },
881+ },
882+ kaiConfig : & kaiv1.Config {
883+ Spec : kaiv1.ConfigSpec {
884+ Namespace : "kai-system" ,
885+ Prometheus : & kaiprometheus.Prometheus {
886+ Enabled : ptr .To (false ),
887+ },
888+ Global : & kaiv1.GlobalConfig {
889+ ExternalTSDBConnection : & kaiv1.Connection {
890+ URL : ptr .To ("http://external-tsdb:9090" ),
891+ },
892+ },
893+ },
894+ },
895+ expectError : false ,
896+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
897+ assert .NotNil (t , result )
898+ assert .Equal (t , "prometheus" , result .ClientType )
899+ assert .Equal (t , "http://external-tsdb:9090" , result .ConnectionString )
900+ },
901+ },
902+ {
903+ name : "prometheus with nil external TSDB connection" ,
904+ shard : & kaiv1.SchedulingShard {
905+ Spec : kaiv1.SchedulingShardSpec {
906+ UsageDBConfig : & usagedbapi.UsageDBConfig {
907+ ClientType : "prometheus" ,
908+ },
909+ },
910+ },
911+ kaiConfig : & kaiv1.Config {
912+ Spec : kaiv1.ConfigSpec {
913+ Namespace : "kai-system" ,
914+ Global : & kaiv1.GlobalConfig {
915+ ExternalTSDBConnection : nil ,
916+ },
917+ },
918+ },
919+ expectError : true ,
920+ errorMsg : "prometheus connection string not configured" ,
921+ },
922+ {
923+ name : "prometheus with nil external TSDB URL" ,
924+ shard : & kaiv1.SchedulingShard {
925+ Spec : kaiv1.SchedulingShardSpec {
926+ UsageDBConfig : & usagedbapi.UsageDBConfig {
927+ ClientType : "prometheus" ,
928+ },
929+ },
930+ },
931+ kaiConfig : & kaiv1.Config {
932+ Spec : kaiv1.ConfigSpec {
933+ Namespace : "kai-system" ,
934+ Global : & kaiv1.GlobalConfig {
935+ ExternalTSDBConnection : & kaiv1.Connection {
936+ URL : nil ,
937+ },
938+ },
939+ },
940+ },
941+ expectError : true ,
942+ errorMsg : "prometheus connection string not configured" ,
943+ },
944+ {
945+ name : "prometheus with nil global config" ,
946+ shard : & kaiv1.SchedulingShard {
947+ Spec : kaiv1.SchedulingShardSpec {
948+ UsageDBConfig : & usagedbapi.UsageDBConfig {
949+ ClientType : "prometheus" ,
950+ },
951+ },
952+ },
953+ kaiConfig : & kaiv1.Config {
954+ Spec : kaiv1.ConfigSpec {
955+ Namespace : "kai-system" ,
956+ Global : nil ,
957+ },
958+ },
959+ expectError : true ,
960+ errorMsg : "prometheus connection string not configured" ,
961+ },
962+ {
963+ name : "deep copy preserves usage params" ,
964+ shard : & kaiv1.SchedulingShard {
965+ Spec : kaiv1.SchedulingShardSpec {
966+ UsageDBConfig : & usagedbapi.UsageDBConfig {
967+ ClientType : "prometheus" ,
968+ ConnectionString : "http://prometheus:9090" ,
969+ UsageParams : & usagedbapi.UsageParams {
970+ HalfLifePeriod : & metav1.Duration {Duration : 10 * time .Minute },
971+ WindowSize : & metav1.Duration {Duration : 20 * time .Minute },
972+ },
973+ },
974+ },
975+ },
976+ kaiConfig : & kaiv1.Config {},
977+ expectError : false ,
978+ validate : func (t * testing.T , result * usagedbapi.UsageDBConfig ) {
979+ assert .NotNil (t , result )
980+ assert .NotNil (t , result .UsageParams )
981+ assert .Equal (t , 10 * time .Minute , result .UsageParams .HalfLifePeriod .Duration )
982+ assert .Equal (t , 20 * time .Minute , result .UsageParams .WindowSize .Duration )
983+ },
984+ },
985+ }
986+
987+ for _ , tt := range tests {
988+ t .Run (tt .name , func (t * testing.T ) {
989+ result , err := getUsageDBConfig (tt .shard , tt .kaiConfig )
990+
991+ if tt .expectError {
992+ require .Error (t , err )
993+ if tt .errorMsg != "" {
994+ assert .Contains (t , err .Error (), tt .errorMsg )
995+ }
996+ } else {
997+ require .NoError (t , err )
998+ if tt .validate != nil {
999+ tt .validate (t , result )
1000+ }
1001+ }
1002+ })
1003+ }
1004+ }
0 commit comments