bug 10311: Update UpdateNetworkCmd, allow change networkOfferingId

And restart/re-implement the network if networkOfferingId is changed.
This commit is contained in:
Sheng Yang 2011-06-22 15:24:04 -07:00
parent 0d750dacc2
commit 6e405efe01
5 changed files with 68 additions and 12 deletions

View File

@ -59,6 +59,8 @@ public class UpdateNetworkCmd extends BaseCmd {
@Parameter(name=ApiConstants.NETWORK_DOMAIN, type=CommandType.STRING, description="network domain")
private String networkDomain;
@Parameter(name=ApiConstants.NETWORK_OFFERING_ID, type=CommandType.LONG, description="network offering ID")
private Long networkOfferingId;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -84,6 +86,9 @@ public class UpdateNetworkCmd extends BaseCmd {
return networkDomain;
}
private Long getNetworkOfferingId() {
return networkOfferingId == null ? 0 : networkOfferingId;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
@ -107,7 +112,7 @@ public class UpdateNetworkCmd extends BaseCmd {
@Override
public void execute() throws InsufficientCapacityException, ConcurrentOperationException{
Network result = _networkService.updateNetwork(getId(), getNetworkName(), getDisplayText(), tags, UserContext.current().getCaller(), getNetworkDomain());
Network result = _networkService.updateNetwork(getId(), getNetworkName(), getDisplayText(), tags, UserContext.current().getCaller(), getNetworkDomain(), getNetworkOfferingId());
if (result != null) {
NetworkResponse response = _responseGenerator.createNetworkResponse(result);
response.setResponseName(getCommandName());

View File

@ -81,7 +81,7 @@ public interface NetworkService {
Long getDedicatedNetworkDomain(long networkId);
Network updateNetwork(long networkId, String name, String displayText, List<String> tags, Account caller, String domainSuffix);
Network updateNetwork(long networkId, String name, String displayText, List<String> tags, Account caller, String domainSuffix, long networkOfferingId);
Integer getNetworkRate(long networkId, Long vmId);

View File

@ -2360,11 +2360,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
s_logger.debug("Restarting network " + networkId + "...");
ReservationContext context = new ReservationContextImpl(null, null, null, caller);
if (restartElements) {
s_logger.debug("Restarting network elements for the network " + network);
for (NetworkElement element : _networkElements) {
// stop and start the network element
if (!element.restart(network, null)) {
if (!element.restart(network, context)) {
s_logger.warn("Failed to restart network element(s) as a part of network id" + networkId + " restart");
success = false;
}
@ -2904,7 +2905,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
@Override
@ActionEvent(eventType = EventTypes.EVENT_NETWORK_UPDATE, eventDescription = "updating network", async = false)
public Network updateNetwork(long networkId, String name, String displayText, List<String> tags, Account caller, String domainSuffix) {
public Network updateNetwork(long networkId, String name, String displayText, List<String> tags, Account caller, String domainSuffix, long networkOfferingId) {
// verify input parameters
NetworkVO network = _networksDao.findById(networkId);
@ -2960,8 +2961,43 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
if (tags != null) {
network.setTags(tags);
}
long oldNetworkOfferingId = network.getNetworkOfferingId();
if (networkOfferingId != 0) {
NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId);
if (networkOffering == null || networkOffering.isSystemOnly()) {
throw new InvalidParameterValueException("Unable to find network offering by id " + networkOfferingId);
}
if (networkOffering.getAvailability() == Availability.Unavailable) {
throw new InvalidParameterValueException("Can't update network; network offering id=" + networkOfferingId + " is " + networkOffering.getAvailability());
}
network.setNetworkOfferingId(networkOfferingId);
}
_networksDao.update(networkId, network);
if ((networkOfferingId != 0) && (networkOfferingId != oldNetworkOfferingId)) {
s_logger.info("Try to restart the network since the networkofferingID is changed");
// Don't allow to restart network if it's not in Implemented/Setup state
if (!(network.getState() == Network.State.Implemented || network.getState() == Network.State.Setup)) {
s_logger.warn("Network is not in the right state to be restarted. Correct states are: " + Network.State.Implemented + ", " + Network.State.Setup);
}
boolean success = true;
try {
// Restart network - network elements restart is required
success = restartNetwork(networkId, true, caller);
} catch (Exception e) {
s_logger.warn("Fail to restart the network: " + e);
success = false;
}
if (success) {
s_logger.debug("Network id=" + networkId + " is restarted successfully.");
} else {
s_logger.warn("Network id=" + networkId + " failed to restart.");
}
}
return network;

View File

@ -291,6 +291,10 @@ public class NetworkVO implements Network {
return networkOfferingId;
}
public void setNetworkOfferingId(long networkOfferingId) {
this.networkOfferingId = networkOfferingId;
}
public void setMode(Mode mode) {
this.mode = mode;
}

View File

@ -31,6 +31,7 @@ import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.GuestIpType;
@ -49,7 +50,9 @@ import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.RulesManager;
import com.cloud.network.vpn.RemoteAccessVpnElement;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.org.Cluster;
import com.cloud.user.AccountManager;
import com.cloud.uservm.UserVm;
import com.cloud.utils.component.Inject;
@ -82,6 +85,7 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement,
@Inject DomainRouterDao _routerDao;
@Inject LoadBalancerDao _lbDao;
@Inject AccountManager _accountMgr;
@Inject HostDao _hostDao;
private boolean canHandle(GuestIpType ipType, DataCenter dc) {
String provider = dc.getGatewayProvider();
@ -128,29 +132,36 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement,
public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
DataCenter dc = _configMgr.getZone(network.getDataCenterId());
DeployDestination dest = new DeployDestination(dc, null, null, null);
NetworkOffering networkOffering = _networkOfferingDao.findById(network.getNetworkOfferingId());
// We need to re-implement the network since the redundancy capability may changed
List<DomainRouterVO> routers = _routerDao.findByNetwork(network.getId());
if (routers == null || routers.isEmpty()) {
s_logger.trace("Can't find virtual router element in network " + network.getId());
return true;
}
VirtualRouter result = null;
/* Get the host_id in order to find the cluster */
long host_id = 0;
boolean result = true;
boolean ret = true;
for (DomainRouterVO router : routers) {
if (canHandle(network.getGuestType(), dest.getDataCenter())) {
if (router.getState() == State.Stopped) {
result = _routerMgr.startRouter(router.getId(), false);
} else {
result = _routerMgr.rebootRouter(router.getId(), false);
}
if (result == null) {
s_logger.warn("Failed to restart virtual router element " + router + " as a part of netowrk " + network + " restart");
host_id = router.getHostId();
_routerMgr.stopRouter(router.getId(), true);
result = _routerMgr.destroyRouter(router.getId());
if (!result) {
s_logger.warn("Failed to destroy virtual router element " + router + " as a part of netowrk " + network + " restart");
ret = false;
}
} else {
s_logger.trace("Virtual router element doesn't handle network restart for the network " + network);
}
}
Cluster cluster = _configMgr.getCluster(_hostDao.findById(host_id).getClusterId());
dest = new DeployDestination(dc, null, cluster, null);
implement(network, networkOffering, dest, context);
return ret;
}