bug 13145: update user data in domr when updatevmcmd is called

status 13145: resolved fixed
This commit is contained in:
Edison Su 2012-01-19 20:02:17 -08:00
parent d9287f0e43
commit a976f1c23c
8 changed files with 139 additions and 16 deletions

View File

@ -0,0 +1,11 @@
package com.cloud.network.router;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
public interface UpdateUserDataElement {
public boolean updateUserData(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm) throws ResourceUnavailableException;
}

View File

@ -41,6 +41,7 @@ import com.cloud.network.vpn.RemoteAccessVpnElement;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.Account;
import com.cloud.user.AccountVO;
import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
@ -217,4 +218,6 @@ public interface NetworkManager extends NetworkService {
String getIpInNetwork(long vmId, long networkId);
String getIpInNetworkIncludingRemoved(long vmId, long networkId);
boolean updateVmData(UserVm vm);
}

View File

@ -100,6 +100,7 @@ import com.cloud.network.dao.NetworkDomainDao;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.rules.FirewallManager;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
@ -121,6 +122,7 @@ import com.cloud.user.User;
import com.cloud.user.UserContext;
import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Adapters;
@ -147,6 +149,7 @@ import com.cloud.vm.ReservationContextImpl;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfileImpl;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
@ -2801,6 +2804,44 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
return elements;
}
private List<? extends UpdateUserDataElement> getUpdateUserDataElements() {
List<UpdateUserDataElement> elements = new ArrayList<UpdateUserDataElement>();
for (NetworkElement element : _networkElements) {
if (element instanceof UpdateUserDataElement) {
elements.add((UpdateUserDataElement) element);
}
}
return elements;
}
@Override
public boolean updateVmData(UserVm vm) {
Nic defaultNic = getDefaultNic(vm.getId());
if (defaultNic == null) {
s_logger.error("Unable to update vm data for vm " + vm.getDisplayName() + " as the instance doesn't have default nic");
return false;
}
Network defaultNetwork = getNetwork(defaultNic.getNetworkId());
NicProfile defaultNicProfile = new NicProfile(defaultNic, defaultNetwork, null, null, null);
VirtualMachineProfile<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>((VMInstanceVO)vm);
List<? extends UpdateUserDataElement> elements = getUpdateUserDataElements();
boolean result = true;
try {
for (UpdateUserDataElement element : elements) {
if (!element.updateUserData(defaultNetwork, defaultNicProfile, vmProfile)) {
result = false;
}
}
} catch (ResourceUnavailableException e) {
}
return true;
}
@Override
public boolean zoneIsConfiguredForExternalNetworking(long zoneId) {

View File

@ -42,6 +42,7 @@ import com.cloud.network.NetworkManager;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
@ -65,7 +66,7 @@ import com.cloud.vm.dao.UserVmDao;
@Local(value=NetworkElement.class)
public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{
public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement, UpdateUserDataElement {
private static final Logger s_logger = Logger.getLogger(DhcpElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@ -258,4 +259,20 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
return false;
}
@Override
public boolean updateUserData(Network network, NicProfile nic,
VirtualMachineProfile<? extends VirtualMachine> vm)
throws ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_USERDATA);
if (routers == null || routers.isEmpty()) {
s_logger.trace("Can't find dhcp element in network " + network.getId());
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile<UserVm> uservm = (VirtualMachineProfile<UserVm>)vm;
return _routerMgr.updateVmData(network, nic, uservm, routers);
}
}

View File

@ -45,6 +45,7 @@ import com.cloud.network.VpnUser;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
@ -372,4 +373,20 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement,
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
}
@Override
public boolean updateUserData(Network network, NicProfile nic,
VirtualMachineProfile<? extends VirtualMachine> vm)
throws ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA);
if (routers == null || routers.isEmpty()) {
s_logger.trace("Can't find virtual router element in network " + network.getId());
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile<UserVm> uservm = (VirtualMachineProfile<UserVm>)vm;
return _routerMgr.updateVmData(network, nic, uservm, routers);
}
}

View File

@ -38,6 +38,7 @@ import com.cloud.utils.component.Manager;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
/**
@ -92,4 +93,9 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
boolean applyStaticNats(Network network, List<? extends StaticNat> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean updateVmData(Network network, NicProfile nic,
VirtualMachineProfile<UserVm> profile,
List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
}

View File

@ -2324,27 +2324,32 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
cmds.addCommand("users", addUsersCmd);
cmds.addCommand("startVpn", startVpnCmd);
}
private void createvmDataCommand(DomainRouterVO router, UserVmVO userVM, DataCenterVO dc, Commands cmds) {
boolean createVmData = true;
long networkId = router.getNetworkId();
if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != userVM.getPodIdToDeployIn().longValue()) {
createVmData = false;
}
if (createVmData) {
NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, userVM.getId());
if (nic != null) {
s_logger.debug("Creating user data entry for vm " + userVM + " on domR " + router);
String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(userVM.getServiceOfferingId()).getDisplayText();
String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
cmds.addCommand("vmdata",
generateVmDataCommand(router, nic.getIp4Address(), userVM.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), userVM.getHostName(), userVM.getInstanceName(), userVM.getId(), null));
}
}
}
private void createVmDataCommands(DomainRouterVO router, Commands cmds) {
long networkId = router.getNetworkId();
List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId, State.Running, State.Migrating, State.Stopping);
DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn());
for (UserVmVO vm : vms) {
boolean createVmData = true;
if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) {
createVmData = false;
}
if (createVmData) {
NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId());
if (nic != null) {
s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router);
String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText();
String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
cmds.addCommand("vmdata",
generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), vm.getId(), null));
}
}
createvmDataCommand(router, vm, dc, cmds);
}
}
@ -2509,6 +2514,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
return result;
}
@Override
public boolean updateVmData(Network network, NicProfile nic, VirtualMachineProfile<UserVm> profile, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
s_logger.warn("Unable save password, router doesn't exist in network " + network.getId());
throw new CloudRuntimeException("Unable to save password to router");
}
boolean result = true;
UserVm userVm = profile.getVirtualMachine();
DataCenterVO dc = _dcDao.findById(userVm.getDataCenterIdToDeployIn());
for (VirtualRouter router : routers) {
Commands cmds = new Commands(OnError.Continue);
createvmDataCommand((DomainRouterVO)router, (UserVmVO)userVm, dc, cmds);
result = result && sendCommandsToRouter(router, cmds);
}
return result;
}
@Override
public boolean applyFirewallRules(Network network, List<? extends FirewallRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {

View File

@ -1818,9 +1818,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
throw new InvalidParameterValueException("Vm with id " + id + " is not in the right state");
}
boolean updateUserdata = false;
if (userData != null) {
validateUserData(userData);
// update userData on domain router.
updateUserdata = true;
} else {
userData = vmInstance.getUserData();
}
@ -1852,6 +1854,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
_vmDao.updateVM(id, displayName, ha, osTypeId, userData);
if (updateUserdata) {
_networkMgr.updateVmData(vmInstance);
}
return _vmDao.findById(id);
}