Skip to content

Allow counters to be created with same name, provider and source as a deleted one #10223

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: 4.20
Choose a base branch
from
2 changes: 2 additions & 0 deletions api/src/main/java/com/cloud/network/as/AutoScaleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ public interface AutoScaleService {

Counter createCounter(CreateCounterCmd cmd);

Counter getCounter(long counterId);

boolean deleteCounter(long counterId) throws ResourceInUseException;

List<? extends Counter> listCounters(ListCountersCmd cmd);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.apache.cloudstack.api.command.admin.autoscale;

import org.apache.cloudstack.context.CallContext;

import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiCommandResourceType;
Expand Down Expand Up @@ -89,16 +90,18 @@
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());
}
}

@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);

Check warning on line 104 in api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java#L100-L104

Added lines #L100 - L104 were not covered by tests
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.cloud.utils.db.GenericDao;

public interface CounterDao extends GenericDao<CounterVO, Long> {
CounterVO findByNameProviderSource(String name, String source, String provider);
public List<CounterVO> listCounters(Long id, String name, String source, String provider, String keyword, Filter filter);

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
@Component
public class CounterDaoImpl extends GenericDaoBase<CounterVO, Long> implements CounterDao {
final SearchBuilder<CounterVO> AllFieldsSearch;
final SearchBuilder<CounterVO> CounterNameSearch;

protected CounterDaoImpl() {
AllFieldsSearch = createSearchBuilder();
Expand All @@ -40,6 +41,21 @@
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();
}

Check warning on line 50 in engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java#L45-L50

Added lines #L45 - L50 were not covered by tests

@Override
public CounterVO findByNameProviderSource(String name, String source, String provider) {
SearchCriteria<CounterVO> sc = CounterNameSearch.create();
sc.setParameters("name", name);
sc.setParameters("source", source);
sc.setParameters("provider", provider);
return findOneBy(sc);

Check warning on line 58 in engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/as/dao/CounterDaoImpl.java#L53-L58

Added lines #L53 - L58 were not covered by tests
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
Expand Up @@ -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)');
Original file line number Diff line number Diff line change
Expand Up @@ -1452,7 +1452,7 @@
@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 {
Expand All @@ -1469,13 +1469,23 @@

CounterVO counter = null;

CounterVO existingCounter = counterDao.findByNameProviderSource(name, source, provider.getName());
if (existingCounter != null) {
throw new InvalidParameterValueException("Counter with name " + name + " already exists");

Check warning on line 1474 in server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java#L1474

Added line #L1474 was not covered by tests
}
logger.debug("Adding Counter " + name);
counter = counterDao.persist(new CounterVO(src, name, cmd.getValue(), provider));

CallContext.current().setEventDetails(" Id: " + counter.getId() + " Name: " + name);
return counter;
}

@Override
@ActionEvent(eventType = EventTypes.EVENT_COUNTER_CREATE, eventDescription = "Creating a counter", async = true)
public Counter getCounter(long counterId) {
return counterDao.findById(counterId);
}

Check warning on line 1487 in server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java#L1485-L1487

Added lines #L1485 - L1487 were not covered by tests

@Override
@ActionEvent(eventType = EventTypes.EVENT_CONDITION_CREATE, eventDescription = "Condition", create = true)
public Condition createCondition(CreateConditionCmd cmd) {
Expand Down
Loading