From 7ff1417cbbee0546bba57d1e6cb8a5b6c28ed075 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 9 Dec 2011 15:36:04 -0800 Subject: [PATCH] bug 12229: added restartRequired field to the network object The value is set to true when shutdownResources or implementResources fail. --- api/src/com/cloud/api/ApiConstants.java | 1 + .../cloud/api/commands/ListNetworksCmd.java | 9 ++++- .../cloud/api/response/NetworkResponse.java | 7 ++++ api/src/com/cloud/network/Network.java | 2 ++ api/src/com/cloud/network/NetworkProfile.java | 8 +++++ .../src/com/cloud/api/ApiResponseHelper.java | 1 + .../com/cloud/network/NetworkManagerImpl.java | 33 +++++++++++++++---- server/src/com/cloud/network/NetworkVO.java | 11 +++++++ setup/db/create-schema.sql | 3 +- setup/db/db/schema-2214to30.sql | 2 ++ 10 files changed, 69 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 5e94085093a..40b3f645b9a 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -320,6 +320,7 @@ public class ApiConstants { public static final String SOURCE_NAT_SUPPORTED = "sourcenatsupported"; public static final String RESOURCE_STATE = "resourcestate"; public static final String PROJECT_INVITE_REQUIRED = "projectinviterequired"; + public static final String RESTART_REQUIRED = "restartrequired"; public enum HostDetails { all, capacity, events, stats, min; diff --git a/api/src/com/cloud/api/commands/ListNetworksCmd.java b/api/src/com/cloud/api/commands/ListNetworksCmd.java index db757f7f5f3..7087495e0ae 100644 --- a/api/src/com/cloud/api/commands/ListNetworksCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworksCmd.java @@ -78,6 +78,9 @@ public class ListNetworksCmd extends BaseListCmd { @Parameter(name=ApiConstants.SUPPORTED_SERVICES, type=CommandType.LIST, collectionType=CommandType.STRING, description="list network offerings supporting certain services") private List supportedServices; + + @Parameter(name=ApiConstants.RESTART_REQUIRED, type=CommandType.BOOLEAN, description="list network offerings by restartRequired option") + private Boolean restartRequired; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -127,7 +130,11 @@ public class ListNetworksCmd extends BaseListCmd { return supportedServices; } - ///////////////////////////////////////////////////// + public Boolean getRestartRequired() { + return restartRequired; + } + + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @Override diff --git a/api/src/com/cloud/api/response/NetworkResponse.java b/api/src/com/cloud/api/response/NetworkResponse.java index 012ae8f7247..c1ee815aacf 100644 --- a/api/src/com/cloud/api/response/NetworkResponse.java +++ b/api/src/com/cloud/api/response/NetworkResponse.java @@ -127,6 +127,9 @@ public class NetworkResponse extends BaseResponse implements ControlledEntityRes @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) @Param(description="the physical network id") private IdentityProxy physicalNetworkId = new IdentityProxy("physical_network"); + @SerializedName(ApiConstants.RESTART_REQUIRED) @Param(description="true network requires restart") + private Boolean restartRequired; + public void setId(Long id) { this.id.setValue(id); } @@ -260,4 +263,8 @@ public class NetworkResponse extends BaseResponse implements ControlledEntityRes public void setCidr(String cidr) { this.cidr = cidr; } + + public void setRestartRequired(Boolean restartRequired) { + this.restartRequired = restartRequired; + } } diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 38011d044db..f54154b926f 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -288,4 +288,6 @@ public interface Network extends ControlledEntity { ACLType getAclType(); boolean isSpecifiedCidr(); + + boolean isRestartRequired(); } diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java index ca4447a9b13..cbe4582df1b 100644 --- a/api/src/com/cloud/network/NetworkProfile.java +++ b/api/src/com/cloud/network/NetworkProfile.java @@ -49,6 +49,7 @@ public class NetworkProfile implements Network { private Long physicalNetworkId; private ACLType aclType; private boolean specifiedCidr; + private boolean restartRequired; public NetworkProfile(Network network) { this.id = network.getId(); @@ -72,6 +73,7 @@ public class NetworkProfile implements Network { this.physicalNetworkId = network.getPhysicalNetworkId(); this.aclType = network.getAclType(); this.specifiedCidr = network.isSpecifiedCidr(); + this.restartRequired = network.isRestartRequired(); } public String getDns1() { @@ -208,4 +210,10 @@ public class NetworkProfile implements Network { this.specifiedCidr = specifiedCidr; } + @Override + public boolean isRestartRequired() { + // TODO Auto-generated method stub + return false; + } + } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index a3e2abe3e05..d092e196552 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -2684,6 +2684,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setAclType(network.getAclType().toString()); } response.setState(network.getState().toString()); + response.setRestartRequired(network.isRestartRequired()); response.setRelated(network.getRelated()); response.setNetworkDomain(network.getNetworkDomain()); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 38567b3166b..eddf084c52e 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1359,6 +1359,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag implementNetworkElementsAndResources(dest, context, network, offering); network.setState(Network.State.Implemented); + network.setRestartRequired(false); _networksDao.update(network.getId(), network); implemented.set(guru, network); return implemented; @@ -2109,6 +2110,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String path = null; Long physicalNetworkId = cmd.getPhysicalNetworkId(); List supportedServicesStr = cmd.getSupportedServices(); + Boolean restartRequired= cmd.getRestartRequired(); //1) default is system to false if not specified //2) reset parameter to false if it's specified by the regular user @@ -2198,17 +2200,17 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (isSystem == null || !isSystem) { //Get domain level networks if (domainId != null) { - networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, domainId)); + networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks, restartRequired), searchFilter, domainId)); } else if (permittedAccounts.isEmpty()){ - networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, path)); + networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks, restartRequired), searchFilter, path)); } //get account specific networks if (!permittedAccounts.isEmpty()){ - networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, permittedAccounts)); + networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks, restartRequired), searchFilter, permittedAccounts)); } } else { - networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks), searchFilter); + networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks, restartRequired), searchFilter); } if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.isEmpty()) { @@ -2237,7 +2239,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId, String aclType, boolean skipProjectNetworks) { + private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId, String aclType, boolean skipProjectNetworks, Boolean restartRequired) { SearchCriteria sc = sb.create(); if (isSystem != null) { @@ -2277,6 +2279,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (skipProjectNetworks) { sc.setJoinParameters("accountSearch", "type", Account.ACCOUNT_TYPE_PROJECT); } + + if (restartRequired != null) { + sc.addAnd("restartRequired", SearchCriteria.Op.EQ, restartRequired); + } return sc; } @@ -2391,6 +2397,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag applyProfileToNetwork(network, profile); network.setState(Network.State.Allocated); + network.setRestartRequired(false); _networksDao.update(network.getId(), network); _networksDao.clearCheckForGc(networkId); @@ -2685,6 +2692,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!(network.getState() == Network.State.Implemented || network.getState() == Network.State.Setup)) { throw new InvalidParameterValueException("Network is not in the right state to be restarted. Correct states are: " + Network.State.Implemented + ", " + Network.State.Setup); } + + //don't allow clenaup=true for the network in Basic zone + DataCenter zone = _configMgr.getZone(network.getDataCenterId()); + if (zone.getNetworkType() == NetworkType.Basic && cleanup) { + throw new InvalidParameterValueException("Cleanup can't be true when restart network in Basic zone"); + } _accountMgr.checkAccess(callerAccount, null, network); @@ -2731,6 +2744,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!shutdownNetworkElementsAndResources(context, cleanup, network)) { s_logger.debug("Failed to shutdown the network elements and resources as a part of network restart: " + network.getState()); + setRestartRequired(network, true); return false; } @@ -2742,14 +2756,21 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag try { implementNetworkElementsAndResources(dest, context, network, offering); + setRestartRequired(network, true); } catch (Exception ex) { s_logger.warn("Failed to implement network " + network + " elements and resources as a part of network restart due to ", ex); return false; } - + setRestartRequired(network, false); return true; } + private void setRestartRequired(NetworkVO network, boolean restartRequired) { + s_logger.debug("Marking network " + network + " with restartRequired=" + restartRequired); + network.setRestartRequired(restartRequired); + _networksDao.update(network.getId(), network); + } + //This method re-programs the rules/ips for existing network protected boolean reprogramNetworkRules(long networkId, Account caller, NetworkVO network) throws ResourceUnavailableException { diff --git a/server/src/com/cloud/network/NetworkVO.java b/server/src/com/cloud/network/NetworkVO.java index a30138136ab..4ecabfe7129 100644 --- a/server/src/com/cloud/network/NetworkVO.java +++ b/server/src/com/cloud/network/NetworkVO.java @@ -145,6 +145,9 @@ public class NetworkVO implements Network, Identity { @Column(name="specified_cidr") boolean specifiedCidr; + @Column(name="restart_required") + boolean restartRequired = false; + public NetworkVO() { this.uuid = UUID.randomUUID().toString(); } @@ -474,4 +477,12 @@ public class NetworkVO implements Network, Identity { this.specifiedCidr = specifiedCidr; } + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; + } + + @Override + public boolean isRestartRequired() { + return restartRequired; + } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index c45b70d1c46..f36e85df422 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -191,7 +191,8 @@ CREATE TABLE `cloud`.`networks` ( `network_domain` varchar(255) COMMENT 'domain', `reservation_id` char(40) COMMENT 'reservation id', `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', - `specified_cidr` int(1) unsigned NOT NULL COMMENT '1 if the CIDR/gateway/vlan are specified in this network', + `specified_cidr` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if the CIDR/gateway/vlan are specified in this network', + `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the network', `created` datetime NOT NULL COMMENT 'date created', `removed` datetime COMMENT 'date removed if not null', PRIMARY KEY (`id`), diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index 2190350d0ae..d005a0787ee 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -476,3 +476,5 @@ ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD COLUMN `physical_network_id` bigint u ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT `fk_op_dc_vnet_alloc__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on'; ALTER TABLE `cloud`.`user_ip_address` ADD CONSTRAINT `fk_user_ip_address__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE; + +ALTER TABLE `cloud`.`networks` ADD COLUMN `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the network';