blob: b86269511fa344c9f927aef3f0a23c8bc8486342 [file] [log] [blame]
/*
* 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.storage.datastore.driver;
import com.cloud.agent.api.to.DataObjectType;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.tags.dao.ResourceTagDao;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.dao.VMInstanceDao;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.junit.After;
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.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.UUID;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class StorPoolPrimaryDataStoreDriverTest {
@Mock
private VMInstanceDao vmInstanceDao;
@Mock
private ResourceTagDao _resourceTagDao;
@Mock
private AsyncCompletionCallback<CopyCommandResult> callback;
@Mock
private PrimaryDataStoreDao storagePool;
@Mock
private StoragePoolDetailsDao detailsDao;
@Mock
private VolumeDao volumeDao;
DataStore srcStore;
DataStore destStore;
DataObject srcObj;
DataObject destObj;
VolumeObjectTO srcTO;
VolumeObjectTO dstTO;
PrimaryDataStoreTO dstPrimaryTo;
MockedStatic<StorPoolUtil> utilities;
StorPoolUtil.SpConnectionDesc conn;
@Before
public void setUp(){
utilities = Mockito.mockStatic(StorPoolUtil.class);
conn = new StorPoolUtil.SpConnectionDesc("1.1.1.1:81", "123", "tmp");
srcStore = mock(DataStore.class);
destStore = mock(DataStore.class);
srcObj = mock(VolumeInfo.class);
destObj = mock(VolumeInfo.class);
srcTO = mock(VolumeObjectTO.class);
dstTO = mock(VolumeObjectTO.class);
dstPrimaryTo = mock(PrimaryDataStoreTO.class);
}
@After
public void tearDown(){
utilities.close();
}
@InjectMocks
private StorPoolPrimaryDataStoreDriver storPoolPrimaryDataStoreDriver;
@Test
public void testMigrateVolumePassed(){
VMInstanceVO vm = mock(VMInstanceVO.class);
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, vm);
when(vm.getState()).thenReturn(State.Running);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse resp = new StorPoolUtil.SpApiResponse();
when(StorPoolUtil.volumeUpdateTemplate("~t.t.t", conn)).thenReturn(resp);
when(volumeDao.findById(srcObj.getId())).thenReturn(mock(VolumeVO.class));
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
utilities.verify(() -> StorPoolUtil.volumeUpdateTemplate("~t.t.t", conn), times(1));
Assert.assertNull(resp.getError());
}
@Test
public void testMigrateVolumeNotPassed() {
VMInstanceVO vm = mock(VMInstanceVO.class);
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, vm);
when(vm.getState()).thenReturn(State.Running);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse resp = new StorPoolUtil.SpApiResponse();
setResponseError(resp);
when(StorPoolUtil.volumeUpdateTemplate("~t.t.t", conn)).thenReturn(resp);
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
Assert.assertNotNull(resp.getError());
}
@Test
public void testCopyVolumeAttachedToVmPassed() {
VMInstanceVO vm = mock(VMInstanceVO.class);
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, vm);
when(vm.getState()).thenReturn(State.Stopped);
String vmUuid = UUID.randomUUID().toString();
when(vm.getUuid()).thenReturn(vmUuid);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse response = new StorPoolUtil.SpApiResponse();
String volumeUuid = UUID.randomUUID().toString();
when(srcObj.getUuid()).thenReturn(volumeUuid);
when(StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, vmUuid, "", conn)).thenReturn(response);
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
Assert.assertNull(response.getError());
}
@Test
public void testCopyVolumeAttachedToVmNotPassed() {
VMInstanceVO vm = mock(VMInstanceVO.class);
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, vm);
when(vm.getState()).thenReturn(State.Stopped);
String vmUuid = UUID.randomUUID().toString();
when(vm.getUuid()).thenReturn(vmUuid);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse response = new StorPoolUtil.SpApiResponse();
setResponseError(response);
String volumeUuid = UUID.randomUUID().toString();
when(srcObj.getUuid()).thenReturn(volumeUuid);
when(StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, vmUuid, "", conn)).thenReturn(response);
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
Assert.assertNotNull(response.getError());
}
@Test
public void testCopyVolumeNotAttachedToVmNotPassed() {
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, null);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse response = new StorPoolUtil.SpApiResponse();
setResponseError(response);
String volumeUuid = UUID.randomUUID().toString();
when(srcObj.getUuid()).thenReturn(volumeUuid);
when(StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, null, null, conn)).thenReturn(response);
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
utilities.verify(() -> StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, null, null, conn), times(1));
Assert.assertNotNull(response.getError());
}
@Test
public void testCopyVolumeNotAttachedToVmPassed() {
setReturnsWhenSourceAndDestinationAreVolumes(srcStore, destStore, srcObj, destObj, srcTO, dstTO, dstPrimaryTo, null);
when(StorPoolUtil.getSpConnection(destObj.getDataStore().getUuid(), destObj.getDataStore().getId(), detailsDao, storagePool)).thenReturn(conn);
StorPoolUtil.SpApiResponse response = new StorPoolUtil.SpApiResponse();
String volumeUuid = UUID.randomUUID().toString();
when(srcObj.getUuid()).thenReturn(volumeUuid);
when(StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, null, null, conn)).thenReturn(response);
storPoolPrimaryDataStoreDriver.copyAsync(srcObj, destObj, callback);
utilities.verify(() -> StorPoolUtil.volumeCopy(volumeUuid, "~t.t.t", "volume", null, null, null, conn), times(1));
Assert.assertNull(response.getError());
}
private void setReturnsWhenSourceAndDestinationAreVolumes(DataStore srcStore, DataStore destStore, DataObject srcObj, DataObject destObj, VolumeObjectTO srcTO, VolumeObjectTO dstTO, PrimaryDataStoreTO dstPrimaryTo, VMInstanceVO vm) {
when(srcStore.getRole()).thenReturn(DataStoreRole.Primary);
when(destStore.getRole()).thenReturn(DataStoreRole.Primary);
when(srcObj.getDataStore()).thenReturn(srcStore);
when(destObj.getDataStore()).thenReturn(destStore);
when(srcObj.getType()).thenReturn(DataObjectType.VOLUME);
when(destObj.getType()).thenReturn(DataObjectType.VOLUME);
when(destObj.getTO()).thenReturn(dstTO);
when(srcObj.getTO()).thenReturn(srcTO);
when(srcObj.getDataStore().getDriver()).thenReturn(storPoolPrimaryDataStoreDriver);
when(destObj.getTO().getDataStore()).thenReturn(dstPrimaryTo);
when(destObj.getDataStore().getUuid()).thenReturn("SP_API_HTTP=1.1.1.1:81;SP_AUTH_TOKEN=token;SP_TEMPLATE=template_name");
when(destObj.getDataStore().getId()).thenReturn(1L);
when(srcTO.getPath()).thenReturn("/dev/storpool-byid/t.t.t");
when(dstPrimaryTo.getPoolType()).thenReturn(StoragePoolType.StorPool);
when(vmInstanceDao.findById(anyLong())).thenReturn(vm);
}
private static void setResponseError(StorPoolUtil.SpApiResponse resp) {
StorPoolUtil.SpApiError respErr = new StorPoolUtil.SpApiError();
respErr.setName("error");
respErr.setDescr("Failed");
resp.setError(respErr);
}
}