mirror of
https://github.com/paralus/paralus.git
synced 2026-05-08 17:36:56 +00:00
This was done inorder to support transactions which will be done in the next PR. This is the first step towards that.
199 lines
5.3 KiB
Go
199 lines
5.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strconv"
|
|
|
|
"github.com/RafaySystems/rcloud-base/internal/cluster/dao"
|
|
"github.com/RafaySystems/rcloud-base/internal/models"
|
|
"github.com/RafaySystems/rcloud-base/pkg/converter"
|
|
"github.com/RafaySystems/rcloud-base/pkg/patch"
|
|
commonv3 "github.com/RafaySystems/rcloud-base/proto/types/commonpb/v3"
|
|
"github.com/RafaySystems/rcloud-base/proto/types/controller"
|
|
infrav3 "github.com/RafaySystems/rcloud-base/proto/types/infrapb/v3"
|
|
"github.com/RafaySystems/rcloud-base/proto/types/scheduler"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
func (s *clusterService) GetNamespacesForConditions(ctx context.Context, conditions []scheduler.ClusterNamespaceCondition, clusterID string) (*scheduler.ClusterNamespaceList, error) {
|
|
|
|
cns, count, err := dao.GetNamespacesForConditions(ctx, s.db, uuid.MustParse(clusterID), conditions)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cnl := scheduler.ClusterNamespaceList{}
|
|
cnl.Metadata.Count = int64(count)
|
|
|
|
var items []*scheduler.ClusterNamespace
|
|
for _, cn := range cns {
|
|
ns := &scheduler.NamespaceTemplate{}
|
|
if err = json.Unmarshal(cn.Namespace, ns); err != nil {
|
|
return nil, nil
|
|
}
|
|
cnd := make([]*scheduler.ClusterNamespaceCondition, 0, 10)
|
|
if err = json.Unmarshal(cn.Conditions, &cnd); err != nil {
|
|
return nil, nil
|
|
}
|
|
st := &controller.NamespaceStatus{}
|
|
if err = json.Unmarshal(cn.Status, st); err != nil {
|
|
return nil, nil
|
|
}
|
|
nstype, err := strconv.Atoi(cn.Type)
|
|
if err != nil {
|
|
return nil, nil
|
|
}
|
|
items = append(items, &scheduler.ClusterNamespace{
|
|
Metadata: &commonv3.Metadata{
|
|
Name: cn.Name,
|
|
},
|
|
Spec: &scheduler.ClusterNamespaceSpec{
|
|
Type: scheduler.ClusterNamespaceType(nstype),
|
|
ClusterID: cn.ClusterId.String(),
|
|
Namespace: ns,
|
|
},
|
|
Status: &scheduler.ClusterNamespaceStatus{
|
|
Conditions: cnd,
|
|
Status: st,
|
|
},
|
|
})
|
|
}
|
|
cnl.Items = items
|
|
|
|
return &cnl, nil
|
|
}
|
|
|
|
func (s *clusterService) GetNamespaces(ctx context.Context, clusterID string) (*scheduler.ClusterNamespaceList, error) {
|
|
|
|
cns, err := dao.GetNamespaces(ctx, s.db, uuid.MustParse(clusterID))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cnl := scheduler.ClusterNamespaceList{}
|
|
|
|
var items []*scheduler.ClusterNamespace
|
|
for _, cn := range cns {
|
|
ns := &scheduler.NamespaceTemplate{}
|
|
if err = json.Unmarshal(cn.Namespace, ns); err != nil {
|
|
return nil, nil
|
|
}
|
|
cnd := make([]*scheduler.ClusterNamespaceCondition, 0, 10)
|
|
if err = json.Unmarshal(cn.Conditions, &cnd); err != nil {
|
|
return nil, nil
|
|
}
|
|
st := &controller.NamespaceStatus{}
|
|
if err = json.Unmarshal(cn.Status, st); err != nil {
|
|
return nil, nil
|
|
}
|
|
nstype, err := strconv.Atoi(cn.Type)
|
|
if err != nil {
|
|
return nil, nil
|
|
}
|
|
items = append(items, &scheduler.ClusterNamespace{
|
|
Metadata: &commonv3.Metadata{
|
|
Name: cn.Name,
|
|
},
|
|
Spec: &scheduler.ClusterNamespaceSpec{
|
|
Type: scheduler.ClusterNamespaceType(nstype),
|
|
ClusterID: cn.ClusterId.String(),
|
|
Namespace: ns,
|
|
},
|
|
Status: &scheduler.ClusterNamespaceStatus{
|
|
Conditions: cnd,
|
|
Status: st,
|
|
},
|
|
})
|
|
}
|
|
cnl.Items = items
|
|
cnl.Metadata.Count = int64(len(items))
|
|
|
|
return &cnl, nil
|
|
}
|
|
|
|
func (s *clusterService) GetNamespace(ctx context.Context, namespace string, clusterID string) (*scheduler.ClusterNamespace, error) {
|
|
|
|
cn, err := dao.GetNamespace(ctx, s.db, uuid.MustParse(clusterID), namespace)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ns := &scheduler.NamespaceTemplate{}
|
|
if err = json.Unmarshal(cn.Namespace, ns); err != nil {
|
|
return nil, nil
|
|
}
|
|
cnd := make([]*scheduler.ClusterNamespaceCondition, 0, 10)
|
|
if err = json.Unmarshal(cn.Conditions, &cnd); err != nil {
|
|
return nil, nil
|
|
}
|
|
st := &controller.NamespaceStatus{}
|
|
if err = json.Unmarshal(cn.Status, st); err != nil {
|
|
return nil, nil
|
|
}
|
|
nstype, err := strconv.Atoi(cn.Type)
|
|
if err != nil {
|
|
return nil, nil
|
|
}
|
|
cns := &scheduler.ClusterNamespace{
|
|
Metadata: &commonv3.Metadata{
|
|
Name: cn.Name,
|
|
},
|
|
Spec: &scheduler.ClusterNamespaceSpec{
|
|
Type: scheduler.ClusterNamespaceType(nstype),
|
|
ClusterID: cn.ClusterId.String(),
|
|
Namespace: ns,
|
|
},
|
|
Status: &scheduler.ClusterNamespaceStatus{
|
|
Conditions: cnd,
|
|
Status: st,
|
|
},
|
|
}
|
|
|
|
return cns, nil
|
|
}
|
|
|
|
func (s *clusterService) UpdateNamespaceStatus(ctx context.Context, current *scheduler.ClusterNamespace) error {
|
|
|
|
existing, err := s.GetNamespace(ctx, current.Metadata.Name, current.Spec.ClusterID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = patch.NamespaceStatus(existing.Status, current.Status)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cn := models.ClusterNamespace{
|
|
ClusterId: uuid.MustParse(existing.Spec.ClusterID),
|
|
Name: existing.Metadata.Name,
|
|
Type: existing.Spec.Type.String(),
|
|
Namespace: converter.ConvertToJsonRawMessage(existing.Spec.Namespace),
|
|
Conditions: converter.ConvertToJsonRawMessage(existing.Status.Conditions),
|
|
Status: converter.ConvertToJsonRawMessage(existing.Status),
|
|
}
|
|
|
|
err = dao.UpdateNamespaceStatus(ctx, s.db, &cn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
//TODO: as part of gitops
|
|
/*ev := event.Resource{
|
|
EventType: event.ResourceUpdateStatus,
|
|
ID: namespace.ClusterID,
|
|
}
|
|
|
|
for _, h := range s.workloadHandlers {
|
|
h.OnChange(ev)
|
|
}*/
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *clusterService) GetNamespaceHashes(ctx context.Context, clusterID string) ([]infrav3.NameHash, error) {
|
|
nameHashes, err := dao.GetNamespaceHashes(ctx, s.db, uuid.MustParse(clusterID))
|
|
return nameHashes, err
|
|
}
|