Files
paralus/pkg/service/namespace.go
Abin Simon df810ab45a Convert from dao interface to funcs
This was done inorder to support transactions which will be done in
the next PR. This is the first step towards that.
2022-03-16 17:10:32 +05:30

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
}