mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge branch '4.11'
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
commit
9c1eabfc28
@ -1349,30 +1349,29 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
||||
StoragePool pool;
|
||||
for (VolumeTask task : tasks) {
|
||||
if (task.type == VolumeTaskType.NOP) {
|
||||
pool = (StoragePool)dataStoreMgr.getDataStore(task.pool.getId(), DataStoreRole.Primary);
|
||||
|
||||
if (task.pool != null && task.pool.isManaged()) {
|
||||
long hostId = vm.getVirtualMachine().getHostId();
|
||||
Host host = _hostDao.findById(hostId);
|
||||
|
||||
volService.grantAccess(volFactory.getVolume(task.volume.getId()), host, (DataStore)pool);
|
||||
}
|
||||
|
||||
vol = task.volume;
|
||||
|
||||
// For a zone-wide managed storage, it is possible that the VM can be started in another
|
||||
pool = (StoragePool)dataStoreMgr.getDataStore(task.pool.getId(), DataStoreRole.Primary);
|
||||
|
||||
// For zone-wide managed storage, it is possible that the VM can be started in another
|
||||
// cluster. In that case, make sure that the volume is in the right access group.
|
||||
if (pool.isManaged()) {
|
||||
long oldHostId = vm.getVirtualMachine().getLastHostId();
|
||||
long hostId = vm.getVirtualMachine().getHostId();
|
||||
Host lastHost = _hostDao.findById(vm.getVirtualMachine().getLastHostId());
|
||||
Host host = _hostDao.findById(vm.getVirtualMachine().getHostId());
|
||||
|
||||
long lastClusterId = lastHost == null || lastHost.getClusterId() == null ? -1 : lastHost.getClusterId();
|
||||
long clusterId = host == null || host.getClusterId() == null ? -1 : host.getClusterId();
|
||||
|
||||
if (lastClusterId != clusterId) {
|
||||
if (lastHost != null) {
|
||||
storageMgr.removeStoragePoolFromCluster(lastHost.getId(), vol.get_iScsiName(), pool);
|
||||
|
||||
if (oldHostId != hostId) {
|
||||
Host oldHost = _hostDao.findById(oldHostId);
|
||||
DataStore storagePool = dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary);
|
||||
|
||||
storageMgr.removeStoragePoolFromCluster(oldHostId, vol.get_iScsiName(), pool);
|
||||
volService.revokeAccess(volFactory.getVolume(vol.getId()), lastHost, storagePool);
|
||||
}
|
||||
|
||||
volService.revokeAccess(volFactory.getVolume(vol.getId()), oldHost, storagePool);
|
||||
volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool);
|
||||
}
|
||||
}
|
||||
} else if (task.type == VolumeTaskType.MIGRATE) {
|
||||
|
||||
@ -1169,6 +1169,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
}
|
||||
|
||||
macAddress = validateOrReplaceMacAddress(macAddress, network.getId());
|
||||
|
||||
if(_nicDao.findByNetworkIdAndMacAddress(networkId, macAddress) != null) {
|
||||
throw new CloudRuntimeException("A NIC with this MAC address exists for network: " + network.getUuid());
|
||||
}
|
||||
@ -1239,6 +1241,19 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
return _vmDao.findById(vmInstance.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* If the given MAC address is invalid it replaces the given MAC with the next available MAC address
|
||||
*/
|
||||
protected String validateOrReplaceMacAddress(String macAddress, long networkId) {
|
||||
if (!NetUtils.isValidMac(macAddress)) {
|
||||
try {
|
||||
macAddress = _networkModel.getNextAvailableMacAddressInNetwork(networkId);
|
||||
} catch (InsufficientAddressCapacityException e) {
|
||||
throw new CloudRuntimeException(String.format("A MAC address cannot be generated for this NIC in the network [id=%s] ", networkId));
|
||||
}
|
||||
}
|
||||
return macAddress;
|
||||
}
|
||||
|
||||
private void saveExtraDhcpOptions(long nicId, Map<Integer, String> dhcpOptions) {
|
||||
List<NicExtraDhcpOptionVO> nicExtraDhcpOptionVOList = dhcpOptions
|
||||
|
||||
@ -22,6 +22,7 @@ import java.util.HashMap;
|
||||
import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
|
||||
import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
|
||||
import org.apache.cloudstack.context.CallContext;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@ -34,9 +35,11 @@ import org.powermock.api.mockito.PowerMockito;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.NetworkModel;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
import com.cloud.storage.dao.GuestOSDao;
|
||||
import com.cloud.user.Account;
|
||||
@ -70,6 +73,9 @@ public class UserVmManagerImplTest {
|
||||
@Mock
|
||||
private UserVmVO userVmVoMock;
|
||||
|
||||
@Mock
|
||||
private NetworkModel networkModel;
|
||||
|
||||
private long vmId = 1l;
|
||||
|
||||
@Before
|
||||
@ -221,4 +227,53 @@ public class UserVmManagerImplTest {
|
||||
Mockito.anyString(), Mockito.anyBoolean(), Mockito.any(HTTPMethod.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyListOf(Long.class),
|
||||
Mockito.anyMap());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressValid() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(0, "01:23:45:67:89:ab", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressNull() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, null, "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressBlank() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, " ", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressEmpty() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, "", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressNotValidOption1() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, "abcdef:gh:ij:kl", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressNotValidOption2() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, "01:23:45:67:89:", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressNotValidOption3() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, "01:23:45:67:89:az", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateOrReplaceMacAddressTestMacAddressNotValidOption4() throws InsufficientAddressCapacityException {
|
||||
configureValidateOrReplaceMacAddressTest(1, "@1:23:45:67:89:ab", "01:23:45:67:89:ab");
|
||||
}
|
||||
|
||||
private void configureValidateOrReplaceMacAddressTest(int times, String macAddress, String expectedMacAddress) throws InsufficientAddressCapacityException {
|
||||
Mockito.when(networkModel.getNextAvailableMacAddressInNetwork(Mockito.anyLong())).thenReturn(expectedMacAddress);
|
||||
|
||||
String returnedMacAddress = userVmManagerImpl.validateOrReplaceMacAddress(macAddress, 1l);
|
||||
|
||||
Mockito.verify(networkModel, Mockito.times(times)).getNextAvailableMacAddressInNetwork(Mockito.anyLong());
|
||||
Assert.assertEquals(expectedMacAddress, returnedMacAddress);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user