diff --git a/client/cluster.go b/client/cluster.go index 15d8e984..a350393e 100644 --- a/client/cluster.go +++ b/client/cluster.go @@ -104,73 +104,6 @@ func (h *V1Client) SearchClusterSummaries(clusterContext string, filter *models. return resp.Payload.Items, nil } -func (h *V1Client) listClusters(clusterContext string) ([]*models.V1SpectroCluster, error) { - client, err := h.GetClusterClient() - if err != nil { - return nil, err - } - - var params *clusterC.V1SpectroClustersListParams - switch clusterContext { - case "project": - params = clusterC.NewV1SpectroClustersListParamsWithContext(h.Ctx) - case "tenant": - params = clusterC.NewV1SpectroClustersListParams() - } - var limit int64 = 0 - params.Limit = &limit - resp, err := client.V1SpectroClustersList(params) - - var e *transport.TransportError - if errors.As(err, &e) && e.HttpCode == 404 { - return nil, nil - } else if err != nil { - return nil, err - } - - return resp.Payload.Items, nil -} - -func (h *V1Client) listClustersMetadata(clusterContext string) ([]*models.V1ObjectMeta, error) { - client, err := h.GetHashboardClient() - if err != nil { - return nil, err - } - - var params *hashboardC.V1SpectroClustersMetadataParams - switch clusterContext { - case "project": - params = hashboardC.NewV1SpectroClustersMetadataParams().WithContext(h.Ctx) - case "tenant": - params = hashboardC.NewV1SpectroClustersMetadataParams() - } - resp, err := client.V1SpectroClustersMetadata(params) - - var e *transport.TransportError - if errors.As(err, &e) && e.HttpCode == 404 { - return nil, nil - } else if err != nil { - return nil, err - } - - return resp.Payload.Items, nil -} - -// ListClusters This API is Deprecated in 3.1 in hubble, so basically it will return only 50 cluster by default. -func (h *V1Client) ListClusters(clusterContext string) ([]*models.V1SpectroCluster, error) { - allClusters, err := h.listClusters(clusterContext) - if err != nil { - return nil, err - } - clusters := make([]*models.V1SpectroCluster, 0) - for _, c := range allClusters { - if c.Status.State != "Deleted" { - clusters = append(clusters, c) - } - } - return clusters, nil -} - func (h *V1Client) GetClusterWithoutStatus(scope, uid string) (*models.V1SpectroCluster, error) { if h.GetClusterWithoutStatusFn != nil { return h.GetClusterWithoutStatusFn(uid) @@ -201,22 +134,6 @@ func (h *V1Client) GetClusterWithoutStatus(scope, uid string) (*models.V1Spectro return cluster, nil } -func (h *V1Client) GetClusterByName(name, clusterContext string) (*models.V1SpectroCluster, error) { - clustersMetadataList, err := h.listClustersMetadata(clusterContext) - if err != nil { - return nil, err - } - - for _, clusterMetadata := range clustersMetadataList { - if clusterMetadata.Name == name { - cluster, err := h.GetCluster(clusterContext, clusterMetadata.UID) - return cluster, err - } - } - - return nil, nil -} - func (h *V1Client) GetClusterKubeConfig(uid, ClusterContext string) (string, error) { if h.GetClusterKubeConfigFn != nil { return h.GetClusterKubeConfigFn(uid) diff --git a/client/search.go b/client/search.go new file mode 100644 index 00000000..e82c6b52 --- /dev/null +++ b/client/search.go @@ -0,0 +1,78 @@ +package client + +import ( + "fmt" + + "github.com/spectrocloud/hapi/models" +) + +func and() *models.V1SearchFilterConjunctionOperator { + and := models.V1SearchFilterConjunctionOperatorAnd + return &and +} + +func or() *models.V1SearchFilterConjunctionOperator { + or := models.V1SearchFilterConjunctionOperatorOr + return &or +} + +func getClusterFilter(extraFilters []*models.V1SearchFilterItem) *models.V1SearchFilterSpec { + filter := &models.V1SearchFilterSpec{ + Conjunction: and(), + FilterGroups: []*models.V1SearchFilterGroup{ + { + Conjunction: and(), + Filters: []*models.V1SearchFilterItem{ + { + Condition: &models.V1SearchFilterCondition{ + Bool: &models.V1SearchFilterBoolCondition{ + Value: false, + }, + }, + Property: "isDeleted", + Type: models.V1SearchFilterPropertyTypeBool, + }, + }, + }, + }, + } + + filter.FilterGroups[0].Filters = append(filter.FilterGroups[0].Filters, extraFilters...) + + return filter +} + +func nameFilter(name string) *models.V1SearchFilterItem { + return &models.V1SearchFilterItem{ + Condition: &models.V1SearchFilterCondition{ + String: &models.V1SearchFilterStringCondition{ + Match: &models.V1SearchFilterStringConditionMatch{ + Conjunction: or(), + Values: []string{name}, + }, + Operator: models.V1SearchFilterStringOperatorEq, + }, + }, + Property: "name", + Type: models.V1SearchFilterPropertyTypeString, + } +} + +func (h *V1Client) GetClusterByName(name, clusterContext string) (*models.V1SpectroCluster, error) { + filters := []*models.V1SearchFilterItem{nameFilter(name)} + clusterSummaries, err := h.SearchClusterSummaries( + clusterContext, getClusterFilter(filters), nil, + ) + if err != nil { + return nil, err + } + if len(clusterSummaries) != 1 { + return nil, fmt.Errorf("expected 1 cluster: %v in %v, got %d", name, clusterContext, len(clusterSummaries)) + } + + cluster, err := h.GetCluster(clusterContext, clusterSummaries[0].Metadata.UID) + if err != nil { + return nil, err + } + return cluster, nil +}