"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateSLO = void 0; var _sloSchema = require("@kbn/slo-schema"); var _constants = require("../../assets/constants"); var _services = require("../../domain/services"); var _create_temp_summary = require("./summary_transform/helpers/create_temp_summary"); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ class UpdateSLO { constructor(repository, transformManager, esClient) { this.repository = repository; this.transformManager = transformManager; this.esClient = esClient; } async execute(sloId, params) { const originalSlo = await this.repository.findById(sloId); const updatedSlo = Object.assign({}, originalSlo, params, { updatedAt: new Date(), revision: originalSlo.revision + 1, groupBy: !!params.groupBy ? params.groupBy : originalSlo.groupBy }); (0, _services.validateSLO)(updatedSlo); const updatedSloTransformId = (0, _constants.getSLOTransformId)(updatedSlo.id, updatedSlo.revision); await this.repository.save(updatedSlo); try { await this.transformManager.install(updatedSlo); } catch (err) { await this.repository.save(originalSlo); throw err; } try { await this.transformManager.preview(updatedSloTransformId); await this.transformManager.start(updatedSloTransformId); } catch (err) { await Promise.all([this.transformManager.uninstall(updatedSloTransformId), this.repository.save(originalSlo)]); throw err; } await this.esClient.index({ index: _constants.SLO_SUMMARY_TEMP_INDEX_NAME, id: `slo-${updatedSlo.id}`, document: (0, _create_temp_summary.createTempSummaryDocument)(updatedSlo) }); await this.deleteOriginalSLO(originalSlo); return this.toResponse(updatedSlo); } async deleteOriginalSLO(originalSlo) { try { const originalSloTransformId = (0, _constants.getSLOTransformId)(originalSlo.id, originalSlo.revision); await this.transformManager.stop(originalSloTransformId); await this.transformManager.uninstall(originalSloTransformId); } catch (err) { // Any errors here should not prevent moving forward. // Worst case we keep rolling up data for the previous revision number. } await this.deleteRollupData(originalSlo.id, originalSlo.revision); await this.deleteSummaryData(originalSlo.id, originalSlo.revision); } async deleteRollupData(sloId, sloRevision) { await this.esClient.deleteByQuery({ index: _constants.SLO_DESTINATION_INDEX_PATTERN, wait_for_completion: false, query: { bool: { filter: [{ term: { 'slo.id': sloId } }, { term: { 'slo.revision': sloRevision } }] } } }); } async deleteSummaryData(sloId, sloRevision) { await this.esClient.deleteByQuery({ index: _constants.SLO_SUMMARY_DESTINATION_INDEX_PATTERN, wait_for_completion: false, query: { bool: { filter: [{ term: { 'slo.id': sloId } }, { term: { 'slo.revision': sloRevision } }] } } }); } toResponse(slo) { return _sloSchema.updateSLOResponseSchema.encode(slo); } } exports.UpdateSLO = UpdateSLO;