mirror of https://github.com/apache/cloudstack.git
bug 13145: update user data in domr when updatevmcmd is called
status 13145: resolved fixed
This commit is contained in:
parent
d9287f0e43
commit
a976f1c23c
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue