package service import ( "context" "fmt" "git.benadis.ru/gitops/benadis-rac/internal/config" "git.benadis.ru/gitops/benadis-rac/internal/constants" "git.benadis.ru/gitops/benadis-rac/internal/logger" "git.benadis.ru/gitops/benadis-rac/internal/rac" ) // ServiceModeService сервис для управления сервисным режимом type ServiceModeService struct { racClient *rac.Client config *config.AppConfig logger logger.Logger } // NewServiceModeService создает новый сервис func NewServiceModeService(cfg *config.AppConfig, log logger.Logger) *ServiceModeService { racClient := rac.NewClient(cfg, log) return &ServiceModeService{ racClient: racClient, config: cfg, logger: log, } } // EnableServiceMode включает сервисный режим func (s *ServiceModeService) EnableServiceMode(ctx context.Context) error { s.logger.Info("Starting service mode enablement") // Получаем UUID кластера clusterUUID, err := s.racClient.GetClusterUUID(ctx) if err != nil { return fmt.Errorf(constants.ErrGetClusterUUID, err) } // Получаем UUID информационной базы infobaseUUID, err := s.racClient.GetInfobaseUUID(ctx, clusterUUID) if err != nil { return fmt.Errorf(constants.ErrGetInfobaseUUID, err) } // Подготавливаем параметры params := rac.ServiceModeParams{ ClusterUUID: clusterUUID, InfobaseUUID: infobaseUUID, Enable: true, DeniedMessage: constants.DefaultDeniedMessage, PermissionCode: constants.DefaultPermissionCode, } // Включаем сервисный режим if err := s.racClient.EnableServiceMode(ctx, params); err != nil { return fmt.Errorf(constants.ErrEnableServiceMode, err) } s.logger.Info(constants.LogMsgServiceModeEnabled) return nil } // DisableServiceMode выключает сервисный режим func (s *ServiceModeService) DisableServiceMode(ctx context.Context) error { s.logger.Info("Starting service mode disablement") // Получаем UUID кластера clusterUUID, err := s.racClient.GetClusterUUID(ctx) if err != nil { return fmt.Errorf(constants.ErrGetClusterUUID, err) } // Получаем UUID информационной базы infobaseUUID, err := s.racClient.GetInfobaseUUID(ctx, clusterUUID) if err != nil { return fmt.Errorf(constants.ErrGetInfobaseUUID, err) } // Подготавливаем параметры params := rac.ServiceModeParams{ ClusterUUID: clusterUUID, InfobaseUUID: infobaseUUID, Enable: false, } // Выключаем сервисный режим if err := s.racClient.DisableServiceMode(ctx, params); err != nil { return fmt.Errorf(constants.ErrDisableServiceMode, err) } s.logger.Info(constants.LogMsgServiceModeDisabled) return nil } // GetServiceModeStatus получает текущий статус сервисного режима func (s *ServiceModeService) GetServiceModeStatus(ctx context.Context) (bool, error) { s.logger.Info("Getting service mode status") // Получаем UUID кластера clusterUUID, err := s.racClient.GetClusterUUID(ctx) if err != nil { return false, fmt.Errorf(constants.ErrGetClusterUUID, err) } // Получаем UUID информационной базы infobaseUUID, err := s.racClient.GetInfobaseUUID(ctx, clusterUUID) if err != nil { return false, fmt.Errorf(constants.ErrGetInfobaseUUID, err) } // Проверяем статус (используем VerifyServiceMode для проверки включенного состояния) err = s.racClient.VerifyServiceMode(ctx, clusterUUID, infobaseUUID, true) if err != nil { // Если проверка на включенное состояние не прошла, проверяем выключенное err = s.racClient.VerifyServiceMode(ctx, clusterUUID, infobaseUUID, false) if err != nil { return false, fmt.Errorf(constants.ErrDetermineServiceModeStatus, err) } return false, nil // Сервисный режим выключен } return true, nil // Сервисный режим включен }