From 294696d43eecbc891bcee49d977fa276b9303f0b Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 20 Jan 2025 21:13:26 -0500 Subject: [PATCH 01/14] Allow counters to be created with same name, provider and source as deleted one --- .../src/main/resources/META-INF/db/schema-41910to41920.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql index 2ce8ea99bd1e..32ec243fbfed 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql @@ -21,3 +21,6 @@ -- Add last_id to the volumes table CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'last_id', 'bigint(20) unsigned DEFAULT NULL'); + +ALTER TABLE `cloud`.`counter` DROP KEY `uc_counter__provider__source__value`; +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value_removed', '(provider, source, value, removed)'); From fdb9a717b99e59b93f6d343daf85d3b653e4a25e Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 20 Jan 2025 23:19:06 -0500 Subject: [PATCH 02/14] fix api response --- .../main/java/com/cloud/network/as/AutoScaleService.java | 2 ++ .../api/command/admin/autoscale/CreateCounterCmd.java | 9 ++++++--- .../java/com/cloud/network/as/AutoScaleManagerImpl.java | 6 ++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/cloud/network/as/AutoScaleService.java b/api/src/main/java/com/cloud/network/as/AutoScaleService.java index ceca4de68428..4aef10f8de9e 100644 --- a/api/src/main/java/com/cloud/network/as/AutoScaleService.java +++ b/api/src/main/java/com/cloud/network/as/AutoScaleService.java @@ -70,6 +70,8 @@ public interface AutoScaleService { Counter createCounter(CreateCounterCmd cmd); + Counter getCounter(long counterId); + boolean deleteCounter(long counterId) throws ResourceInUseException; List listCounters(ListCountersCmd cmd); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java index 617d1104eda5..9f857f5d76a2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.admin.autoscale; +import org.apache.cloudstack.context.CallContext; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -91,9 +92,6 @@ public void create() { if (ctr != null) { this.setEntityId(ctr.getId()); this.setEntityUuid(ctr.getUuid()); - CounterResponse response = _responseGenerator.createCounterResponse(ctr); - response.setResponseName(getCommandName()); - this.setResponseObject(response); } else { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Counter with name " + getName()); } @@ -101,6 +99,11 @@ public void create() { @Override public void execute() { + CallContext.current().setEventDetails("Guest OS Id: " + getEntityId()); + Counter ctr = _autoScaleService.getCounter(getEntityId()); + CounterResponse response = _responseGenerator.createCounterResponse(ctr); + response.setResponseName(getCommandName()); + this.setResponseObject(response); } @Override diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 5bbd85c2415d..8df1300fb91e 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1474,6 +1474,12 @@ public Counter createCounter(CreateCounterCmd cmd) { return counter; } + @Override + @ActionEvent(eventType = EventTypes.EVENT_COUNTER_CREATE, eventDescription = "Creating a counter", async = true) + public Counter getCounter(long counterId) { + return counterDao.findById(counterId); + } + @Override @ActionEvent(eventType = EventTypes.EVENT_CONDITION_CREATE, eventDescription = "Condition", create = true) public Condition createCondition(CreateConditionCmd cmd) { From 7a1e54d315411f2f98ffcb33a6b5a04711c11f98 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 22 Jan 2025 09:33:43 -0500 Subject: [PATCH 03/14] drop unique key only if it exists --- .../META-INF/db/schema-41910to41920.sql | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql index 32ec243fbfed..2e6c6ab4db2b 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql @@ -22,5 +22,20 @@ -- Add last_id to the volumes table CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'last_id', 'bigint(20) unsigned DEFAULT NULL'); -ALTER TABLE `cloud`.`counter` DROP KEY `uc_counter__provider__source__value`; -CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value_removed', '(provider, source, value, removed)'); +SELECT + COUNT(*) +INTO @exists +FROM information_schema.STATISTICS +WHERE TABLE_SCHEMA = 'cloud' + AND TABLE_NAME = 'counter' + AND INDEX_NAME = 'uc_counter__provider__source__value'; + +-- Drop the key if it exists +SET @sql = IF(@exists > 0, 'ALTER TABLE counter DROP KEY uc_counter__provider__source__value', NULL); + +-- Execute the drop statement if the index exists +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); From 2ace4ddc3ef98391052ac2f5a245c10da8c5812b Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 22 Jan 2025 13:23:49 -0500 Subject: [PATCH 04/14] create a procedure --- .../cloud.idempotent_drop_unique_key.sql | 26 +++++++++++++++++++ .../META-INF/db/schema-41910to41920.sql | 17 +----------- 2 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 engine/schema/src/main/resources/META-INF/db/procedures/cloud.idempotent_drop_unique_key.sql diff --git a/engine/schema/src/main/resources/META-INF/db/procedures/cloud.idempotent_drop_unique_key.sql b/engine/schema/src/main/resources/META-INF/db/procedures/cloud.idempotent_drop_unique_key.sql new file mode 100644 index 000000000000..fdcca6fb4089 --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/procedures/cloud.idempotent_drop_unique_key.sql @@ -0,0 +1,26 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +-- in cloud +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY` ( + IN in_table_name VARCHAR(200), + IN in_index_name VARCHAR(200) +) +BEGIN + DECLARE CONTINUE HANDLER FOR 1091, 1025 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name, ' DROP KEY ', in_index_name); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql index 2e6c6ab4db2b..5a391520b3b3 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql @@ -22,20 +22,5 @@ -- Add last_id to the volumes table CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'last_id', 'bigint(20) unsigned DEFAULT NULL'); -SELECT - COUNT(*) -INTO @exists -FROM information_schema.STATISTICS -WHERE TABLE_SCHEMA = 'cloud' - AND TABLE_NAME = 'counter' - AND INDEX_NAME = 'uc_counter__provider__source__value'; - --- Drop the key if it exists -SET @sql = IF(@exists > 0, 'ALTER TABLE counter DROP KEY uc_counter__provider__source__value', NULL); - --- Execute the drop statement if the index exists -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - +CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); From 6b5ece35b574ba43066aa7f07c30ff28f045a902 Mon Sep 17 00:00:00 2001 From: dahn Date: Thu, 30 Jan 2025 18:40:44 +0100 Subject: [PATCH 05/14] Update engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql --- .../src/main/resources/META-INF/db/schema-41910to41920.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql index ad8b31329b0b..39b9c301340c 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql @@ -45,4 +45,4 @@ CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Read-Only Admin - Default', 'va -- Grant access to 2FA APIs for the "Support Admin - Default" role CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Support Admin - Default', 'setupUserTwoFactorAuthentication', 'ALLOW'); -CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Support Admin - Default', 'validateUserTwoFactorAuthenticationCode', 'ALLOW'); \ No newline at end of file +CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Support Admin - Default', 'validateUserTwoFactorAuthenticationCode', 'ALLOW'); From 1ee387dab69977ca7dd363d650ee883ebf959762 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 25 Feb 2025 13:08:45 -0500 Subject: [PATCH 06/14] move query to 4.20.1 schema file --- .../src/main/resources/META-INF/db/schema-41910to41920.sql | 3 --- .../src/main/resources/META-INF/db/schema-42000to42010.sql | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql index 39b9c301340c..12ead739d848 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to41920.sql @@ -22,9 +22,6 @@ -- Add last_id to the volumes table CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'last_id', 'bigint(20) unsigned DEFAULT NULL'); -CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); -CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); - -- Grant access to 2FA APIs for the "Read-Only User - Default" role CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Read-Only User - Default', 'setupUserTwoFactorAuthentication', 'ALLOW'); diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42000to42010.sql b/engine/schema/src/main/resources/META-INF/db/schema-42000to42010.sql index bf13e5eee1ac..4d1cf4967f8c 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42000to42010.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42000to42010.sql @@ -47,3 +47,6 @@ CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.storage_pool', 'used_iops', 'bigint -- Add reason column for op_ha_work CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.op_ha_work', 'reason', 'varchar(32) DEFAULT NULL COMMENT "Reason for the HA work"'); + +CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); From 11f12179ba19a875ce39a1d22f05d0b8e8c4efbc Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 25 Feb 2025 15:59:53 -0500 Subject: [PATCH 07/14] prevent addition of counters with same name, provider and source as a non-deleted counter --- .../com/cloud/network/as/dao/CounterDao.java | 1 + .../com/cloud/network/as/dao/CounterDaoImpl.java | 16 ++++++++++++++++ .../cloud/network/as/AutoScaleManagerImpl.java | 6 +++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java index 4c9df8e749fe..94fad6819934 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java @@ -24,6 +24,7 @@ import com.cloud.utils.db.GenericDao; public interface CounterDao extends GenericDao { + CounterVO findByNameProviderSource(String name, String source, String provider); public List listCounters(Long id, String name, String source, String provider, String keyword, Filter filter); } diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java index 2d3906b83414..3e1b9d933d37 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java @@ -32,6 +32,7 @@ @Component public class CounterDaoImpl extends GenericDaoBase implements CounterDao { final SearchBuilder AllFieldsSearch; + final SearchBuilder CounterNameSearch; protected CounterDaoImpl() { AllFieldsSearch = createSearchBuilder(); @@ -40,6 +41,21 @@ protected CounterDaoImpl() { AllFieldsSearch.and("source", AllFieldsSearch.entity().getSource(), Op.EQ); AllFieldsSearch.and("provider", AllFieldsSearch.entity().getProvider(), Op.EQ); AllFieldsSearch.done(); + + CounterNameSearch = createSearchBuilder(); + CounterNameSearch.and("name", CounterNameSearch.entity().getName(), Op.EQ); + CounterNameSearch.and("source", CounterNameSearch.entity().getSource(), Op.EQ); + CounterNameSearch.and("provider", CounterNameSearch.entity().getProvider(), Op.EQ); + CounterNameSearch.done(); + } + + @Override + public CounterVO findByNameProviderSource(String name, String source, String provider) { + SearchCriteria sc = CounterNameSearch.create(); + sc.setParameters("name", name); + sc.setParameters("source", source); + sc.setParameters("provider", provider); + return findOneBy(sc); } @Override diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 4bfa767fbe90..9d4e3bcbfdcf 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1452,7 +1452,7 @@ public AutoScaleVmGroup disableAutoScaleVmGroup(Long id) { @DB public Counter createCounter(CreateCounterCmd cmd) { String source = cmd.getSource().toUpperCase(); - String name = cmd.getName(); + String name = cmd.getName(); Counter.Source src; // Validate Source try { @@ -1469,6 +1469,10 @@ public Counter createCounter(CreateCounterCmd cmd) { CounterVO counter = null; + CounterVO existingCounter = counterDao.findByNameProviderSource(name, source, provider.getName()); + if (existingCounter != null) { + throw new InvalidParameterValueException("Counter with name " + name + " already exists"); + } logger.debug("Adding Counter " + name); counter = counterDao.persist(new CounterVO(src, name, cmd.getValue(), provider)); From cb0f178914b69c3d8e8540c6ef9ca2f2b275a22c Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 14 Jul 2025 10:11:02 -0400 Subject: [PATCH 08/14] prevent counters with same value for the same provider --- .../src/main/java/com/cloud/network/as/dao/CounterDao.java | 2 +- .../main/java/com/cloud/network/as/dao/CounterDaoImpl.java | 4 ++-- .../java/com/cloud/network/as/AutoScaleManagerImpl.java | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java index 94fad6819934..372dc930b683 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDao.java @@ -24,7 +24,7 @@ import com.cloud.utils.db.GenericDao; public interface CounterDao extends GenericDao { - CounterVO findByNameProviderSource(String name, String source, String provider); + CounterVO findByNameProviderValue(String name, String value, String provider); public List listCounters(Long id, String name, String source, String provider, String keyword, Filter filter); } diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java index 3e1b9d933d37..50b6f7c0bc0c 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java @@ -50,10 +50,10 @@ protected CounterDaoImpl() { } @Override - public CounterVO findByNameProviderSource(String name, String source, String provider) { + public CounterVO findByNameProviderValue(String name, String value, String provider) { SearchCriteria sc = CounterNameSearch.create(); sc.setParameters("name", name); - sc.setParameters("source", source); + sc.setParameters("value", value); sc.setParameters("provider", provider); return findOneBy(sc); } diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 9d4e3bcbfdcf..bb16527a6341 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1452,7 +1452,8 @@ public AutoScaleVmGroup disableAutoScaleVmGroup(Long id) { @DB public Counter createCounter(CreateCounterCmd cmd) { String source = cmd.getSource().toUpperCase(); - String name = cmd.getName(); + String name = cmd.getName(); + String value = cmd.getValue(); Counter.Source src; // Validate Source try { @@ -1469,12 +1470,12 @@ public Counter createCounter(CreateCounterCmd cmd) { CounterVO counter = null; - CounterVO existingCounter = counterDao.findByNameProviderSource(name, source, provider.getName()); + CounterVO existingCounter = counterDao.findByNameProviderValue(name, value, provider.getName()); if (existingCounter != null) { throw new InvalidParameterValueException("Counter with name " + name + " already exists"); } logger.debug("Adding Counter " + name); - counter = counterDao.persist(new CounterVO(src, name, cmd.getValue(), provider)); + counter = counterDao.persist(new CounterVO(src, name, value, provider)); CallContext.current().setEventDetails(" Id: " + counter.getId() + " Name: " + name); return counter; From ea739eb6b3fbb9ce39e07607f77ddc6d81518dd9 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 14 Jul 2025 10:55:38 -0400 Subject: [PATCH 09/14] lint and license check failure addressed --- .../cloud/upgrade/dao/Upgrade42010to42020.java | 16 ++++++++++++++++ .../META-INF/db/schema-42010to42020-cleanup.sql | 2 +- .../META-INF/db/schema-42010to42020.sql | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java index 6f9a762169a8..2db3bd7688ca 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java @@ -1,3 +1,19 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql index d8de84760e7f..fe60ed734ff3 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql @@ -17,4 +17,4 @@ --; -- Schema cleanup from 4.20.1.0 to 4.20.2.0; ---; \ No newline at end of file +--; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql index be61e0f2698d..42e2e5e61155 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql @@ -20,4 +20,4 @@ --; CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); -CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); \ No newline at end of file +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); From a92a2ae888fbba45764ebf834e60d9175fe1fc07 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 14 Jul 2025 10:56:29 -0400 Subject: [PATCH 10/14] address comment --- .../api/command/admin/autoscale/CreateCounterCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java index 47ba2ecd3f3e..013d0f966ddf 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java @@ -97,7 +97,7 @@ public void create() { @Override public void execute() { - CallContext.current().setEventDetails("Guest OS Id: " + getEntityId()); + CallContext.current().setEventDetails("Counter ID: " + getEntityId()); Counter ctr = _autoScaleService.getCounter(getEntityId()); CounterResponse response = _responseGenerator.createCounterResponse(ctr); response.setResponseName(getCommandName()); From 1efc0a52037da25ee792d2f47b40318a63ab106f Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 15 Jul 2025 11:50:55 -0400 Subject: [PATCH 11/14] fix upgrade path --- .../src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java index c23832f8798d..a22739caee47 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -233,7 +233,7 @@ public DatabaseUpgradeChecker() { .next("4.19.0.0", new Upgrade41900to41910()) .next("4.19.1.0", new Upgrade41910to42000()) .next("4.20.0.0", new Upgrade42000to42010()) - .next("4.20.2.0", new Upgrade42010to42020()) + .next("4.20.1.0", new Upgrade42010to42020()) .build(); } From 25211728e4df9f1477de70ce1ce577f396d24083 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 15 Jul 2025 12:50:46 -0400 Subject: [PATCH 12/14] fix check to allow counters with same name but different values --- .../com/cloud/network/as/dao/CounterDaoImpl.java | 14 +++++++------- .../com/cloud/network/as/AutoScaleManagerImpl.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java index 50b6f7c0bc0c..0badbe449acc 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java @@ -32,7 +32,7 @@ @Component public class CounterDaoImpl extends GenericDaoBase implements CounterDao { final SearchBuilder AllFieldsSearch; - final SearchBuilder CounterNameSearch; + final SearchBuilder CounterValueSearch; protected CounterDaoImpl() { AllFieldsSearch = createSearchBuilder(); @@ -42,16 +42,16 @@ protected CounterDaoImpl() { AllFieldsSearch.and("provider", AllFieldsSearch.entity().getProvider(), Op.EQ); AllFieldsSearch.done(); - CounterNameSearch = createSearchBuilder(); - CounterNameSearch.and("name", CounterNameSearch.entity().getName(), Op.EQ); - CounterNameSearch.and("source", CounterNameSearch.entity().getSource(), Op.EQ); - CounterNameSearch.and("provider", CounterNameSearch.entity().getProvider(), Op.EQ); - CounterNameSearch.done(); + CounterValueSearch = createSearchBuilder(); + CounterValueSearch.and("name", CounterValueSearch.entity().getName(), Op.EQ); + CounterValueSearch.and("value", CounterValueSearch.entity().getValue(), Op.EQ); + CounterValueSearch.and("provider", CounterValueSearch.entity().getProvider(), Op.EQ); + CounterValueSearch.done(); } @Override public CounterVO findByNameProviderValue(String name, String value, String provider) { - SearchCriteria sc = CounterNameSearch.create(); + SearchCriteria sc = CounterValueSearch.create(); sc.setParameters("name", name); sc.setParameters("value", value); sc.setParameters("provider", provider); diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index bb16527a6341..5f10a45c0400 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1472,7 +1472,7 @@ public Counter createCounter(CreateCounterCmd cmd) { CounterVO existingCounter = counterDao.findByNameProviderValue(name, value, provider.getName()); if (existingCounter != null) { - throw new InvalidParameterValueException("Counter with name " + name + " already exists"); + throw new InvalidParameterValueException(String.format("Counter with name %s and value %s already exists. ", name,value)); } logger.debug("Adding Counter " + name); counter = counterDao.persist(new CounterVO(src, name, value, provider)); From 002d3f8361a2b121204f0a63fd9cd51f32600c11 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 10 Sep 2025 15:50:35 -0400 Subject: [PATCH 13/14] move schema changes to 4.22 path --- .../cloud/upgrade/DatabaseUpgradeChecker.java | 1 - .../upgrade/dao/Upgrade42010to42020.java | 65 ------------------- .../db/schema-42010to42020-cleanup.sql | 20 ------ .../META-INF/db/schema-42010to42020.sql | 23 ------- .../META-INF/db/schema-42100to42200.sql | 3 + 5 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java delete mode 100644 engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql delete mode 100644 engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java index 5faa2b135609..c211b3e97280 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -33,7 +33,6 @@ import javax.inject.Inject; -import com.cloud.upgrade.dao.Upgrade42010to42020; import com.cloud.utils.FileUtil; import org.apache.cloudstack.utils.CloudStackVersion; import org.apache.commons.lang3.StringUtils; diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java deleted file mode 100644 index 2db3bd7688ca..000000000000 --- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42010to42020.java +++ /dev/null @@ -1,65 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.upgrade.dao; - -import com.cloud.utils.exception.CloudRuntimeException; - -import java.io.InputStream; -import java.sql.Connection; - -public class Upgrade42010to42020 implements DbUpgrade { - @Override - public String[] getUpgradableVersionRange() { - return new String[]{"4.20.1.0", "4.20.2.0"}; - } - - @Override - public String getUpgradedVersion() { - return "4.20.2.0"; - } - - @Override - public boolean supportsRollingUpgrade() { - return false; - } - - @Override - public InputStream[] getPrepareScripts() { - final String scriptFile = "META-INF/db/schema-42010to42020.sql"; - final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); - if (script == null) { - throw new CloudRuntimeException("Unable to find " + scriptFile); - } - - return new InputStream[]{script}; - } - - @Override - public void performDataMigration(Connection conn) { - } - - @Override - public InputStream[] getCleanupScripts() { - final String scriptFile = "META-INF/db/schema-42010to42020-cleanup.sql"; - final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); - if (script == null) { - throw new CloudRuntimeException("Unable to find " + scriptFile); - } - - return new InputStream[]{script}; - } -} diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql deleted file mode 100644 index fe60ed734ff3..000000000000 --- a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020-cleanup.sql +++ /dev/null @@ -1,20 +0,0 @@ --- Licensed to the Apache Software Foundation (ASF) under one --- or more contributor license agreements. See the NOTICE file --- distributed with this work for additional information --- regarding copyright ownership. The ASF licenses this file --- to you under the Apache License, Version 2.0 (the --- "License"); you may not use this file except in compliance --- with the License. You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, --- software distributed under the License is distributed on an --- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY --- KIND, either express or implied. See the License for the --- specific language governing permissions and limitations --- under the License. - ---; --- Schema cleanup from 4.20.1.0 to 4.20.2.0; ---; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql b/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql deleted file mode 100644 index 42e2e5e61155..000000000000 --- a/engine/schema/src/main/resources/META-INF/db/schema-42010to42020.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Licensed to the Apache Software Foundation (ASF) under one --- or more contributor license agreements. See the NOTICE file --- distributed with this work for additional information --- regarding copyright ownership. The ASF licenses this file --- to you under the Apache License, Version 2.0 (the --- "License"); you may not use this file except in compliance --- with the License. You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, --- software distributed under the License is distributed on an --- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY --- KIND, either express or implied. See the License for the --- specific language governing permissions and limitations --- under the License. - ---; --- Schema upgrade from 4.20.1.0 to 4.20.2.0 ---; - -CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); -CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql index cf3fe2ed7726..782a46ebb6ce 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql @@ -21,3 +21,6 @@ -- Increase length of scripts_version column to 128 due to md5sum to sha512sum change CALL `cloud`.`IDEMPOTENT_CHANGE_COLUMN`('cloud.domain_router', 'scripts_version', 'scripts_version', 'VARCHAR(128)'); + +CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); \ No newline at end of file From 5d30323785b251135a52d3edd8d120a870dd2fff Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 10 Sep 2025 15:53:37 -0400 Subject: [PATCH 14/14] lint --- .../src/main/resources/META-INF/db/schema-42100to42200.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql index 782a46ebb6ce..449d978a7b76 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql @@ -23,4 +23,4 @@ CALL `cloud`.`IDEMPOTENT_CHANGE_COLUMN`('cloud.domain_router', 'scripts_version', 'scripts_version', 'VARCHAR(128)'); CALL `cloud`.`IDEMPOTENT_DROP_UNIQUE_KEY`('counter', 'uc_counter__provider__source__value'); -CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)'); \ No newline at end of file +CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_KEY`('cloud.counter', 'uc_counter__provider__source__value__removed', '(provider, source, value, removed)');