Dragonfly2
176 строк · 5.0 Кб
1/*
2* Copyright 2020 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package service
18
19import (
20"context"
21"errors"
22
23"d7y.io/dragonfly/v2/manager/models"
24"d7y.io/dragonfly/v2/manager/types"
25"d7y.io/dragonfly/v2/pkg/structure"
26)
27
28func (s *service) CreateSchedulerCluster(ctx context.Context, json types.CreateSchedulerClusterRequest) (*models.SchedulerCluster, error) {
29config, err := structure.StructToMap(json.Config)
30if err != nil {
31return nil, err
32}
33
34clientConfig, err := structure.StructToMap(json.ClientConfig)
35if err != nil {
36return nil, err
37}
38
39scopes, err := structure.StructToMap(json.Scopes)
40if err != nil {
41return nil, err
42}
43
44schedulerCluster := models.SchedulerCluster{
45Name: json.Name,
46BIO: json.BIO,
47Config: config,
48ClientConfig: clientConfig,
49Scopes: scopes,
50IsDefault: json.IsDefault,
51}
52
53if err := s.db.WithContext(ctx).Create(&schedulerCluster).Error; err != nil {
54return nil, err
55}
56
57if json.SeedPeerClusterID > 0 {
58if err := s.AddSchedulerClusterToSeedPeerCluster(ctx, json.SeedPeerClusterID, schedulerCluster.ID); err != nil {
59return nil, err
60}
61}
62
63return &schedulerCluster, nil
64}
65
66func (s *service) DestroySchedulerCluster(ctx context.Context, id uint) error {
67schedulerCluster := models.SchedulerCluster{}
68if err := s.db.WithContext(ctx).Preload("Schedulers").First(&schedulerCluster, id).Error; err != nil {
69return err
70}
71
72if len(schedulerCluster.Schedulers) != 0 {
73return errors.New("scheduler cluster exists scheduler")
74}
75
76if err := s.db.WithContext(ctx).Unscoped().Delete(&models.SchedulerCluster{}, id).Error; err != nil {
77return err
78}
79
80return nil
81}
82
83func (s *service) UpdateSchedulerCluster(ctx context.Context, id uint, json types.UpdateSchedulerClusterRequest) (*models.SchedulerCluster, error) {
84var (
85config map[string]any
86err error
87)
88if json.Config != nil {
89config, err = structure.StructToMap(json.Config)
90if err != nil {
91return nil, err
92}
93}
94
95var clientConfig map[string]any
96if json.ClientConfig != nil {
97clientConfig, err = structure.StructToMap(json.ClientConfig)
98if err != nil {
99return nil, err
100}
101}
102
103var scopes map[string]any
104if json.Scopes != nil {
105scopes, err = structure.StructToMap(json.Scopes)
106if err != nil {
107return nil, err
108}
109}
110
111schedulerCluster := models.SchedulerCluster{}
112if err := s.db.WithContext(ctx).First(&schedulerCluster, id).Updates(models.SchedulerCluster{
113Name: json.Name,
114BIO: json.BIO,
115Config: config,
116ClientConfig: clientConfig,
117Scopes: scopes,
118}).Error; err != nil {
119return nil, err
120}
121
122// Updates does not accept bool as false.
123// Refer to https://stackoverflow.com/questions/56653423/gorm-doesnt-update-boolean-field-to-false.
124if json.IsDefault != schedulerCluster.IsDefault {
125if err := s.db.WithContext(ctx).First(&schedulerCluster, id).Update("is_default", json.IsDefault).Error; err != nil {
126return nil, err
127}
128}
129
130if json.SeedPeerClusterID > 0 {
131if err := s.AddSchedulerClusterToSeedPeerCluster(ctx, json.SeedPeerClusterID, schedulerCluster.ID); err != nil {
132return nil, err
133}
134}
135
136return &schedulerCluster, nil
137}
138
139func (s *service) GetSchedulerCluster(ctx context.Context, id uint) (*models.SchedulerCluster, error) {
140schedulerCluster := models.SchedulerCluster{}
141if err := s.db.WithContext(ctx).Preload("SeedPeerClusters").First(&schedulerCluster, id).Error; err != nil {
142return nil, err
143}
144
145return &schedulerCluster, nil
146}
147
148func (s *service) GetSchedulerClusters(ctx context.Context, q types.GetSchedulerClustersQuery) ([]models.SchedulerCluster, int64, error) {
149var count int64
150var schedulerClusters []models.SchedulerCluster
151if err := s.db.WithContext(ctx).Scopes(models.Paginate(q.Page, q.PerPage)).Where(&models.SchedulerCluster{
152Name: q.Name,
153}).Preload("SeedPeerClusters").Find(&schedulerClusters).Limit(-1).Offset(-1).Count(&count).Error; err != nil {
154return nil, 0, err
155}
156
157return schedulerClusters, count, nil
158}
159
160func (s *service) AddSchedulerToSchedulerCluster(ctx context.Context, id, schedulerID uint) error {
161schedulerCluster := models.SchedulerCluster{}
162if err := s.db.WithContext(ctx).First(&schedulerCluster, id).Error; err != nil {
163return err
164}
165
166scheduler := models.Scheduler{}
167if err := s.db.WithContext(ctx).First(&scheduler, schedulerID).Error; err != nil {
168return err
169}
170
171if err := s.db.WithContext(ctx).Model(&schedulerCluster).Association("Schedulers").Append(&scheduler); err != nil {
172return err
173}
174
175return nil
176}
177