Files
paralus/internal/cluster/dao/namespaces.go
nirav-rafay c66bdc25cd restructure rcloud-base as a single base controller (#37)
* restructure rcloud-base as a single base controller
* updated master.rest
* moved sentry from internal to pkg as it is used by relay
* removing unused rpc and it's dependencies
* Fix usermgmt tests
* Don't redefine variables in rest file
Co-authored-by: Abin Simon <abin.simon@rafay.co>
2022-03-03 17:59:06 +05:30

120 lines
3.8 KiB
Go

package dao
import (
"context"
"time"
"github.com/RafaySystems/rcloud-base/internal/models"
"github.com/RafaySystems/rcloud-base/internal/persistence/provider/pg"
commonv3 "github.com/RafaySystems/rcloud-base/proto/types/commonpb/v3"
infrav3 "github.com/RafaySystems/rcloud-base/proto/types/infrapb/v3"
"github.com/RafaySystems/rcloud-base/proto/types/scheduler"
"github.com/google/uuid"
"github.com/uptrace/bun"
)
// ClusterNamespacesDao is the interface for cluster namespaces operations
type ClusterNamespacesDao interface {
// Get Namespace
GetNamespace(ctx context.Context, clusterID uuid.UUID, name string) (models.ClusterNamespace, error)
// GetNamespaces
GetNamespaces(ctx context.Context, clusterID uuid.UUID) ([]models.ClusterNamespace, error)
// GetNamespacesForConditions
GetNamespacesForConditions(ctx context.Context, clusterID uuid.UUID, conditions []scheduler.ClusterNamespaceCondition) ([]models.ClusterNamespace, int, error)
// UpdateNamespaceStatus
UpdateNamespaceStatus(ctx context.Context, updated *models.ClusterNamespace) error
// GetNamespaceHashes
GetNamespaceHashes(ctx context.Context, clusterID uuid.UUID) ([]infrav3.NameHash, error)
}
// clusterNamespacesDao implements ClusterNamespacesDao
type clusterNamespacesDao struct {
dao pg.EntityDAO
}
// ClusterNamespacesDao return new cluster namespaces dao
func NewClusterNamespacesDao(dao pg.EntityDAO) ClusterNamespacesDao {
return &clusterNamespacesDao{
dao: dao,
}
}
func (s clusterNamespacesDao) GetNamespace(ctx context.Context, clusterID uuid.UUID, name string) (models.ClusterNamespace, error) {
var cn models.ClusterNamespace
err := s.dao.GetInstance().NewSelect().Model(&cn).
Where("cluster_id = ?", clusterID).
Where("name = ?", name).
Scan(ctx)
if err != nil {
return cn, err
}
return cn, nil
}
func (s clusterNamespacesDao) GetNamespaces(ctx context.Context, clusterID uuid.UUID) ([]models.ClusterNamespace, error) {
var cns []models.ClusterNamespace
_, err := s.dao.GetX(ctx, "cluster_id", clusterID, &cns)
return cns, err
}
func (s clusterNamespacesDao) GetNamespacesForConditions(ctx context.Context, clusterID uuid.UUID, conditions []scheduler.ClusterNamespaceCondition) ([]models.ClusterNamespace, int, error) {
var cns []models.ClusterNamespace
q := s.dao.GetInstance().NewSelect().Model(&cns).Where("cluster_id = ?", clusterID)
for _, condition := range conditions {
q.WhereGroup("", func(sq *bun.SelectQuery) *bun.SelectQuery {
sq = sq.Where(conditionStatusQ, int(condition.Type), map[string]string{
"status": condition.Status.String(),
})
since := time.Now().Add(-time.Minute)
if !condition.LastUpdated.IsValid() {
since = condition.LastUpdated.AsTime().Add(-time.Minute)
}
sq = sq.Where(conditionLastUpdatedQ, int(condition.Type), since)
return sq
})
}
count, err := q.ScanAndCount(ctx)
return cns, count, err
}
func (s clusterNamespacesDao) UpdateNamespaceStatus(ctx context.Context, updated *models.ClusterNamespace) error {
_, err := s.dao.GetInstance().NewUpdate().Model(updated).
Set("conditions = ?", updated.Conditions).
Set("status = ?", updated.Status).
Where("cluster_id = ?", updated.ClusterId).
Where("name = ?", updated.Name).
Exec(ctx, updated)
return err
}
func (s clusterNamespacesDao) GetNamespaceHashes(ctx context.Context, clusterID uuid.UUID) ([]infrav3.NameHash, error) {
var nameHashes []infrav3.NameHash
err := s.dao.GetInstance().NewSelect().
Model((*models.ClusterNamespace)(nil)).
Column("name", "hash").
//TODO: to be changed to ClusterTaskDeleted later once task is supported
ColumnExpr(deletingExpr, 3, map[string]string{"status": commonv3.RafayConditionStatus_NotSet.String()}).
Where("cluster_id = ?", clusterID).
Scan(ctx, &nameHashes)
if err != nil {
return nil, err
}
return nameHashes, nil
}