mirror of https://github.com/apache/cloudstack.git
Merge remote-tracking branch 'origin/4.18'
This commit is contained in:
commit
3b054b2665
|
|
@ -184,7 +184,7 @@ public class ResizeVolumeCmd extends BaseAsyncCmd implements UserCmd {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void execute() throws ResourceAllocationException {
|
||||
public void execute() {
|
||||
Volume volume = null;
|
||||
try {
|
||||
if (size != null) {
|
||||
|
|
@ -194,6 +194,9 @@ public class ResizeVolumeCmd extends BaseAsyncCmd implements UserCmd {
|
|||
}
|
||||
|
||||
volume = _volumeService.resizeVolume(this);
|
||||
} catch (ResourceAllocationException ex) {
|
||||
s_logger.error(ex.getMessage());
|
||||
throw new ServerApiException(ApiErrorCode.RESOURCE_ALLOCATION_ERROR, ex.getMessage());
|
||||
} catch (InvalidParameterValueException ex) {
|
||||
s_logger.info(ex.getMessage());
|
||||
throw new ServerApiException(ApiErrorCode.UNSUPPORTED_ACTION_ERROR, ex.getMessage());
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import java.util.HashMap;
|
|||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
|
@ -83,6 +84,7 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
|||
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.collections.MapUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
|
@ -1656,6 +1658,23 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
return tasks;
|
||||
}
|
||||
|
||||
protected void checkAndUpdateVolumeAccountResourceCount(VolumeVO originalEntry, VolumeVO updateEntry) {
|
||||
if (Objects.equals(originalEntry.getSize(), updateEntry.getSize())) {
|
||||
return;
|
||||
}
|
||||
s_logger.debug(String.format("Size mismatch found for %s after creation, old size: %d, new size: %d. Updating resource count", updateEntry, originalEntry.getSize(), updateEntry.getSize()));
|
||||
if (ObjectUtils.anyNull(originalEntry.getSize(), updateEntry.getSize())) {
|
||||
_resourceLimitMgr.recalculateResourceCount(updateEntry.getAccountId(), updateEntry.getDomainId(),
|
||||
ResourceType.primary_storage.getOrdinal());
|
||||
return;
|
||||
}
|
||||
if (updateEntry.getSize() > originalEntry.getSize()) {
|
||||
_resourceLimitMgr.incrementResourceCount(updateEntry.getAccountId(), ResourceType.primary_storage, updateEntry.isDisplayVolume(), updateEntry.getSize() - originalEntry.getSize());
|
||||
} else {
|
||||
_resourceLimitMgr.decrementResourceCount(updateEntry.getAccountId(), ResourceType.primary_storage, updateEntry.isDisplayVolume(), originalEntry.getSize() - updateEntry.getSize());
|
||||
}
|
||||
}
|
||||
|
||||
private Pair<VolumeVO, DataStore> recreateVolume(VolumeVO vol, VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, StorageAccessException {
|
||||
String volToString = getReflectOnlySelectedFields(vol);
|
||||
|
||||
|
|
@ -1793,8 +1812,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
throw new StorageUnavailableException(msg, destPool.getId());
|
||||
}
|
||||
}
|
||||
|
||||
return new Pair<VolumeVO, DataStore>(newVol, destPool);
|
||||
checkAndUpdateVolumeAccountResourceCount(vol, newVol);
|
||||
return new Pair<>(newVol, destPool);
|
||||
}
|
||||
|
||||
private VolumeVO setPassphraseForVolumeEncryption(VolumeVO volume) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,103 @@
|
|||
// 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 org.apache.cloudstack.engine.orchestration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.Spy;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import com.cloud.configuration.Resource;
|
||||
import com.cloud.storage.VolumeVO;
|
||||
import com.cloud.user.ResourceLimitService;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class VolumeOrchestratorTest {
|
||||
|
||||
@Mock
|
||||
protected ResourceLimitService resourceLimitMgr;
|
||||
|
||||
@Spy
|
||||
@InjectMocks
|
||||
private VolumeOrchestrator volumeOrchestrator = new VolumeOrchestrator();
|
||||
|
||||
private static final Long DEFAULT_ACCOUNT_PS_RESOURCE_COUNT = 100L;
|
||||
private Long accountPSResourceCount;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
accountPSResourceCount = DEFAULT_ACCOUNT_PS_RESOURCE_COUNT;
|
||||
Mockito.when(resourceLimitMgr.recalculateResourceCount(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyInt())).thenReturn(new ArrayList<>());
|
||||
Mockito.doAnswer((Answer<Void>) invocation -> {
|
||||
Resource.ResourceType type = (Resource.ResourceType)invocation.getArguments()[1];
|
||||
Long increment = (Long)invocation.getArguments()[3];
|
||||
if (Resource.ResourceType.primary_storage.equals(type)) {
|
||||
accountPSResourceCount += increment;
|
||||
}
|
||||
return null;
|
||||
}).when(resourceLimitMgr).incrementResourceCount(Mockito.anyLong(), Mockito.any(Resource.ResourceType.class), Mockito.anyBoolean(), Mockito.anyLong());
|
||||
Mockito.doAnswer((Answer<Void>) invocation -> {
|
||||
Resource.ResourceType type = (Resource.ResourceType)invocation.getArguments()[1];
|
||||
Long decrement = (Long)invocation.getArguments()[3];
|
||||
if (Resource.ResourceType.primary_storage.equals(type)) {
|
||||
accountPSResourceCount -= decrement;
|
||||
}
|
||||
return null;
|
||||
}).when(resourceLimitMgr).decrementResourceCount(Mockito.anyLong(), Mockito.any(Resource.ResourceType.class), Mockito.anyBoolean(), Mockito.anyLong());
|
||||
}
|
||||
|
||||
private void runCheckAndUpdateVolumeAccountResourceCountTest(Long originalSize, Long newSize) {
|
||||
VolumeVO v1 = Mockito.mock(VolumeVO.class);
|
||||
Mockito.when(v1.getSize()).thenReturn(originalSize);
|
||||
VolumeVO v2 = Mockito.mock(VolumeVO.class);
|
||||
Mockito.when(v2.getSize()).thenReturn(newSize);
|
||||
volumeOrchestrator.checkAndUpdateVolumeAccountResourceCount(v1, v2);
|
||||
Long expected = ObjectUtils.anyNull(originalSize, newSize) ?
|
||||
DEFAULT_ACCOUNT_PS_RESOURCE_COUNT : DEFAULT_ACCOUNT_PS_RESOURCE_COUNT + (newSize - originalSize);
|
||||
Assert.assertEquals(expected, accountPSResourceCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckAndUpdateVolumeAccountResourceCountSameSize() {
|
||||
runCheckAndUpdateVolumeAccountResourceCountTest(10L, 10L);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckAndUpdateVolumeAccountResourceCountEitherSizeNull() {
|
||||
runCheckAndUpdateVolumeAccountResourceCountTest(null, 10L);
|
||||
runCheckAndUpdateVolumeAccountResourceCountTest(10L, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckAndUpdateVolumeAccountResourceCountMoreSize() {
|
||||
runCheckAndUpdateVolumeAccountResourceCountTest(10L, 20L);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckAndUpdateVolumeAccountResourceCountLessSize() {
|
||||
runCheckAndUpdateVolumeAccountResourceCountTest(20L, 10L);
|
||||
}
|
||||
}
|
||||
|
|
@ -171,11 +171,7 @@ public class ScaleIOHostListener implements HypervisorHostListener {
|
|||
|
||||
@Override
|
||||
public boolean hostDisconnected(long hostId, long poolId) {
|
||||
StoragePoolHostVO storagePoolHost = _storagePoolHostDao.findByPoolHost(poolId, hostId);
|
||||
if (storagePoolHost != null) {
|
||||
_storagePoolHostDao.deleteStoragePoolHostDetails(hostId, poolId);
|
||||
}
|
||||
|
||||
// SDC ID is getting updated upon host connect, no need to delete the storage_pool_host_ref entry
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -129,9 +129,7 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat
|
|||
response.setErrorText(errorMsg);
|
||||
response.setResponseName((cmdObj == null) ? "unknowncommandresponse" : cmdObj.getCommandName());
|
||||
|
||||
// FIXME: setting resultCode to ApiErrorCode.INTERNAL_ERROR is not right, usually executors have their exception handling
|
||||
// and we need to preserve that as much as possible here
|
||||
_asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, ApiErrorCode.INTERNAL_ERROR.getHttpCode(), ApiSerializerHelper.toSerializedString(response));
|
||||
_asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, errorCode, ApiSerializerHelper.toSerializedString(response));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue