@@ -11,8 +11,10 @@ import (
1111 "testing"
1212
1313 openapi_types "github.com/oapi-codegen/runtime/types"
14+ "github.com/stretchr/testify/assert"
1415 "github.com/stretchr/testify/mock"
1516 "github.com/stretchr/testify/require"
17+ corev1 "k8s.io/api/core/v1"
1618 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1719 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1820 capi "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -23,6 +25,42 @@ import (
2325 "github.com/open-edge-platform/cluster-manager/v2/pkg/api"
2426)
2527
28+ var clusterStatusReady = capi.ClusterStatus {
29+ Phase : string (capi .ClusterPhaseProvisioned ),
30+ Conditions : []capi.Condition {
31+ {
32+ Type : capi .ReadyCondition ,
33+ Status : corev1 .ConditionTrue ,
34+ },
35+ {
36+ Type : capi .ControlPlaneReadyCondition ,
37+ Status : corev1 .ConditionTrue ,
38+ },
39+ {
40+ Type : capi .InfrastructureReadyCondition ,
41+ Status : corev1 .ConditionTrue ,
42+ },
43+ },
44+ }
45+
46+ var clusterStatusInProgressControlPlane = capi.ClusterStatus {
47+ Phase : string (capi .ClusterPhaseProvisioning ),
48+ Conditions : []capi.Condition {
49+ {
50+ Type : capi .ReadyCondition ,
51+ Status : corev1 .ConditionFalse ,
52+ },
53+ {
54+ Type : capi .ControlPlaneReadyCondition ,
55+ Status : corev1 .ConditionFalse ,
56+ },
57+ {
58+ Type : capi .InfrastructureReadyCondition ,
59+ Status : corev1 .ConditionTrue ,
60+ },
61+ },
62+ }
63+
2664func createMockServer (t * testing.T , clusters []capi.Cluster , projectID string , options ... bool ) * Server {
2765 unstructuredClusters := make ([]unstructured.Unstructured , len (clusters ))
2866 for i , cluster := range clusters {
@@ -77,6 +115,22 @@ func generateCluster(name *string, version *string) capi.Cluster {
77115 }
78116}
79117
118+ func generateClusterWithStatus (name , version * string , status capi.ClusterStatus ) capi.Cluster {
119+ clusterName := ""
120+ if name != nil {
121+ clusterName = * name
122+ }
123+ clusterVersion := ""
124+ if version != nil {
125+ clusterVersion = * version
126+ }
127+ return capi.Cluster {
128+ ObjectMeta : metav1.ObjectMeta {Name : clusterName },
129+ Spec : capi.ClusterSpec {Topology : & capi.Topology {Version : clusterVersion }},
130+ Status : status ,
131+ }
132+ }
133+
80134func generateClusterInfo (name , version string , lifecycleIndicator api.StatusIndicator , lifecycleMessage string ) api.ClusterInfo {
81135 return api.ClusterInfo {
82136 Name : ptr (name ),
@@ -450,6 +504,88 @@ func TestGetV2Clusters200(t *testing.T) {
450504 }
451505 require .Equal (t , expectedResponse , actualResponse , "GetV2Clusters() response = %v, want %v" , actualResponse , expectedResponse )
452506 })
507+
508+ t .Run ("filtered clusters by conditions" , func (t * testing.T ) {
509+ tests := []struct {
510+ name string
511+ clusters []capi.Cluster
512+ filter string
513+ expectedResult api.GetV2Clusters200JSONResponse
514+ }{
515+ {
516+ name : "filtered clusters by providerStatus" ,
517+ clusters : []capi.Cluster {
518+ generateClusterWithStatus (ptr ("example-cluster-1" ), ptr ("v1.30.6+rke2r1" ), clusterStatusReady ),
519+ generateClusterWithStatus (ptr ("example-cluster-2" ), ptr ("v1.20.4+rke2r1" ), clusterStatusInProgressControlPlane ),
520+ },
521+ filter : "providerStatus=ready" ,
522+ expectedResult : api.GetV2Clusters200JSONResponse {
523+ Clusters : & []api.ClusterInfo {
524+ generateClusterInfo ("example-cluster-1" , "v1.30.6+rke2r1" , api .STATUSINDICATIONIDLE , "active" ),
525+ },
526+ TotalElements : 1 ,
527+ },
528+ },
529+ {
530+ name : "filtered clusters by lifecyclePhase" ,
531+ clusters : []capi.Cluster {
532+ generateClusterWithStatus (ptr ("example-cluster-1" ), ptr ("v1.30.6+rke2r1" ), clusterStatusReady ),
533+ generateClusterWithStatus (ptr ("example-cluster-2" ), ptr ("v1.20.4+rke2r1" ), clusterStatusInProgressControlPlane ),
534+ },
535+ filter : "lifecyclePhase=active" ,
536+ expectedResult : api.GetV2Clusters200JSONResponse {
537+ Clusters : & []api.ClusterInfo {
538+ generateClusterInfo ("example-cluster-1" , "v1.30.6+rke2r1" , api .STATUSINDICATIONIDLE , "active" ),
539+ },
540+ TotalElements : 1 ,
541+ },
542+ },
543+ }
544+
545+ for _ , tt := range tests {
546+ t .Run (tt .name , func (t * testing.T ) {
547+ server := createMockServer (t , tt .clusters , expectedActiveProjectID )
548+ require .NotNil (t , server , "NewServer() returned nil, want not nil" )
549+
550+ // Create a new request & response recorder
551+ req := httptest .NewRequest ("GET" , "/v2/clusters?filter=" + tt .filter , nil )
552+ req .Header .Set ("Activeprojectid" , expectedActiveProjectID )
553+ rr := httptest .NewRecorder ()
554+
555+ // create a handler with middleware to serve the request
556+ handler , err := server .ConfigureHandler ()
557+ require .Nil (t , err )
558+ handler .ServeHTTP (rr , req )
559+
560+ // Parse the response body
561+ var actualResponse api.GetV2Clusters200JSONResponse
562+ err = json .Unmarshal (rr .Body .Bytes (), & actualResponse )
563+ assert .NoError (t , err , "Failed to unmarshal response body" )
564+
565+ // Check the response status
566+ assert .Equal (t , http .StatusOK , rr .Code , "ServeHTTP() status = %v, want %v" , rr .Code , 200 )
567+
568+ for _ , cluster := range * actualResponse .Clusters {
569+ cluster .ControlPlaneReady .Message = ptr ("condition not found" )
570+ cluster .ControlPlaneReady .Timestamp = ptr (uint64 (0 ))
571+
572+ cluster .InfrastructureReady .Message = ptr ("condition not found" )
573+ cluster .InfrastructureReady .Timestamp = ptr (uint64 (0 ))
574+
575+ cluster .ProviderStatus .Indicator = statusIndicatorPtr (api .STATUSINDICATIONUNSPECIFIED )
576+ cluster .ProviderStatus .Message = ptr ("condition not found" )
577+ cluster .ProviderStatus .Timestamp = ptr (uint64 (0 ))
578+
579+ cluster .NodeHealth .Timestamp = ptr (uint64 (0 ))
580+ cluster .LifecyclePhase .Timestamp = ptr (uint64 (0 ))
581+ }
582+
583+ // Check the response content
584+ assert .Equal (t , tt .expectedResult , actualResponse , "GetV2Clusters() response = %v, want %v" , actualResponse , tt .expectedResult )
585+ })
586+ }
587+ })
588+
453589 t .Run ("no clusters after filter criteria" , func (t * testing.T ) {
454590 clusters := []capi.Cluster {
455591 generateCluster (ptr ("example-cluster-1" ), ptr ("v1.30.6+rke2r1" )),
0 commit comments