From 5571b444f25ed11235db5ec449de591b9754825a Mon Sep 17 00:00:00 2001 From: alena Date: Mon, 6 Dec 2010 12:33:56 -0800 Subject: [PATCH] 1) Don't allow to delete a vlan if it has network associated with it. Also don't show such vlans in listIpRanges command. 2) Return vlan in create/list networks command. 3) Implemented list networks by type. 4) Changed listVlanIpRanges to return start/endIps in separate tags instead of returning them in description. --- .../commands/CreateNetworkOfferingCmd.java | 2 +- .../api/commands/CreateVlanIpRangeCmd.java | 10 +++---- .../com/cloud/api/commands/DeployVMCmd.java | 2 +- .../cloud/api/commands/ListNetworksCmd.java | 8 +++++- .../cloud/api/response/NetworkResponse.java | 12 +++++++++ .../com/cloud/offering/NetworkOffering.java | 1 + .../src/com/cloud/api/ApiResponseHelper.java | 10 +++++-- .../ConfigurationManagerImpl.java | 10 +++++-- .../com/cloud/network/NetworkManagerImpl.java | 27 +++++++++++++++++++ .../cloud/server/ManagementServerImpl.java | 2 ++ 10 files changed, 72 insertions(+), 12 deletions(-) diff --git a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java index 9c30aff5c06..a8c452286bb 100644 --- a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java +++ b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java @@ -43,7 +43,7 @@ public class CreateNetworkOfferingCmd extends BaseCmd { @Parameter(name=ApiConstants.DISPLAY_TEXT, type=CommandType.STRING, required=true, description="the display text of the network offering") private String displayText; - @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, required=true, description="type of the network. Supported types Virtualized, DirectSingle, DirectDual") + @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, required=true, description="type of the network. Supported types Virtual, Direct, DirectPodBased") private String type; @Parameter(name=ApiConstants.TRAFFIC_TYPE, type=CommandType.STRING, required=true, description="the traffic type for the network offering, supported types are Public, Management, Control, Guest, Vlan or Storage.") diff --git a/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java b/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java index 04dfa5fb806..c46b3ae0dc1 100644 --- a/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java +++ b/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java @@ -49,8 +49,8 @@ public class CreateVlanIpRangeCmd extends BaseCmd { @Parameter(name=ApiConstants.END_IP, type=CommandType.STRING, description="the ending IP address in the VLAN IP range") private String endIp; -// @Parameter(name=ApiConstants.FOR_VIRTUAL_NETWORK, type=CommandType.BOOLEAN, description="true if VLAN is of Virtual type, false if Direct") -// private Boolean forVirtualNetwork; + @Parameter(name=ApiConstants.FOR_VIRTUAL_NETWORK, type=CommandType.BOOLEAN, description="true if VLAN is of Virtual type, false if Direct") + private Boolean forVirtualNetwork; @Parameter(name=ApiConstants.GATEWAY, type=CommandType.STRING, required=true, description="the gateway of the VLAN IP range") private String gateway; @@ -86,9 +86,9 @@ public class CreateVlanIpRangeCmd extends BaseCmd { return endIp; } -// public Boolean isForVirtualNetwork() { -// return forVirtualNetwork; -// } + public Boolean isForVirtualNetwork() { + return forVirtualNetwork == null ? true : forVirtualNetwork; + } public String getGateway() { return gateway; diff --git a/api/src/com/cloud/api/commands/DeployVMCmd.java b/api/src/com/cloud/api/commands/DeployVMCmd.java index 939550ec091..9812076294d 100644 --- a/api/src/com/cloud/api/commands/DeployVMCmd.java +++ b/api/src/com/cloud/api/commands/DeployVMCmd.java @@ -84,7 +84,7 @@ public class DeployVMCmd extends BaseAsyncCreateCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="availability zone for the virtual machine") private Long zoneId; - @Parameter(name=ApiConstants.NETWORK_IDS, type=CommandType.LIST, required=true, collectionType=CommandType.LONG, description="list of network ids used by virtual machine") + @Parameter(name=ApiConstants.NETWORK_IDS, type=CommandType.LIST, collectionType=CommandType.LONG, description="list of network ids used by virtual machine") private List networkIds; // unexposed parameter needed for serializing/deserializing the command diff --git a/api/src/com/cloud/api/commands/ListNetworksCmd.java b/api/src/com/cloud/api/commands/ListNetworksCmd.java index 26d6927158b..e12a5930597 100644 --- a/api/src/com/cloud/api/commands/ListNetworksCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworksCmd.java @@ -27,7 +27,6 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.NetworkResponse; import com.cloud.network.Network; @@ -52,6 +51,9 @@ public class ListNetworksCmd extends BaseListCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the Zone ID of the network") private Long zoneId; + + @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, description="the type of the network") + private String type; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -73,6 +75,10 @@ public class ListNetworksCmd extends BaseListCmd { return zoneId; } + public String getType() { + return type; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/response/NetworkResponse.java b/api/src/com/cloud/api/response/NetworkResponse.java index 685edd34822..4aeee3b81c3 100644 --- a/api/src/com/cloud/api/response/NetworkResponse.java +++ b/api/src/com/cloud/api/response/NetworkResponse.java @@ -81,6 +81,10 @@ public class NetworkResponse extends BaseResponse{ @SerializedName("type") private String type; + //TODO - add description + @SerializedName("vlan") + private String vlan; + @SerializedName(ApiConstants.ACCOUNT) @Param(description="the account associated with the network") private String accountName; @@ -264,4 +268,12 @@ public class NetworkResponse extends BaseResponse{ public void setEndIp(String endIp) { this.endIp = endIp; } + + public String getVlan() { + return vlan; + } + + public void setVlan(String vlan) { + this.vlan = vlan; + } } diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index 3e937dad2e9..2c6ef9f20fa 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -28,6 +28,7 @@ public interface NetworkOffering { public enum GuestIpType { Virtual, Direct, + DirectPodBased, } public final String DefaultVirtualizedNetworkOffering = "DefaultVirtualizedNetworkOffering"; diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c301a174e1f..29a54f505a0 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -759,7 +759,13 @@ public class ApiResponseHelper implements ResponseGenerator { vlanResponse.setGateway(vlan.getVlanGateway()); vlanResponse.setNetmask(vlan.getVlanNetmask()); - vlanResponse.setDescription(vlan.getIpRange()); + + //get start ip and end ip of corresponding vlan + String ipRange = vlan.getIpRange(); + String[] range = ipRange.split("-"); + vlanResponse.setStartIp(range[0]); + vlanResponse.setEndIp(range[1]); + vlanResponse.setNetworkId(vlan.getNetworkId()); vlanResponse.setObjectName("vlan"); @@ -2370,9 +2376,9 @@ public class ApiResponseHelper implements ResponseGenerator { response.setEndIp(range[1]); response.setGateway(singleVlan.getVlanGateway()); response.setNetmask(singleVlan.getVlanNetmask()); + response.setVlan(singleVlan.getVlanId()); } - response.setZoneId(network.getDataCenterId()); //populate network offering information diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 4f389d37934..48de307f903 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1436,6 +1436,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String vlanNetmask = cmd.getNetmask(); Long userId = UserContext.current().getUserId(); String vlanId = cmd.getVlan(); + Boolean forVirtualNetwork = cmd.isForVirtualNetwork(); // If an account name and domain ID are specified, look up the account String accountName = cmd.getAccountName(); Long domainId = cmd.getDomainId(); @@ -1446,7 +1447,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid account."); } } - return createVlanAndPublicIpRange(userId, zoneId, podId, startIP, endIP, vlanGateway, vlanNetmask, true, vlanId, account, null); + + return createVlanAndPublicIpRange(userId, zoneId, podId, startIP, endIP, vlanGateway, vlanNetmask, forVirtualNetwork, vlanId, account, null); } @@ -1780,6 +1782,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Please specify a valid IP range id."); } + if (vlan.getNetworkId() != null) { + throw new InvalidParameterValueException("Fail to delete a vlan range as there are networks associated with it"); + } + // Check if the VLAN has any allocated public IPs if (_publicIpAddressDao.countIPs(vlan.getDataCenterId(), vlanDbId, true) > 0) { throw new InvalidParameterValueException("The IP range can't be deleted because it has allocated public IP addresses."); @@ -2416,7 +2422,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } } if (type == null) { - throw new InvalidParameterValueException("Invalid value for type. Supported types: Virtualized, DirectSingle, DirectDual"); + throw new InvalidParameterValueException("Invalid value for type. Supported types: Virtual, Direct, DirectPerPod"); } if (specifyVlan == null) { diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 00ffc9cf4b7..c129ffc405e 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -70,6 +70,7 @@ import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; +import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; @@ -89,6 +90,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Networks.AddressFormat; +import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.configuration.NetworkGuru; import com.cloud.network.dao.FirewallRulesDao; @@ -1845,6 +1847,21 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag owner = ctxAccount; } + //if VlanId is Direct untagged, verify if there is already network of this type in the zone + if (networkOffering.getGuestIpType() == GuestIpType.DirectPodBased && vlanId != null && vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) { + SearchBuilder sb = _networkConfigDao.createSearchBuilder(); + sb.and("broadcastDomainType", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("dataCenterId", sb.entity().getName(), SearchCriteria.Op.LIKE); + SearchCriteria sc = sb.create(); + sc.setParameters("broadcastDomainType", BroadcastDomainType.Native); + sc.setParameters("dataCenterId", zoneId); + + List networks = _networkConfigDao.search(sc, null); + if (networks!= null && !networks.isEmpty()) { + throw new InvalidParameterValueException("Network with untagged vlan already exists for the zone " + zoneId); + } + } + //VlanId can be specified only when network offering supports it if (vlanId != null && !networkOffering.getSpecifyVlan()) { throw new InvalidParameterValueException("Can't specify vlan because network offering doesn't support it"); @@ -1868,6 +1885,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag userNetwork.setGateway(gateway); if (vlanId != null) { userNetwork.setBroadcastUri(URI.create("vlan://" + vlanId)); + if (vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) { + userNetwork.setBroadcastDomainType(BroadcastDomainType.Native); + } else { + userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan); + } } } @@ -1913,6 +1935,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Account account = UserContext.current().getAccount(); Long domainId = cmd.getDomainId(); String accountName = cmd.getAccountName(); + String type = cmd.getType(); Long accountId = null; if (isAdmin(account.getType())) { @@ -1961,6 +1984,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); } + if (type != null) { + sc.addAnd("guestType", SearchCriteria.Op.EQ, type); + } + SearchCriteria ssc = _networkConfigDao.createSearchCriteria(); ssc.addOr("accountId", SearchCriteria.Op.EQ, accountId); if (accountName == null && domainId == null) { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index f8f1ed59dbc..6918426f1da 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1403,6 +1403,7 @@ public class ManagementServerImpl implements ManagementServer { sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("vlan", sb.entity().getVlanId(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.NULL); if (accountId != null) { SearchBuilder accountVlanMapSearch = _accountVlanMapDao.createSearchBuilder(); @@ -1442,6 +1443,7 @@ public class ManagementServerImpl implements ManagementServer { if (podId != null) { sc.setJoinParameters("podVlanMapSearch", "podId", podId); } + } return _vlanDao.search(sc, searchFilter);