From 654eaec6632b379c5ded9f8eb250ae9c184ebd49 Mon Sep 17 00:00:00 2001 From: prachi Date: Wed, 19 Oct 2011 22:39:55 -0700 Subject: [PATCH] NAAS: Configuring Zone - Create Zone changes and changes to data_center table to remove vlan, securityGroup fields - Physical Network lifecycle APIs - Physical Network Service Provider APIs - DB schema changes --- api/src/com/cloud/api/ApiConstants.java | 7 + api/src/com/cloud/api/ResponseGenerator.java | 15 + .../AddNetworkServiceProviderCmd.java | 92 ++++ .../commands/CreatePhysicalNetworkCmd.java | 121 +++++ .../com/cloud/api/commands/CreateZoneCmd.java | 17 - .../DeleteNetworkServiceProviderCmd.java | 78 +++ .../commands/DeletePhysicalNetworkCmd.java | 78 +++ .../ListNetworkServiceProvidersCmd.java | 89 ++++ .../api/commands/ListNetworkServicesCmd.java | 75 +++ .../api/commands/ListPhysicalNetworksCmd.java | 97 ++++ ...stSupportedNetworkServiceProvidersCmd.java | 88 ++++ .../UpdateNetworkServiceProviderCmd.java | 89 ++++ .../commands/UpdatePhysicalNetworkCmd.java | 116 +++++ .../com/cloud/api/commands/UpdateZoneCmd.java | 7 - .../api/response/PhysicalNetworkResponse.java | 148 ++++++ .../cloud/api/response/ProviderResponse.java | 48 +- api/src/com/cloud/dc/DataCenter.java | 1 - api/src/com/cloud/network/Network.java | 6 + api/src/com/cloud/network/NetworkProfile.java | 7 + api/src/com/cloud/network/NetworkService.java | 21 + .../com/cloud/network/PhysicalNetwork.java | 68 +++ .../PhysicalNetworkServiceProvider.java | 48 ++ client/tomcatconf/commands.properties.in | 16 +- .../src/com/cloud/api/ApiResponseHelper.java | 68 ++- .../configuration/ConfigurationManager.java | 5 +- .../ConfigurationManagerImpl.java | 144 +----- .../DefaultComponentLibrary.java | 4 + server/src/com/cloud/dc/DataCenterVO.java | 26 +- server/src/com/cloud/dc/DataCenterVnetVO.java | 12 +- .../src/com/cloud/dc/dao/DataCenterDao.java | 14 +- .../com/cloud/dc/dao/DataCenterDaoImpl.java | 40 +- .../cloud/dc/dao/DataCenterVnetDaoImpl.java | 43 +- .../cloud/network/ExternalNetworkManager.java | 3 +- .../network/ExternalNetworkManagerImpl.java | 16 +- .../com/cloud/network/NetworkManagerImpl.java | 482 +++++++++++++++++- server/src/com/cloud/network/NetworkVO.java | 31 ++ .../com/cloud/network/PhysicalNetworkVO.java | 207 ++++++++ .../src/com/cloud/network/dao/NetworkDao.java | 4 + .../com/cloud/network/dao/NetworkDaoImpl.java | 31 +- .../cloud/network/dao/PhysicalNetworkDao.java | 28 + .../network/dao/PhysicalNetworkDaoImpl.java | 58 +++ ...PhysicalNetworkIsolationMethodDaoImpl.java | 69 +++ .../dao/PhysicalNetworkIsolationMethodVO.java | 68 +++ .../PhysicalNetworkServiceProviderDao.java | 26 + ...PhysicalNetworkServiceProviderDaoImpl.java | 49 ++ .../dao/PhysicalNetworkServiceProviderVO.java | 96 ++++ .../dao/PhysicalNetworkTagDaoImpl.java | 62 +++ .../network/dao/PhysicalNetworkTagVO.java | 68 +++ .../guru/ExternalGuestNetworkGuru.java | 4 +- .../cloud/network/guru/GuestNetworkGuru.java | 4 +- .../cloud/server/ManagementServerImpl.java | 4 +- server/src/com/cloud/test/DatabaseConfig.java | 28 +- server/src/com/cloud/test/PodZoneConfig.java | 55 +- setup/db/create-schema.sql | 60 ++- setup/db/server-setup.xml | 10 +- 55 files changed, 2885 insertions(+), 266 deletions(-) create mode 100644 api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java create mode 100644 api/src/com/cloud/api/commands/CreatePhysicalNetworkCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java create mode 100644 api/src/com/cloud/api/commands/DeletePhysicalNetworkCmd.java create mode 100644 api/src/com/cloud/api/commands/ListNetworkServiceProvidersCmd.java create mode 100644 api/src/com/cloud/api/commands/ListNetworkServicesCmd.java create mode 100644 api/src/com/cloud/api/commands/ListPhysicalNetworksCmd.java create mode 100644 api/src/com/cloud/api/commands/ListSupportedNetworkServiceProvidersCmd.java create mode 100644 api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java create mode 100644 api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java create mode 100644 api/src/com/cloud/api/response/PhysicalNetworkResponse.java create mode 100644 api/src/com/cloud/network/PhysicalNetwork.java create mode 100644 api/src/com/cloud/network/PhysicalNetworkServiceProvider.java create mode 100644 server/src/com/cloud/network/PhysicalNetworkVO.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkDao.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java create mode 100644 server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 3df3ab46b91..d8fb58579c6 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -277,5 +277,12 @@ public class ApiConstants { public static final String GATEWAY_SERVICE = "gatewayservice"; public static final String SERVICE_PROVIDER_LIST = "serviceproviderlist"; public static final String PROVIDER = "provider"; + public static final String NETWORK_SPEED = "networkspeed"; + public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange"; + public static final String ISOLATION_METHODS = "isolationmethods"; + public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid"; + public static final String DEST_PHYSICAL_NETWORK_ID = "destinationphysicalnetworkid"; + public static final String ENABLED = "enabled"; + public static final String SERVICE_NAME = "servicename"; } diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index 69f4628b84a..45dad8fad8b 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -43,15 +43,18 @@ import com.cloud.api.response.ListResponse; import com.cloud.api.response.LoadBalancerResponse; import com.cloud.api.response.NetworkOfferingResponse; import com.cloud.api.response.NetworkResponse; +import com.cloud.api.response.PhysicalNetworkResponse; import com.cloud.api.response.PodResponse; import com.cloud.api.response.ProjectAccountResponse; import com.cloud.api.response.ProjectInvitationResponse; import com.cloud.api.response.ProjectResponse; +import com.cloud.api.response.ProviderResponse; import com.cloud.api.response.RemoteAccessVpnResponse; import com.cloud.api.response.ResourceCountResponse; import com.cloud.api.response.ResourceLimitResponse; import com.cloud.api.response.SecurityGroupResponse; import com.cloud.api.response.ServiceOfferingResponse; +import com.cloud.api.response.ServiceResponse; import com.cloud.api.response.SnapshotPolicyResponse; import com.cloud.api.response.SnapshotResponse; import com.cloud.api.response.StoragePoolResponse; @@ -79,6 +82,10 @@ import com.cloud.host.Host; import com.cloud.hypervisor.HypervisorCapabilities; import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.router.VirtualRouter; @@ -233,4 +240,12 @@ public interface ResponseGenerator { SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine systemVM); + PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result); + + ServiceResponse createNetworkServiceResponse(Service service); + + ProviderResponse createNetworkServiceProviderResponse(Provider serviceProvider); + + ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result); + } diff --git a/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java new file mode 100644 index 00000000000..fd27e0ca3cc --- /dev/null +++ b/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java @@ -0,0 +1,92 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.ProviderResponse; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.user.Account; + +@Implementation(description="Adds a network serviceProvider to a physical network", responseObject=ProviderResponse.class) +public class AddNetworkServiceProviderCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(AddNetworkServiceProviderCmd.class.getName()); + + private static final String s_name = "addnetworkserviceproviderresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.LONG, required=true, description="the Physical Network ID to add the provider to") + private Long physicalNetworkId; + + @Parameter(name=ApiConstants.DEST_PHYSICAL_NETWORK_ID, type=CommandType.LONG, description="the destination Physical Network ID to bridge to") + private Long destinationPhysicalNetworkId; + + @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="the name for the physical network service provider") + private String name; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public String getProviderName() { + return name; + } + + public Long getDestinationPhysicalNetworkId() { + return destinationPhysicalNetworkId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + PhysicalNetworkServiceProvider result = _networkService.addProviderToPhysicalNetwork(getPhysicalNetworkId(), getProviderName(), getDestinationPhysicalNetworkId()); + if (result != null) { + ProviderResponse response = _responseGenerator.createNetworkServiceProviderResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add service provider to physical network"); + } + } +} diff --git a/api/src/com/cloud/api/commands/CreatePhysicalNetworkCmd.java b/api/src/com/cloud/api/commands/CreatePhysicalNetworkCmd.java new file mode 100644 index 00000000000..47e2b8dc2f3 --- /dev/null +++ b/api/src/com/cloud/api/commands/CreatePhysicalNetworkCmd.java @@ -0,0 +1,121 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.network.PhysicalNetwork; +import com.cloud.user.Account; + +@Implementation(description="Creates a physical network", responseObject=PhysicalNetworkResponse.class) +public class CreatePhysicalNetworkCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(CreatePhysicalNetworkCmd.class.getName()); + + private static final String s_name = "createphysicalnetworkresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="the Zone ID for the physical network") + private Long zoneId; + + @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the physical network") + private String vlan; + + @Parameter(name=ApiConstants.NETWORK_SPEED, type=CommandType.STRING, description="the speed for the physical network[1G/10G]") + private String speed; + + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="domain ID of the account owning a physical network") + private Long domainId; + + @Parameter(name=ApiConstants.BROADCAST_DOMAIN_RANGE, type=CommandType.STRING, description="the broadcast domain range for the physical network[Pod or Zone]") + private String broadcastDomainRange; + + @Parameter(name=ApiConstants.TAGS, type=CommandType.LIST, collectionType=CommandType.STRING, description="Tag the physical network") + private List tags; + + @Parameter(name=ApiConstants.ISOLATION_METHODS, type=CommandType.LIST, collectionType=CommandType.STRING, description="the isolation method for the physical network[VLAN/L3/GRE]") + private List isolationMethods; + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public List getTags() { + return tags; + } + + public Long getZoneId() { + return zoneId; + } + + public String getVlan() { + return vlan; + } + + public Long getDomainId() { + return domainId; + } + + public String getBroadcastDomainRange() { + return broadcastDomainRange; + } + + public List getIsolationMethods() { + return isolationMethods; + } + + public String getNetworkSpeed() { + return speed; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + PhysicalNetwork result = _networkService.createPhysicalNetwork(getZoneId(),getVlan(),getNetworkSpeed(), getIsolationMethods(),getBroadcastDomainRange(),getDomainId(), getTags()); + if (result != null) { + PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create physical network"); + } + } +} diff --git a/api/src/com/cloud/api/commands/CreateZoneCmd.java b/api/src/com/cloud/api/commands/CreateZoneCmd.java index 8363e67723d..67577b8ef00 100755 --- a/api/src/com/cloud/api/commands/CreateZoneCmd.java +++ b/api/src/com/cloud/api/commands/CreateZoneCmd.java @@ -57,9 +57,6 @@ public class CreateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="the name of the Zone") private String zoneName; - @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the Zone") - private String vlan; - @Parameter(name=ApiConstants.DOMAIN, type=CommandType.STRING, description="Network domain name for the networks in the zone") private String domain; @@ -69,9 +66,6 @@ public class CreateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.NETWORK_TYPE, type=CommandType.STRING, required=true, description="network type of the zone, can be Basic or Advanced") private String networkType; - @Parameter(name=ApiConstants.SECURITY_GROUP_EANBLED, type=CommandType.BOOLEAN, description="true if network is security group enabled, false otherwise") - private Boolean securitygroupenabled; - @Parameter(name=ApiConstants.ALLOCATION_STATE, type=CommandType.STRING, description="Allocation state of this Zone for allocation of new resources") private String allocationState; @@ -103,10 +97,6 @@ public class CreateZoneCmd extends BaseCmd { return zoneName; } - public String getVlan() { - return vlan; - } - public String getDomain() { return domain; } @@ -119,13 +109,6 @@ public class CreateZoneCmd extends BaseCmd { return networkType; } - public Boolean isSecurityGroupEnabled() { - if (securitygroupenabled == null) { - return false; - } - return securitygroupenabled; - } - public String getAllocationState() { return allocationState; } diff --git a/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java new file mode 100644 index 00000000000..2de6acac328 --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.user.Account; + +@Implementation(description="Deletes a Network Service Provider.", responseObject=SuccessResponse.class) +public class DeleteNetworkServiceProviderCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DeleteNetworkServiceProviderCmd.class.getName()); + + private static final String s_name = "deletenetworkserviceproviderresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the network service provider") + private Long id; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + boolean result = _networkService.deleteNetworkServiceProvider(getId()); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete network service provider"); + } + } +} diff --git a/api/src/com/cloud/api/commands/DeletePhysicalNetworkCmd.java b/api/src/com/cloud/api/commands/DeletePhysicalNetworkCmd.java new file mode 100644 index 00000000000..4477d279a1e --- /dev/null +++ b/api/src/com/cloud/api/commands/DeletePhysicalNetworkCmd.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.user.Account; + +@Implementation(description="Deletes a Physical Network.", responseObject=SuccessResponse.class) +public class DeletePhysicalNetworkCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DeletePhysicalNetworkCmd.class.getName()); + + private static final String s_name = "deletephysicalnetworkresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the Physical network") + private Long id; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + boolean result = _networkService.deletePhysicalNetwork(getId()); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete physical network"); + } + } +} diff --git a/api/src/com/cloud/api/commands/ListNetworkServiceProvidersCmd.java b/api/src/com/cloud/api/commands/ListNetworkServiceProvidersCmd.java new file mode 100644 index 00000000000..f152566a0ee --- /dev/null +++ b/api/src/com/cloud/api/commands/ListNetworkServiceProvidersCmd.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.ProviderResponse; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.user.Account; + + +@Implementation(description="Lists network serviceproviders for a given physical network.", responseObject=ProviderResponse.class) +public class ListNetworkServiceProvidersCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListNetworkServiceProvidersCmd.class.getName()); + private static final String _name = "listnetworkserviceprovidersresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.LONG, required=true, description="the Physical Network ID to add the provider to") + private Long physicalNetworkId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public void setPhysicalNetworkId(Long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + @Override + public String getCommandName() { + return _name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + List serviceProviders = _networkService.listNetworkServiceProviders(getPhysicalNetworkId()); + ListResponse response = new ListResponse(); + List serviceProvidersResponses = new ArrayList(); + for (PhysicalNetworkServiceProvider serviceProvider : serviceProviders) { + ProviderResponse serviceProviderResponse = _responseGenerator.createNetworkServiceProviderResponse(serviceProvider); + serviceProvidersResponses.add(serviceProviderResponse); + } + + response.setResponses(serviceProvidersResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + + +} diff --git a/api/src/com/cloud/api/commands/ListNetworkServicesCmd.java b/api/src/com/cloud/api/commands/ListNetworkServicesCmd.java new file mode 100644 index 00000000000..aaf260fa861 --- /dev/null +++ b/api/src/com/cloud/api/commands/ListNetworkServicesCmd.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.ServiceResponse; +import com.cloud.network.Network; +import com.cloud.user.Account; + + +@Implementation(description="Lists all network services provided by CloudStack.", responseObject=ServiceResponse.class) +public class ListNetworkServicesCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListNetworkServicesCmd.class.getName()); + private static final String _name = "listnetworkservicesresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + @Override + public String getCommandName() { + return _name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + List services = _networkService.listNetworkServices(); + ListResponse response = new ListResponse(); + List servicesResponses = new ArrayList(); + for (Network.Service service : services) { + ServiceResponse serviceResponse = _responseGenerator.createNetworkServiceResponse(service); + servicesResponses.add(serviceResponse); + } + + response.setResponses(servicesResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } +} diff --git a/api/src/com/cloud/api/commands/ListPhysicalNetworksCmd.java b/api/src/com/cloud/api/commands/ListPhysicalNetworksCmd.java new file mode 100644 index 00000000000..fe5f931fc2b --- /dev/null +++ b/api/src/com/cloud/api/commands/ListPhysicalNetworksCmd.java @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.network.PhysicalNetwork; +import com.cloud.user.Account; + +@Implementation(description="Lists physical networks", responseObject=PhysicalNetworkResponse.class) +public class ListPhysicalNetworksCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListPhysicalNetworksCmd.class.getName()); + + private static final String s_name = "listphysicalnetworksresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, description="list physical network by id") + private Long id; + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the Zone ID for the physical network") + private Long zoneId; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getZoneId() { + return zoneId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + List result = _networkService.searchPhysicalNetworks(getId(),getZoneId(), this.getKeyword(), this.getStartIndex(), this.getPageSizeVal()); + if (result != null) { + ListResponse response = new ListResponse(); + List networkResponses = new ArrayList(); + for (PhysicalNetwork network : result) { + PhysicalNetworkResponse networkResponse = _responseGenerator.createPhysicalNetworkResponse(network); + networkResponses.add(networkResponse); + } + response.setResponses(networkResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to search for physical networks"); + } + } +} diff --git a/api/src/com/cloud/api/commands/ListSupportedNetworkServiceProvidersCmd.java b/api/src/com/cloud/api/commands/ListSupportedNetworkServiceProvidersCmd.java new file mode 100644 index 00000000000..b061997a60d --- /dev/null +++ b/api/src/com/cloud/api/commands/ListSupportedNetworkServiceProvidersCmd.java @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.ProviderResponse; +import com.cloud.network.Network; +import com.cloud.user.Account; + + +@Implementation(description="Lists all network serviceproviders supported by CloudStack.", responseObject=ProviderResponse.class) +public class ListSupportedNetworkServiceProvidersCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListSupportedNetworkServiceProvidersCmd.class.getName()); + private static final String _name = "listsupportednetworkserviceprovidersresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.SERVICE_NAME, type=CommandType.STRING, description="network service name") + private String serviceName; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public String getServiceName() { + return serviceName; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + @Override + public String getCommandName() { + return _name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + List serviceProviders = _networkService.listSupportedNetworkServiceProviders(getServiceName()); + ListResponse response = new ListResponse(); + List serviceProvidersResponses = new ArrayList(); + for (Network.Provider serviceProvider : serviceProviders) { + ProviderResponse serviceProviderResponse = _responseGenerator.createNetworkServiceProviderResponse(serviceProvider); + serviceProvidersResponses.add(serviceProviderResponse); + } + + response.setResponses(serviceProvidersResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } +} diff --git a/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java new file mode 100644 index 00000000000..10f2bed556b --- /dev/null +++ b/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.ProviderResponse; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.user.Account; + +@Implementation(description="Updates a network serviceProvider of a physical network", responseObject=ProviderResponse.class) +public class UpdateNetworkServiceProviderCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(UpdateNetworkServiceProviderCmd.class.getName()); + + private static final String s_name = "updatenetworkserviceproviderresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + @Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, description="true/false enable/disable the physical network service provider") + private Boolean enabled; + + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="network service provider id") + private Long id; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Boolean isEnabled() { + return enabled; + } + + private Long getId() { + return id; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + PhysicalNetworkServiceProvider result = _networkService.updateNetworkServiceProvider(getId(), isEnabled()); + if (result != null) { + ProviderResponse response = _responseGenerator.createNetworkServiceProviderResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add service provider to physical network"); + } + } + + + + + +} diff --git a/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java b/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java new file mode 100644 index 00000000000..5fedbb8e667 --- /dev/null +++ b/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java @@ -0,0 +1,116 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.network.PhysicalNetwork; +import com.cloud.user.Account; + +@Implementation(description="Updates a physical network", responseObject=PhysicalNetworkResponse.class) +public class UpdatePhysicalNetworkCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(UpdatePhysicalNetworkCmd.class.getName()); + + private static final String s_name = "updatephysicalnetworkresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="physical network id") + private Long id; + + @Parameter(name=ApiConstants.NETWORK_SPEED, type=CommandType.STRING, description="the speed for the physical network[1G/10G]") + private String speed; + + @Parameter(name=ApiConstants.TAGS, type=CommandType.LIST, collectionType=CommandType.STRING, description="Tag the physical network") + private List tags; + + @Parameter(name=ApiConstants.ISOLATION_METHODS, type=CommandType.LIST, collectionType=CommandType.STRING, description="the isolation method for the physical network[VLAN/L3/GRE]") + private List isolationMethods; + + @Parameter(name=ApiConstants.STATE, type=CommandType.STRING, description="Enabled/Disabled") + private String state; + + @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the physical network") + private String vlan; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public List getTags() { + return tags; + } + + public List getIsolationMethods() { + return isolationMethods; + } + + public String getNetworkSpeed() { + return speed; + } + + public String getState() { + return state; + } + + public Long getId() { + return id; + } + + public String getVlan() { + return vlan; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getIsolationMethods(), getTags(), getVlan(), getState()); + if (result != null) { + PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create physical network"); + } + } + +} diff --git a/api/src/com/cloud/api/commands/UpdateZoneCmd.java b/api/src/com/cloud/api/commands/UpdateZoneCmd.java index 9c09cd1ceeb..8826d3cb042 100755 --- a/api/src/com/cloud/api/commands/UpdateZoneCmd.java +++ b/api/src/com/cloud/api/commands/UpdateZoneCmd.java @@ -63,9 +63,6 @@ public class UpdateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the name of the Zone") private String zoneName; - @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the Zone") - private String vlan; - @Parameter(name=ApiConstants.IS_PUBLIC, type=CommandType.BOOLEAN, description="updates a private zone to public if set, but not vice-versa") private Boolean isPublic; @@ -116,10 +113,6 @@ public class UpdateZoneCmd extends BaseCmd { return zoneName; } - public String getVlan() { - return vlan; - } - public Boolean isPublic() { return isPublic; } diff --git a/api/src/com/cloud/api/response/PhysicalNetworkResponse.java b/api/src/com/cloud/api/response/PhysicalNetworkResponse.java new file mode 100644 index 00000000000..e61a8348a4c --- /dev/null +++ b/api/src/com/cloud/api/response/PhysicalNetworkResponse.java @@ -0,0 +1,148 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.response; + +import java.util.List; + +import com.cloud.api.ApiConstants; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class PhysicalNetworkResponse extends BaseResponse{ + + @SerializedName(ApiConstants.ID) @Param(description="the id of the physical network") + private Long id; + + @SerializedName(ApiConstants.BROADCAST_DOMAIN_RANGE) @Param(description="Broadcast domain range of the physical network") + private String broadcastDomainRange; + + @SerializedName(ApiConstants.ZONE_ID) @Param(description="zone id of the physical network") + private Long zoneId; + + @SerializedName(ApiConstants.STATE) @Param(description="state of the physical network") + private String state; + + @SerializedName(ApiConstants.VLAN) @Param(description="the vlan of the physical network") + private String vlan; + + @SerializedName(ApiConstants.DOMAIN_ID) @Param(description="the domain id of the physical network owner") + private Long domainId; + + @SerializedName(ApiConstants.TAGS) @Param(description="comma separated tag") + private String tags; + + @SerializedName(ApiConstants.ISOLATION_METHODS) @Param(description="isolation methods") + private String isolationMethods; + + @SerializedName(ApiConstants.NETWORK_SPEED) @Param(description="the speed of the physical network") + private String networkSpeed; + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return this.id; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public Long getZoneId() { + return this.zoneId; + } + + public void setState(String state) { + this.state = state; + } + + public String getState() { + return this.state; + } + + + public void setDomainId(Long domainId) { + this.domainId = domainId; + } + + public Long getDomainId() { + return this.domainId; + } + + public void setVlan(String vlan) { + this.vlan = vlan; + } + + public String getVlan() { + return this.vlan; + } + + + public void setTags(List tags) { + if (tags == null || tags.size() == 0) { + return; + } + + StringBuilder buf = new StringBuilder(); + for (String tag : tags) { + buf.append(tag).append(","); + } + + this.tags = buf.delete(buf.length()-1, buf.length()).toString(); + } + + public String getTags() { + return tags; + } + + public void setBroadcastDomainRange(String broadcastDomainRange) { + this.broadcastDomainRange = broadcastDomainRange; + } + + public String getBroadcastDomainRange() { + return broadcastDomainRange; + } + + public void setNetworkSpeed(String networkSpeed) { + this.networkSpeed = networkSpeed; + } + + public String getNetworkSpeed() { + return networkSpeed; + } + + public void setIsolationMethods(List isolationMethods) { + if (isolationMethods == null || isolationMethods.size() == 0) { + return; + } + + StringBuilder buf = new StringBuilder(); + for (String isolationMethod : isolationMethods) { + buf.append(isolationMethod).append(","); + } + + this.isolationMethods = buf.delete(buf.length()-1, buf.length()).toString(); + } + + public String getIsolationMethods() { + return isolationMethods; + } + +} diff --git a/api/src/com/cloud/api/response/ProviderResponse.java b/api/src/com/cloud/api/response/ProviderResponse.java index a3cdf811aa6..caf9686d0f4 100644 --- a/api/src/com/cloud/api/response/ProviderResponse.java +++ b/api/src/com/cloud/api/response/ProviderResponse.java @@ -17,8 +17,6 @@ */ package com.cloud.api.response; -import java.util.List; - import com.cloud.api.ApiConstants; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; @@ -29,7 +27,53 @@ public class ProviderResponse extends BaseResponse { @SerializedName(ApiConstants.NAME) @Param(description="the provider name") private String name; + @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) @Param(description="the physical network this belongs to") + private Long physicalNetworkId; + + @SerializedName(ApiConstants.DEST_PHYSICAL_NETWORK_ID) @Param(description="the destination physical network") + private Long destinationPhysicalNetworkId; + + @SerializedName(ApiConstants.STATE) @Param(description="state of the network provider") + private String state; + + @SerializedName(ApiConstants.ID) @Param(description="id of the network provider") + private Long id; + + public void setName(String name) { this.name = name; } + + public void setPhysicalNetworkId(long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + + public long getphysicalNetworkId() { + return physicalNetworkId; + } + + public void setDestinationPhysicalNetworkId(long destPhysicalNetworkId) { + this.destinationPhysicalNetworkId = destPhysicalNetworkId; + } + + public long getDestinationPhysicalNetworkId() { + return destinationPhysicalNetworkId; + } + + public void setState(String state) { + this.state = state; + } + + public String getState() { + return this.state; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return this.id; + } + } diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 7f90940855a..8ed3bfa8b09 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -41,7 +41,6 @@ public interface DataCenter extends Grouping { Long getDomainId(); String getDescription(); String getDomain(); - String getVnet(); NetworkType getNetworkType(); String getInternalDns1(); diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 14d333dd7a5..9906d8c190e 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -101,6 +101,10 @@ public interface Network extends ControlledEntity { } return null; } + + public static List listAllServices(){ + return supportedServices; + } } public static class Provider { @@ -265,4 +269,6 @@ public interface Network extends ControlledEntity { Type getType(); boolean getIsShared(); + + long getPhysicalNetworkId(); } diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java index 2360058801c..cef307db5ba 100644 --- a/api/src/com/cloud/network/NetworkProfile.java +++ b/api/src/com/cloud/network/NetworkProfile.java @@ -52,6 +52,7 @@ public class NetworkProfile implements Network { private Network.Type type; private GuestIpType guestIpType; private boolean isShared; + private long physicalNetworkId; public NetworkProfile(Network network) { this.id = network.getId(); @@ -76,6 +77,7 @@ public class NetworkProfile implements Network { this.type = network.getType(); this.guestIpType = network.getGuestType(); this.isShared = network.getIsShared(); + this.physicalNetworkId = network.getPhysicalNetworkId(); } @Override @@ -212,4 +214,9 @@ public class NetworkProfile implements Network { public boolean getIsShared() { return isShared; } + + @Override + public long getPhysicalNetworkId() { + return physicalNetworkId; + } } diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 8cfce0ad783..c72e5a2678b 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -31,6 +31,7 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.NetworkOffering; @@ -88,4 +89,24 @@ public interface NetworkService { Network getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType); Map> listNetworkOfferingServices(long networkOfferingId); + + PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List isolationMethods, String broadcastDomainRange, Long domainId, List tags); + + List searchPhysicalNetworks(Long id, Long zoneId, String keyword, Long startIndex, Long pageSize); + + PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List isolationMethods, List tags, String newVnetRangeString, String state); + + boolean deletePhysicalNetwork(Long id); + + List listNetworkServices(); + + List listSupportedNetworkServiceProviders(String serviceName); + + PhysicalNetworkServiceProvider addProviderToPhysicalNetwork(Long physicalNetworkId, String providerName, Long destinationPhysicalNetworkId); + + List listNetworkServiceProviders(Long physicalNetworkId); + + PhysicalNetworkServiceProvider updateNetworkServiceProvider(Long id, Boolean enabled); + + boolean deleteNetworkServiceProvider(Long id); } diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java new file mode 100644 index 00000000000..f9307f5c1da --- /dev/null +++ b/api/src/com/cloud/network/PhysicalNetwork.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * + */ +package com.cloud.network; + +import java.util.List; + +/** + * This defines the specifics of a physical network present in a data center + * + */ +public interface PhysicalNetwork { + + public enum State { + Disabled, + Enabled; + } + + public enum IsolationMethod { + VLAN, + L3, + GRE; + } + + public enum BroadcastDomainRange { + Pod, + Zone; + } + + long getId(); + + BroadcastDomainRange getBroadcastDomainRange(); + + //TrafficType getTrafficType(); + + long getDataCenterId(); + + State getState(); + + List getTags(); + + List getIsolationMethods(); + + Long getDomainId(); + + String getVnet(); + + String getSpeed(); + +} diff --git a/api/src/com/cloud/network/PhysicalNetworkServiceProvider.java b/api/src/com/cloud/network/PhysicalNetworkServiceProvider.java new file mode 100644 index 00000000000..6eb4458c2fc --- /dev/null +++ b/api/src/com/cloud/network/PhysicalNetworkServiceProvider.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * + */ +package com.cloud.network; + + + +/** + * This defines the specifics of a physical network service provider + * + */ +public interface PhysicalNetworkServiceProvider { + + public enum State { + Disabled, + Enabled; + } + + long getId(); + + State getState(); + + long getPhysicalNetworkId(); + + String getProviderName(); + + long getDestinationPhysicalNetworkId(); + + void setState(State state); +} diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index c9b6485ebc2..45a74b945f5 100755 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -286,4 +286,18 @@ listFirewallRules=com.cloud.api.commands.ListFirewallRulesCmd;15 #### hypervisor capabilities commands updateHypervisorCapabilities=com.cloud.api.commands.UpdateHypervisorCapabilitiesCmd;1 -listHypervisorCapabilities=com.cloud.api.commands.ListHypervisorCapabilitiesCmd;1 +listHypervisorCapabilities=com.cloud.api.commands.ListHypervisorCapabilitiesCmd;1 + +#### Physical Network commands +createPhysicalNetwork=com.cloud.api.commands.CreatePhysicalNetworkCmd;1 +deletePhysicalNetwork=com.cloud.api.commands.DeletePhysicalNetworkCmd;1 +listPhysicalNetworks=com.cloud.api.commands.ListPhysicalNetworksCmd;1 +updatePhysicalNetwork=com.cloud.api.commands.UpdatePhysicalNetworkCmd;1 + +#### Physical Network Service Provider commands +listNetworkServices=com.cloud.api.commands.ListNetworkServicesCmd;1 +listSupportedNetworkServiceProviders=com.cloud.api.commands.ListSupportedNetworkServiceProvidersCmd;1 +addNetworkServiceProvider=com.cloud.api.commands.AddNetworkServiceProviderCmd;1 +deleteNetworkServiceProvider=com.cloud.api.commands.DeleteNetworkServiceProviderCmd;1 +listNetworkServiceProviders=com.cloud.api.commands.ListNetworkServiceProvidersCmd;1 +updateNetworkServiceProvider=com.cloud.api.commands.UpdateNetworkServiceProviderCmd;1 diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index d7b0f62e485..3dbbbc56d38 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -62,6 +62,7 @@ import com.cloud.api.response.LoadBalancerResponse; import com.cloud.api.response.NetworkOfferingResponse; import com.cloud.api.response.NetworkResponse; import com.cloud.api.response.NicResponse; +import com.cloud.api.response.PhysicalNetworkResponse; import com.cloud.api.response.PodResponse; import com.cloud.api.response.ProjectAccountResponse; import com.cloud.api.response.ProjectInvitationResponse; @@ -116,9 +117,12 @@ import com.cloud.network.IPAddressVO; import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.router.VirtualRouter; @@ -786,7 +790,6 @@ public class ApiResponseHelper implements ResponseGenerator { zoneResponse.setDns2(dataCenter.getDns2()); zoneResponse.setInternalDns1(dataCenter.getInternalDns1()); zoneResponse.setInternalDns2(dataCenter.getInternalDns2()); - zoneResponse.setVlan(dataCenter.getVnet()); zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr()); } @@ -2529,6 +2532,69 @@ public class ApiResponseHelper implements ResponseGenerator { vmResponse.setRole(router.getRole().toString()); } } + vmResponse.setObjectName("systemvminstance"); return vmResponse; } + + @Override + public PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result) { + PhysicalNetworkResponse response = new PhysicalNetworkResponse(); + + response.setZoneId(result.getDataCenterId()); + response.setNetworkSpeed(result.getSpeed()); + response.setVlan(result.getVnet()); + response.setDomainId(result.getDomainId()); + response.setId(result.getId()); + if(result.getBroadcastDomainRange() != null){ + response.setBroadcastDomainRange(result.getBroadcastDomainRange().toString()); + } + response.setIsolationMethods(result.getIsolationMethods()); + response.setTags(result.getTags()); + if(result.getState() != null){ + response.setState(result.getState().toString()); + } + response.setObjectName("physicalnetwork"); + return response; + } + + @Override + public ServiceResponse createNetworkServiceResponse(Service service){ + ServiceResponse response = new ServiceResponse(); + response.setName(service.getName()); + + // set list of capabilities required for the service + List capabilityResponses = new ArrayList(); + Capability[] capabilities = service.getCapabilities(); + for(Capability cap : capabilities){ + CapabilityResponse capabilityResponse = new CapabilityResponse(); + capabilityResponse.setName(cap.getName()); + capabilityResponse.setObjectName("capability"); + capabilityResponses.add(capabilityResponse); + } + response.setCapabilities(capabilityResponses); + + response.setObjectName("networkservice"); + return response; + + } + + @Override + public ProviderResponse createNetworkServiceProviderResponse(Provider serviceProvider) { + ProviderResponse response = new ProviderResponse(); + response.setName(serviceProvider.getName()); + response.setObjectName("networkserviceprovider"); + return response; + } + + @Override + public ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result){ + ProviderResponse response = new ProviderResponse(); + response.setId(result.getId()); + response.setName(result.getProviderName()); + response.setPhysicalNetworkId(result.getPhysicalNetworkId()); + response.setDestinationPhysicalNetworkId(result.getDestinationPhysicalNetworkId()); + response.setState(result.getState().toString()); + response.setObjectName("networkserviceprovider"); + return response; + } } diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index be55e52abbf..c951493f1d6 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -113,7 +113,6 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @param dns2 * @param internalDns1 * @param internalDns2 - * @param vnetRange * @param guestCidr * @param zoneType * @param allocationState @@ -122,7 +121,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @throws * @throws */ - DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String vnetRange, String guestCidr, String domain, Long domainId, NetworkType zoneType, boolean isSecurityGroupEnabled, String allocationState, String networkDomain); + DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType, String allocationState, String networkDomain); /** * Deletes a VLAN from the database, along with all of its IP addresses. Will not delete VLANs that have allocated IP addresses. @@ -190,7 +189,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager { Vlan createVlanAndPublicIpRange(Long userId, Long zoneId, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, boolean forVirtualNetwork, String vlanId, Account account, Long networkId) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; - void createDefaultNetworks(long zoneId, boolean isSecurityGroupEnabled) throws ConcurrentOperationException; + void createDefaultNetworks(long zoneId) throws ConcurrentOperationException; HostPodVO getPod(long id); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index e41b95a7cc0..691ecf367b8 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -129,7 +129,6 @@ import com.cloud.user.UserContext; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; @@ -962,10 +961,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura return !vmInstances.isEmpty(); } - private boolean zoneHasAllocatedVnets(long zoneId) { - return !_zoneDao.listAllocatedVnets(zoneId).isEmpty(); - } - @DB protected void checkIfZoneIsDeletable(long zoneId) { List> tablesToCheck = new ArrayList>(); @@ -1185,7 +1180,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String dns2 = cmd.getDns2(); String internalDns1 = cmd.getInternalDns1(); String internalDns2 = cmd.getInternalDns2(); - String newVnetRangeString = cmd.getVlan(); String guestCidr = cmd.getGuestCidrAddress(); List dnsSearchOrder = cmd.getDnsSearchOrder(); Boolean isPublic = cmd.isPublic(); @@ -1234,15 +1228,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura zoneName = zone.getName(); } - // if zone is of Basic type, don't allow to add vnet range and cidr - if (zone.getNetworkType() == NetworkType.Basic) { - if (newVnetRangeString != null) { - throw new InvalidParameterValueException("Can't add vnet range for the zone that supports " + zone.getNetworkType() + " network"); - } else if (guestCidr != null) { - throw new InvalidParameterValueException("Can't add cidr for the zone that supports " + zone.getNetworkType() + " network"); - } - } - if ((guestCidr != null) && !NetUtils.validateGuestCidr(guestCidr)) { throw new InvalidParameterValueException("Please enter a valid guest cidr"); } @@ -1252,63 +1237,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("A zone with ID: " + zoneId + " does not exist."); } - // Vnet range can be extended only - boolean replaceVnet = false; - ArrayList> vnetsToAdd = new ArrayList>(2); - - if (newVnetRangeString != null) { - Integer newStartVnet = 0; - Integer newEndVnet = 0; - String[] newVnetRange = newVnetRangeString.split("-"); - - if (newVnetRange.length < 2) { - throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); - } - - if (newVnetRange[0] == null || newVnetRange[1] == null) { - throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); - } - - try { - newStartVnet = Integer.parseInt(newVnetRange[0]); - newEndVnet = Integer.parseInt(newVnetRange[1]); - } catch (NumberFormatException e) { - s_logger.warn("Unable to parse vnet range:", e); - throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); - } - - if (newStartVnet < 0 || newEndVnet > 4096) { - throw new InvalidParameterValueException("Vnet range has to be between 0-4096"); - } - - if (newStartVnet > newEndVnet) { - throw new InvalidParameterValueException("Vnet range has to be between 0-4096 and start range should be lesser than or equal to stop range"); - } - - if (zoneHasAllocatedVnets(zoneId)) { - String[] existingRange = zone.getVnet().split("-"); - int existingStartVnet = Integer.parseInt(existingRange[0]); - int existingEndVnet = Integer.parseInt(existingRange[1]); - - //check if vnet is being extended - if (!(newStartVnet.intValue() <= existingStartVnet && newEndVnet.intValue() >= existingEndVnet)) { - throw new InvalidParameterValueException("Can's shrink existing vnet range as it the range has vnets allocated. Only extending existing vnet is supported"); - } - - if (newStartVnet < existingStartVnet) { - vnetsToAdd.add(new Pair(newStartVnet, existingStartVnet - 1)); - } - - if (newEndVnet > existingEndVnet) { - vnetsToAdd.add(new Pair(existingEndVnet + 1, newEndVnet)); - } - - } else { - vnetsToAdd.add(new Pair(newStartVnet, newEndVnet)); - replaceVnet = true; - } - } - String oldZoneName = zone.getName(); if (zoneName == null) { @@ -1362,10 +1290,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura zone.setGuestNetworkCidr(guestCidr); zone.setDomain(networkDomain); - if (newVnetRangeString != null) { - zone.setVnet(newVnetRangeString); - } - // update a private zone to public; not vice versa if (isPublic != null && isPublic) { zone.setDomainId(null); @@ -1396,44 +1320,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("Failed to edit zone. Please contact Cloud Support."); } - if (replaceVnet) { - s_logger.debug("Deleting existing vnet range for the zone id=" + zoneId + " as a part of updateZone call"); - _zoneDao.deleteVnet(zoneId); - } - - for (Pair vnetToAdd : vnetsToAdd) { - s_logger.debug("Adding vnet range " + vnetToAdd.first() + "-" + vnetToAdd.second() + " for the zone id=" + zoneId + " as a part of updateZone call"); - _zoneDao.addVnet(zone.getId(), vnetToAdd.first(), vnetToAdd.second()); - } - txn.commit(); return zone; } @Override @DB - public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String vnetRange, String guestCidr, String domain, Long domainId, - NetworkType zoneType, boolean isSecurityGroupEnabled, String allocationStateStr, String networkDomain) { - int vnetStart = 0; - int vnetEnd = 0; - if (vnetRange != null) { - String[] tokens = vnetRange.split("-"); - try { - vnetStart = Integer.parseInt(tokens[0]); - if (tokens.length == 1) { - vnetEnd = vnetStart; - } else { - vnetEnd = Integer.parseInt(tokens[1]); - } - } catch (NumberFormatException e) { - throw new InvalidParameterValueException("Please specify valid integers for the vlan range."); - } - - if ((vnetStart > vnetEnd) || (vnetStart < 0) || (vnetEnd > 4096)) { - s_logger.warn("Invalid vnet range: start range:" + vnetStart + " end range:" + vnetEnd); - throw new InvalidParameterValueException("Vnet range should be between 0-4096 and start range should be lesser than or equal to end range"); - } - } + public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, + NetworkType zoneType, String allocationStateStr, String networkDomain) { // checking the following params outside checkzoneparams method as we do not use these params for updatezone // hence the method below is generic to check for common params @@ -1458,20 +1352,15 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura try { txn.start(); // Create the new zone in the database - DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr, domain, domainId, zoneType, isSecurityGroupEnabled, zoneToken, networkDomain); + DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zone.setAllocationState(allocationState); } zone = _zoneDao.persist(zone); - // Add vnet entries for the new zone if zone type is Advanced - if (vnetRange != null) { - _zoneDao.addVnet(zone.getId(), vnetStart, vnetEnd); - } - // Create deafult networks - createDefaultNetworks(zone.getId(), isSecurityGroupEnabled); + createDefaultNetworks(zone.getId()); txn.commit(); return zone; } catch (Exception ex) { @@ -1484,7 +1373,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } @Override - public void createDefaultNetworks(long zoneId, boolean isSecurityGroupEnabled) throws ConcurrentOperationException { + public void createDefaultNetworks(long zoneId) throws ConcurrentOperationException { DataCenterVO zone = _zoneDao.findById(zoneId); String networkDomain = null; // Create public, management, control and storage networks as a part of the zone creation @@ -1509,7 +1398,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } else { continue; } - } else if (offering.getTrafficType() == TrafficType.Guest) { + } /*else if (offering.getTrafficType() == TrafficType.Guest) { if (zone.getNetworkType() == NetworkType.Basic) { isNetworkDefault = true; broadcastDomainType = BroadcastDomainType.Native; @@ -1522,7 +1411,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } networkDomain = "cs" + Long.toHexString(Account.ACCOUNT_ID_SYSTEM) + _networkMgr.getGlobalGuestDomainSuffix(); - } + }*/ userNetwork.setBroadcastDomainType(broadcastDomainType); userNetwork.setNetworkDomain(networkDomain); _networkMgr.setupNetwork(systemAccount, offering, userNetwork, plan, null, null, isNetworkDefault, false, null, null, true); @@ -1539,7 +1428,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String dns2 = cmd.getDns2(); String internalDns1 = cmd.getInternalDns1(); String internalDns2 = cmd.getInternalDns2(); - String vnetRange = cmd.getVlan(); String guestCidr = cmd.getGuestCidrAddress(); Long domainId = cmd.getDomainId(); String type = cmd.getNetworkType(); @@ -1557,16 +1445,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura isBasic = true; } - Boolean securityGroupEnabled = cmd.isSecurityGroupEnabled(); - NetworkType zoneType = isBasic ? NetworkType.Basic : NetworkType.Advanced; - // Guest cidr is required for Advanced zone creation; error out when the parameter specified for Basic zone + /*Guest cidr is required for Advanced zone creation; error out when the parameter specified for Basic zone if (zoneType == NetworkType.Advanced && guestCidr == null && !securityGroupEnabled) { throw new InvalidParameterValueException("guestCidrAddress parameter is required for Advanced zone creation"); } else if (zoneType == NetworkType.Basic && guestCidr != null) { throw new InvalidParameterValueException("guestCidrAddress parameter is not supported for Basic zone"); - } + }*/ DomainVO domainVO = null; @@ -1578,17 +1464,16 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura domainVO = _domainDao.findById(domainId); } - // Verify zone type + /* Verify zone type if (zoneType == NetworkType.Basic && vnetRange != null) { vnetRange = null; } if (zoneType == NetworkType.Basic) { securityGroupEnabled = true; - } + }*/ - return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, securityGroupEnabled, - allocationState, networkDomain); + return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, networkDomain); } @Override @@ -2149,10 +2034,11 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Only Direct Untagged and Virtual networks are supported in the zone " + zone.getId() + " of type " + zone.getNetworkType()); } - // don't allow to create a virtual vlan when zone's vnet is NULL in Advanced zone + //TODO + /* don't allow to create a virtual vlan when zone's vnet is NULL in Advanced zone if ((zone.getNetworkType() == NetworkType.Advanced && zone.getVnet() == null) && forVirtualNetwork) { throw new InvalidParameterValueException("Can't add virtual network to the zone id=" + zone.getId() + " as zone doesn't have guest vlan configured"); - } + }*/ VlanType vlanType = forVirtualNetwork ? VlanType.VirtualNetwork : VlanType.DirectAttached; diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 598071804f6..1806dfebd5d 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -80,6 +80,8 @@ import com.cloud.network.dao.LoadBalancerVMMapDaoImpl; import com.cloud.network.dao.NetworkDaoImpl; import com.cloud.network.dao.NetworkDomainDaoImpl; import com.cloud.network.dao.NetworkRuleConfigDaoImpl; +import com.cloud.network.dao.PhysicalNetworkDaoImpl; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl; import com.cloud.network.dao.RemoteAccessVpnDaoImpl; import com.cloud.network.dao.VpnUserDaoImpl; import com.cloud.network.firewall.FirewallManagerImpl; @@ -285,6 +287,8 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com info = addDao("HypervisorCapabilitiesDao",HypervisorCapabilitiesDaoImpl.class); info.addParameter("cache.size", "100"); info.addParameter("cache.time.to.live", "600"); + addDao("PhysicalNetworkDao", PhysicalNetworkDaoImpl.class); + addDao("PhysicalNetworkServiceProviderDao", PhysicalNetworkServiceProviderDaoImpl.class); } @Override diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/server/src/com/cloud/dc/DataCenterVO.java index d8900b9460d..45b9491cd84 100644 --- a/server/src/com/cloud/dc/DataCenterVO.java +++ b/server/src/com/cloud/dc/DataCenterVO.java @@ -67,9 +67,6 @@ public class DataCenterVO implements DataCenter { @Column(name="router_mac_address", updatable = false, nullable=false) private String routerMacAddress = "02:00:00:00:00:01"; - @Column(name="vnet") - private String vnet = null; - @Column(name="guest_network_cidr") private String guestNetworkCidr = null; @@ -104,9 +101,6 @@ public class DataCenterVO implements DataCenter { @Column(name="firewall_provider") private String firewallProvider; - @Column(name="is_security_group_enabled") - boolean securityGroupEnabled; - @Column(name="mac_address", updatable = false, nullable=false) @TableGenerator(name="mac_address_sq", table="data_center", pkColumnName="id", valueColumnName="mac_address", allocationSize=1) private long macAddress = 1; @@ -172,26 +166,24 @@ public class DataCenterVO implements DataCenter { this.firewallProvider = firewallProvider; } - public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String vnet, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, vnet, guestCidr, domain, domainId, zoneType, false, zoneToken, domainSuffix); + public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; } - public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String vnet, String guestCidr, String domain, Long domainId, NetworkType zoneType, boolean securityGroupEnabled, String zoneToken, String domainSuffix) { + public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { this.name = name; this.description = description; this.dns1 = dns1; this.dns2 = dns2; this.internalDns1 = dns3; this.internalDns2 = dns4; - this.vnet = vnet; this.guestNetworkCidr = guestCidr; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; this.allocationState = Grouping.AllocationState.Enabled; - this.securityGroupEnabled = securityGroupEnabled; if (zoneType == NetworkType.Advanced) { loadBalancerProvider = Provider.VirtualRouter.getName(); @@ -248,20 +240,11 @@ public class DataCenterVO implements DataCenter { return routerMacAddress; } - public void setVnet(String vnet) { - this.vnet = vnet; - } - @Override public String getDns1() { return dns1; } - @Override - public String getVnet() { - return vnet; - } - @Override public String getDns2() { return dns2; @@ -345,11 +328,10 @@ public class DataCenterVO implements DataCenter { @Override public boolean isSecurityGroupEnabled() { - return securityGroupEnabled; + return false; } public void setSecurityGroupEnabled(boolean enabled) { - this.securityGroupEnabled = enabled; } @Override diff --git a/server/src/com/cloud/dc/DataCenterVnetVO.java b/server/src/com/cloud/dc/DataCenterVnetVO.java index 6b926f5baf7..8a8db549037 100755 --- a/server/src/com/cloud/dc/DataCenterVnetVO.java +++ b/server/src/com/cloud/dc/DataCenterVnetVO.java @@ -43,7 +43,10 @@ public class DataCenterVnetVO { @Column(name="vnet", updatable=false, nullable=false) protected String vnet; - + + @Column(name="physical_network_id", updatable=false, nullable=false) + protected long physicalNetworkId; + @Column(name="data_center_id", updatable=false, nullable=false) protected long dataCenterId; @@ -61,9 +64,10 @@ public class DataCenterVnetVO { this.takenAt = taken; } - public DataCenterVnetVO(String vnet, long dcId) { + public DataCenterVnetVO(String vnet, long dcId, long physicalNetworkId) { this.vnet = vnet; this.dataCenterId = dcId; + this.physicalNetworkId = physicalNetworkId; this.takenAt = null; } @@ -94,6 +98,10 @@ public class DataCenterVnetVO { public long getDataCenterId() { return dataCenterId; } + + public long getPhysicalNetworkId() { + return physicalNetworkId; + } protected DataCenterVnetVO() { } diff --git a/server/src/com/cloud/dc/dao/DataCenterDao.java b/server/src/com/cloud/dc/dao/DataCenterDao.java index ec8588dfbbf..c5bed6aaa80 100644 --- a/server/src/com/cloud/dc/dao/DataCenterDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterDao.java @@ -36,9 +36,9 @@ public interface DataCenterDao extends GenericDao { String[] getNextAvailableMacAddressPair(long id, long mask); Pair allocatePrivateIpAddress(long id, long podId, long instanceId, String reservationId); String allocateLinkLocalIpAddress(long id, long podId, long instanceId, String reservationId); - String allocateVnet(long dcId, long accountId, String reservationId); + String allocateVnet(long dcId, long physicalNetworkId, long accountId, String reservationId); - void releaseVnet(String vnet, long dcId, long accountId, String reservationId); + void releaseVnet(String vnet, long dcId, long physicalNetworkId, long accountId, String reservationId); void releasePrivateIpAddress(String ipAddress, long dcId, Long instanceId); void releasePrivateIpAddress(long nicId, String reservationId); void releaseLinkLocalIpAddress(String ipAddress, long dcId, Long instanceId); @@ -52,11 +52,7 @@ public interface DataCenterDao extends GenericDao { List findVnet(long dcId, String vnet); - void addVnet(long dcId, int start, int end); - void deleteVnet(long dcId); - - List listAllocatedVnets(long dcId); String allocatePodVlan(long podId, long accountId); @@ -66,8 +62,6 @@ public interface DataCenterDao extends GenericDao { List findChildZones(Object[] ids); - List listSecurityGroupEnabledZones(); - void loadDetails(DataCenterVO zone); void saveDetails(DataCenterVO zone); @@ -75,4 +69,8 @@ public interface DataCenterDao extends GenericDao { List listEnabledZones(); DataCenterVO findByToken(String zoneToken); DataCenterVO findByTokenOrIdOrName(String tokenIdOrName); + + void addVnet(long dcId, long physicalNetworkId, int start, int end); + void deleteVnet(long dcId, long physicalNetworkId); + List listAllocatedVnets(long dcId, long physicalNetworkId); } diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java index 1cca111a85c..1e6cec93d89 100644 --- a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -32,7 +32,6 @@ import com.cloud.dc.DataCenterIpAddressVO; import com.cloud.dc.DataCenterLinkLocalIpAddressVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVnetVO; -import com.cloud.dc.HostPodVO; import com.cloud.dc.PodVlanVO; import com.cloud.org.Grouping; import com.cloud.utils.NumbersUtil; @@ -61,7 +60,6 @@ public class DataCenterDaoImpl extends GenericDaoBase implem protected SearchBuilder ListZonesByDomainIdSearch; protected SearchBuilder PublicZonesSearch; protected SearchBuilder ChildZonesSearch; - protected SearchBuilder securityGroupSearch; protected SearchBuilder DisabledZonesSearch; protected SearchBuilder TokenSearch; @@ -112,15 +110,8 @@ public class DataCenterDaoImpl extends GenericDaoBase implem } @Override - public List listSecurityGroupEnabledZones() { - SearchCriteria sc = securityGroupSearch.create(); - sc.setParameters("isSgEnabled", true); - return listBy(sc); - } - - @Override - public void releaseVnet(String vnet, long dcId, long accountId, String reservationId) { - _vnetAllocDao.release(vnet, dcId, accountId, reservationId); + public void releaseVnet(String vnet, long dcId, long physicalNetworkId, long accountId, String reservationId) { + _vnetAllocDao.release(vnet, dcId, physicalNetworkId, accountId, reservationId); } @Override @@ -159,8 +150,8 @@ public class DataCenterDaoImpl extends GenericDaoBase implem } @Override - public String allocateVnet(long dataCenterId, long accountId, String reservationId) { - DataCenterVnetVO vo = _vnetAllocDao.take(dataCenterId, accountId, reservationId); + public String allocateVnet(long dataCenterId, long physicalNetworkId, long accountId, String reservationId) { + DataCenterVnetVO vo = _vnetAllocDao.take(dataCenterId, physicalNetworkId, accountId, reservationId); if (vo == null) { return null; } @@ -214,21 +205,28 @@ public class DataCenterDaoImpl extends GenericDaoBase implem return vo.getIpAddress(); } - @Override - public void addVnet(long dcId, int start, int end) { - _vnetAllocDao.add(dcId, start, end); - } @Override public void deleteVnet(long dcId) { _vnetAllocDao.delete(dcId); } + @Override - public List listAllocatedVnets(long dcId) { - return _vnetAllocDao.listAllocatedVnets(dcId); + public void addVnet(long dcId, long physicalNetworkId, int start, int end) { + _vnetAllocDao.add(dcId, physicalNetworkId, start, end); } + @Override + public void deleteVnet(long dcId, long physicalNetworkId) { + _vnetAllocDao.delete(dcId, physicalNetworkId); + } + + @Override + public List listAllocatedVnets(long dcId, long physicalNetworkId) { + return _vnetAllocDao.listAllocatedVnets(dcId, physicalNetworkId); + } + @Override public void addPrivateIpAddress(long dcId,long podId, String start, String end) { _ipAllocDao.addIpRange(dcId, podId, start, end); @@ -276,10 +274,6 @@ public class DataCenterDaoImpl extends GenericDaoBase implem ChildZonesSearch.and("domainid", ChildZonesSearch.entity().getDomainId(), SearchCriteria.Op.IN); ChildZonesSearch.done(); - securityGroupSearch = createSearchBuilder(); - securityGroupSearch.and("isSgEnabled", securityGroupSearch.entity().isSecurityGroupEnabled(), SearchCriteria.Op.EQ); - securityGroupSearch.done(); - DisabledZonesSearch = createSearchBuilder(); DisabledZonesSearch.and("allocationState", DisabledZonesSearch.entity().getAllocationState(), SearchCriteria.Op.EQ); DisabledZonesSearch.done(); diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index efd1248b5f8..0c833a8a9c6 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -33,7 +33,7 @@ import com.cloud.utils.exception.CloudRuntimeException; /** * DataCenterVnetDaoImpl maintains the one-to-many relationship between - * data center and the vnet that appears within its network. + * data center/physical_network and the vnet that appears within the physical network. */ @DB(txn=false) public class DataCenterVnetDaoImpl extends GenericDaoBase implements GenericDao { @@ -47,7 +47,14 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase listAllocatedVnets(long dcId, long physicalNetworkId) { + SearchCriteria sc = DcSearchAllocated.create(); + sc.setParameters("dc", dcId); + sc.setParameters("physicalNetworkId", physicalNetworkId); + return listBy(sc); + } + public List findVnet(long dcId, String vnet) { SearchCriteria sc = VnetDcSearch.create();; sc.setParameters("dc", dcId); @@ -55,9 +62,18 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase findVnet(long dcId, long physicalNetworkId, String vnet) { + SearchCriteria sc = VnetDcSearch.create(); + sc.setParameters("dc", dcId); + sc.setParameters("physicalNetworkId", physicalNetworkId); + sc.setParameters("vnet", vnet); + + return listBy(sc); + } + @DB - public void add(long dcId, int start, int end) { - String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id) VALUES ( ?, ?)"; + public void add(long dcId, long physicalNetworkId, int start, int end) { + String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)"; Transaction txn = Transaction.currentTxn(); try { @@ -66,6 +82,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = VnetDcSearch.create(); sc.setParameters("dc", dcId); + remove(sc); + } + + public void delete(long dcId, long physicalNetworkId) { + SearchCriteria sc = VnetDcSearch.create(); + sc.setParameters("dc", dcId); + sc.setParameters("physicalNetworkId", physicalNetworkId); remove(sc); } @DB - public DataCenterVnetVO take(long dcId, long accountId, String reservationId) { + public DataCenterVnetVO take(long dcId, long physicalNetworkId, long accountId, String reservationId) { SearchCriteria sc = FreeVnetSearch.create(); sc.setParameters("dc", dcId); + sc.setParameters("physicalNetworkId", physicalNetworkId); Date now = new Date(); Transaction txn = Transaction.currentTxn(); txn.start(); @@ -102,10 +127,11 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = VnetDcSearchAllocated.create(); sc.setParameters("vnet", vnet); sc.setParameters("dc", dcId); + sc.setParameters("physicalNetworkId", physicalNetworkId); sc.setParameters("account", accountId); sc.setParameters("reservation", reservationId); @@ -124,25 +150,30 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase _systemNetworks = new HashMap(5); @@ -3389,4 +3398,475 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return true; } + + @Override + @DB + public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List isolationMethods, String broadcastDomainRangeStr, Long domainId, List tags) { + // Check if zone exists + if (zoneId == null) { + throw new InvalidParameterValueException("Please specify a valid zone."); + } + + DataCenterVO zone = _dcDao.findById(zoneId); + if (zone == null) { + throw new InvalidParameterValueException("Please specify a valid zone."); + } + + if (tags != null && tags.size() > 1) { + throw new InvalidParameterException("Only one tag can be specified for a physical network at this time"); + } + + if (isolationMethods != null && isolationMethods.size() > 1) { + throw new InvalidParameterException("Only one isolationMethod can be specified for a physical network at this time"); + } + + int vnetStart = 0; + int vnetEnd = 0; + if (vnetRange != null) { + String[] tokens = vnetRange.split("-"); + try { + vnetStart = Integer.parseInt(tokens[0]); + if (tokens.length == 1) { + vnetEnd = vnetStart; + } else { + vnetEnd = Integer.parseInt(tokens[1]); + } + } catch (NumberFormatException e) { + throw new InvalidParameterValueException("Please specify valid integers for the vlan range."); + } + + if ((vnetStart > vnetEnd) || (vnetStart < 0) || (vnetEnd > 4096)) { + s_logger.warn("Invalid vnet range: start range:" + vnetStart + " end range:" + vnetEnd); + throw new InvalidParameterValueException("Vnet range should be between 0-4096 and start range should be lesser than or equal to end range"); + } + } + + BroadcastDomainRange broadcastDomainRange = null; + if (broadcastDomainRangeStr != null && !broadcastDomainRangeStr.isEmpty()) { + try { + broadcastDomainRange = PhysicalNetwork.BroadcastDomainRange.valueOf(broadcastDomainRangeStr); + } catch (IllegalArgumentException ex) { + throw new InvalidParameterValueException("Unable to resolve broadcastDomainRange '" + broadcastDomainRangeStr + "' to a supported value {Pod or Zone}"); + } + } + + + Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + // Create the new physical network in the database + PhysicalNetworkVO pNetwork = new PhysicalNetworkVO(zoneId, vnetRange, networkSpeed, domainId, broadcastDomainRange); + pNetwork.setTags(tags); + pNetwork.setIsolationMethods(isolationMethods); + + pNetwork = _physicalNetworkDao.persist(pNetwork); + + // Add vnet entries for the new zone if zone type is Advanced + if (vnetRange != null) { + _dcDao.addVnet(zone.getId(), pNetwork.getId(), vnetStart, vnetEnd); + } + + txn.commit(); + return pNetwork; + } catch (Exception ex) { + txn.rollback(); + s_logger.warn("Exception: ", ex); + throw new CloudRuntimeException("Fail to create a physical network"); + } finally { + txn.close(); + } + } + + @Override + public List searchPhysicalNetworks(Long id, Long zoneId, String keyword, Long startIndex, Long pageSize){ + Filter searchFilter = new Filter(PhysicalNetworkVO.class, "id", Boolean.TRUE, startIndex, pageSize); + SearchCriteria sc = _physicalNetworkDao.createSearchCriteria(); + + if (id != null) { + sc.addAnd("id", SearchCriteria.Op.EQ, id); + } + + if (zoneId != null) { + sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); + } + return _physicalNetworkDao.search(sc, searchFilter); + } + + @Override + @DB + public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List isolationMethods, List tags, String newVnetRangeString, String state) { + + // verify input parameters + PhysicalNetworkVO network = _physicalNetworkDao.findById(id); + if (network == null) { + throw new InvalidParameterValueException("Network id=" + id + "doesn't exist in the system"); + } + + if (tags != null && tags.size() > 1) { + throw new InvalidParameterException("Unable to support more than one tag on network yet"); + } + + if (isolationMethods != null && isolationMethods.size() > 1) { + throw new InvalidParameterException("Only one isolationMethod can be specified for a physical network at this time"); + } + + PhysicalNetwork.State networkState = null; + if (state != null && !state.isEmpty()) { + try { + networkState = PhysicalNetwork.State.valueOf(state); + } catch (IllegalArgumentException ex) { + throw new InvalidParameterValueException("Unable to resolve state '" + state + "' to a supported value {Enabled or Disabled}"); + } + } + + if(state != null){ + network.setState(networkState); + } + + if (tags != null) { + network.setTags(tags); + } + + if (isolationMethods != null) { + for(String isMethod : isolationMethods){ + PhysicalNetwork.IsolationMethod isolationMethodVal = null; + if (isMethod != null && !isMethod.isEmpty()) { + try { + isolationMethodVal = PhysicalNetwork.IsolationMethod.valueOf(isMethod); + } catch (IllegalArgumentException ex) { + throw new InvalidParameterValueException("Unable to resolve IsolationMethod '" + isMethod + "' to a supported value {VLAN or L3 or GRE}"); + } + } + } + + network.setIsolationMethods(isolationMethods); + } + + if(networkSpeed != null){ + network.setSpeed(networkSpeed); + } + + // Vnet range can be extended only + boolean replaceVnet = false; + ArrayList> vnetsToAdd = new ArrayList>(2); + + if (newVnetRangeString != null) { + Integer newStartVnet = 0; + Integer newEndVnet = 0; + String[] newVnetRange = newVnetRangeString.split("-"); + + if (newVnetRange.length < 2) { + throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); + } + + if (newVnetRange[0] == null || newVnetRange[1] == null) { + throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); + } + + try { + newStartVnet = Integer.parseInt(newVnetRange[0]); + newEndVnet = Integer.parseInt(newVnetRange[1]); + } catch (NumberFormatException e) { + s_logger.warn("Unable to parse vnet range:", e); + throw new InvalidParameterValueException("Please provide valid vnet range between 0-4096"); + } + + if (newStartVnet < 0 || newEndVnet > 4096) { + throw new InvalidParameterValueException("Vnet range has to be between 0-4096"); + } + + if (newStartVnet > newEndVnet) { + throw new InvalidParameterValueException("Vnet range has to be between 0-4096 and start range should be lesser than or equal to stop range"); + } + + if (physicalNetworkHasAllocatedVnets(network.getDataCenterId(), network.getId())) { + String[] existingRange = network.getVnet().split("-"); + int existingStartVnet = Integer.parseInt(existingRange[0]); + int existingEndVnet = Integer.parseInt(existingRange[1]); + + //check if vnet is being extended + if (!(newStartVnet.intValue() > existingStartVnet && newEndVnet.intValue() < existingEndVnet)) { + throw new InvalidParameterValueException("Can's shrink existing vnet range as it the range has vnets allocated. Only extending existing vnet is supported"); + } + + if (newStartVnet < existingStartVnet) { + vnetsToAdd.add(new Pair(newStartVnet, existingStartVnet - 1)); + } + + if (newEndVnet > existingEndVnet) { + vnetsToAdd.add(new Pair(existingEndVnet + 1, newEndVnet)); + } + + } else { + vnetsToAdd.add(new Pair(newStartVnet, newEndVnet)); + replaceVnet = true; + } + } + + if (newVnetRangeString != null) { + network.setVnet(newVnetRangeString); + } + + + _physicalNetworkDao.update(id, network); + + if (replaceVnet) { + s_logger.debug("Deleting existing vnet range for the physicalNetwork id= "+id +" and zone id=" + network.getDataCenterId() + " as a part of updatePhysicalNetwork call"); + _dcDao.deleteVnet(network.getDataCenterId(), network.getId()); + } + + for (Pair vnetToAdd : vnetsToAdd) { + s_logger.debug("Adding vnet range " + vnetToAdd.first() + "-" + vnetToAdd.second() + " for the physicalNetwork id= "+id +" and zone id=" + network.getDataCenterId() + " as a part of updatePhysicalNetwork call"); + _dcDao.addVnet(network.getDataCenterId(), network.getId(), vnetToAdd.first(), vnetToAdd.second()); + } + + return network; + } + + private boolean physicalNetworkHasAllocatedVnets(long zoneId, long physicalNetworkId) { + return !_dcDao.listAllocatedVnets(zoneId, physicalNetworkId).isEmpty(); + } + + @Override + public boolean deletePhysicalNetwork(Long physicalNetworkId) { + + // verify input parameters + PhysicalNetworkVO network = _physicalNetworkDao.findById(physicalNetworkId); + if (network == null) { + throw new InvalidParameterValueException("Network id=" + physicalNetworkId + "doesn't exist in the system"); + } + + //delete physical network only if no network is associated to it + List networks = _networksDao.listByPhysicalNetwork(physicalNetworkId); + + if(networks != null && !networks.isEmpty()){ + s_logger.debug("Unable to remove the physical network id=" + physicalNetworkId + " as it has active networks associated."); + return false; + } + + List allocatedVnets = _dcDao.listAllocatedVnets(network.getDataCenterId(), physicalNetworkId); + + if(allocatedVnets != null && !allocatedVnets.isEmpty()){ + s_logger.debug("Unable to remove the physical network id=" + physicalNetworkId + " as it has active vnets associated."); + return false; + } + //checkIfPhysicalNetworkIsDeletable(physicalNetworkId); + + return _physicalNetworkDao.remove(physicalNetworkId); + } + + @DB + private void checkIfPhysicalNetworkIsDeletable(Long physicalNetworkId) { + List> tablesToCheck = new ArrayList>(); + + List networks = new ArrayList(); + networks.add(0, "networks"); + networks.add(1, "physical_network_id"); + networks.add(2, "there are networks associated to this physical network"); + tablesToCheck.add(networks); + + /*List privateIP = new ArrayList(); + privateIP.add(0, "op_dc_ip_address_alloc"); + privateIP.add(1, "data_center_id"); + privateIP.add(2, "there are private IP addresses allocated for this zone"); + tablesToCheck.add(privateIP); + + List publicIP = new ArrayList(); + publicIP.add(0, "user_ip_address"); + publicIP.add(1, "data_center_id"); + publicIP.add(2, "there are public IP addresses allocated for this zone"); + tablesToCheck.add(publicIP); + + List vmInstance = new ArrayList(); + vmInstance.add(0, "vm_instance"); + vmInstance.add(1, "data_center_id"); + vmInstance.add(2, "there are virtual machines running in this zone"); + tablesToCheck.add(vmInstance); + + List volumes = new ArrayList(); + volumes.add(0, "volumes"); + volumes.add(1, "data_center_id"); + volumes.add(2, "there are storage volumes for this zone"); + tablesToCheck.add(volumes);*/ + + List vnet = new ArrayList(); + vnet.add(0, "op_dc_vnet_alloc"); + vnet.add(1, "physical_network_id"); + vnet.add(2, "there are allocated vnets for this physical network"); + tablesToCheck.add(vnet); + + for (List table : tablesToCheck) { + String tableName = table.get(0); + String column = table.get(1); + String errorMsg = table.get(2); + + String dbName = "cloud"; + + String selectSql = "SELECT * FROM `" + dbName + "`.`" + tableName + "` WHERE " + column + " = ?"; + + if (tableName.equals("op_dc_vnet_alloc")) { + selectSql += " AND taken IS NOT NULL"; + } + + if (tableName.equals("user_ip_address")) { + selectSql += " AND state!='Free'"; + } + + if (tableName.equals("op_dc_ip_address_alloc")) { + selectSql += " AND taken IS NOT NULL"; + } + + if (tableName.equals("host_pod_ref") || tableName.equals("host") || tableName.equals("volumes")) { + selectSql += " AND removed is NULL"; + } + + if (tableName.equals("vm_instance")) { + selectSql += " AND state != '" + VirtualMachine.State.Expunging.toString() + "'"; + } + + Transaction txn = Transaction.currentTxn(); + try { + PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql); + stmt.setLong(1, physicalNetworkId); + ResultSet rs = stmt.executeQuery(); + if (rs != null && rs.next()) { + throw new CloudRuntimeException("The Physical Network is not deletable because " + errorMsg); + } + } catch (SQLException ex) { + throw new CloudRuntimeException("The Management Server failed to detect if physical network is deletable. Please contact Cloud Support."); + } + } + + } + + @Override + public List listNetworkServices(){ + return Service.listAllServices(); + } + + @Override + public List listSupportedNetworkServiceProviders(String serviceName){ + Network.Service service = null; + if(serviceName != null){ + service = Network.Service.getService(serviceName); + if(service == null){ + throw new InvalidParameterValueException("Invalid Network Service=" + serviceName); + } + } + + List supportedProviders = new ArrayList(); + for (NetworkElement element : _networkElements) { + if(element.getProvider() != null){ + if(service != null){ + //chk if this serviceprovider supports this service + if(isServiceProvided(element, service)){ + supportedProviders.add(element.getProvider()); + } + }else{ + supportedProviders.add(element.getProvider()); + } + } + } + return supportedProviders; + } + + private boolean isServiceProvided(NetworkElement element, Service service){ + if(element.getCapabilities() != null){ + return element.getCapabilities().containsKey(service); + } + return false; + } + + @Override + @DB + public PhysicalNetworkServiceProvider addProviderToPhysicalNetwork(Long physicalNetworkId, String providerName, Long destinationPhysicalNetworkId) { + + // verify input parameters + PhysicalNetworkVO network = _physicalNetworkDao.findById(physicalNetworkId); + if (network == null) { + throw new InvalidParameterValueException("Physical Network id=" + physicalNetworkId + "doesn't exist in the system"); + } + + // verify input parameters + if(destinationPhysicalNetworkId != null){ + PhysicalNetworkVO destNetwork = _physicalNetworkDao.findById(destinationPhysicalNetworkId); + if (destNetwork == null) { + throw new InvalidParameterValueException("Destination Physical Network id=" + destinationPhysicalNetworkId + "doesn't exist in the system"); + } + } + + if(providerName != null){ + Provider provider = Network.Provider.getProvider(providerName); + if(provider == null){ + throw new InvalidParameterValueException("Invalid Network Service Provider=" + providerName); + } + } + + Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + // Create the new physical network in the database + PhysicalNetworkServiceProviderVO nsp = new PhysicalNetworkServiceProviderVO(physicalNetworkId, providerName); + if(destinationPhysicalNetworkId != null){ + nsp.setDestinationPhysicalNetworkId(destinationPhysicalNetworkId); + } + nsp = _pNSPDao.persist(nsp); + + txn.commit(); + return nsp; + } catch (Exception ex) { + txn.rollback(); + s_logger.warn("Exception: ", ex); + throw new CloudRuntimeException("Fail to add a provider to physical network"); + } finally { + txn.close(); + } + + } + + @Override + public List listNetworkServiceProviders(Long physicalNetworkId) { + PhysicalNetworkVO network = _physicalNetworkDao.findById(physicalNetworkId); + if (network == null) { + throw new InvalidParameterValueException("Physical Network id=" + physicalNetworkId + "doesn't exist in the system"); + } + + return _pNSPDao.listBy(physicalNetworkId); + } + + @Override + public PhysicalNetworkServiceProvider updateNetworkServiceProvider(Long id, Boolean enabled) { + + PhysicalNetworkServiceProviderVO provider = _pNSPDao.findById(id); + + if(provider == null){ + throw new InvalidParameterValueException("Network Service Provider id=" + id + "doesn't exist in the system"); + } + + if(enabled){ + //TODO: need to check if the provider is ready for the physical network. + provider.setState(PhysicalNetworkServiceProvider.State.Enabled); + }else{ + //do we need to do anything for the provider instances before disabling? + provider.setState(PhysicalNetworkServiceProvider.State.Disabled); + } + + _pNSPDao.update(id, provider); + + return provider; + } + + @Override + public boolean deleteNetworkServiceProvider(Long id) { + PhysicalNetworkServiceProviderVO provider = _pNSPDao.findById(id); + + if(provider == null){ + throw new InvalidParameterValueException("Network Service Provider id=" + id + "doesn't exist in the system"); + } + + //TODO provider instances? + + return _pNSPDao.remove(id); + } + } diff --git a/server/src/com/cloud/network/NetworkVO.java b/server/src/com/cloud/network/NetworkVO.java index 3a749471403..7c9739d5080 100644 --- a/server/src/com/cloud/network/NetworkVO.java +++ b/server/src/com/cloud/network/NetworkVO.java @@ -87,6 +87,9 @@ public class NetworkVO implements Network { @Column(name="network_offering_id") long networkOfferingId; + @Column(name="physical_network_id") + long physicalNetworkId; + @Column(name="data_center_id") long dataCenterId; @@ -181,6 +184,20 @@ public class NetworkVO implements Network { this.id = -1; this.guestType = guestType; } + /** + * Constructor to be used for the adapters because it only initializes what's needed. + * @param trafficType + * @param mode + * @param broadcastDomainType + * @param networkOfferingId + * @param dataCenterId + * @param state TODO + * @param physicalNetworkId + */ + public NetworkVO(TrafficType trafficType, GuestIpType guestType, Mode mode, BroadcastDomainType broadcastDomainType, long networkOfferingId, long dataCenterId, State state, long physicalNetworkId) { + this(trafficType, guestType, mode, broadcastDomainType, networkOfferingId, dataCenterId, state); + this.physicalNetworkId = physicalNetworkId; + } public NetworkVO(long id, Network that, long offeringId, long dataCenterId, String guruName, long domainId, long accountId, long related, String name, String displayText, boolean isDefault, boolean isSecurityGroupEnabled, boolean isDomainSpecific, String networkDomain, Type type, boolean isShared) { this(id, that.getTrafficType(), that.getGuestType(), that.getMode(), that.getBroadcastDomainType(), offeringId, dataCenterId, domainId, accountId, related, name, displayText,isDefault, isDomainSpecific, networkDomain, type, isShared); @@ -196,6 +213,11 @@ public class NetworkVO implements Network { } } + public NetworkVO(long id, Network that, long offeringId, long dataCenterId, String guruName, long domainId, long accountId, long related, String name, String displayText, Boolean isShared, boolean isDefault, boolean isSecurityGroupEnabled, boolean isDomainSpecific, String networkDomain, Type type, long physicalNetworkId) { + this(id, that, offeringId, dataCenterId, guruName, domainId, accountId, related, name, displayText, isDefault, isSecurityGroupEnabled, isDomainSpecific, networkDomain, type); + this.physicalNetworkId = physicalNetworkId; + } + /** * Constructor for the actual DAO object. * @param trafficType @@ -381,6 +403,15 @@ public class NetworkVO implements Network { return NumbersUtil.hash(id); } + @Override + public long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public void setPhysicalNetworkId(long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + @Override public long getDataCenterId() { return dataCenterId; diff --git a/server/src/com/cloud/network/PhysicalNetworkVO.java b/server/src/com/cloud/network/PhysicalNetworkVO.java new file mode 100644 index 00000000000..921f9c9c646 --- /dev/null +++ b/server/src/com/cloud/network/PhysicalNetworkVO.java @@ -0,0 +1,207 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.Table; +import javax.persistence.TableGenerator; + +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; + +/** + * NetworkConfigurationVO contains information about a specific physical network. + * + */ +@Entity +@Table(name="physical_network") +public class PhysicalNetworkVO implements PhysicalNetwork { + @Id + @TableGenerator(name="physical_networks_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="physical_networks_seq", allocationSize=1) + @Column(name="id") + long id; + + @Column(name="data_center_id") + long dataCenterId; + + @Column(name="vnet") + private String vnet = null; + + @Column(name="speed") + private String speed = null; + + @Column(name="domain_id") + Long domainId = null; + + @Column(name="broadcast_domain_range") + @Enumerated(value=EnumType.STRING) + BroadcastDomainRange broadcastDomainRange; + + @Column(name="state") + @Enumerated(value=EnumType.STRING) + State state; + + @Column(name=GenericDao.REMOVED_COLUMN) + Date removed; + + @Column(name=GenericDao.CREATED_COLUMN) + Date created; + + @ElementCollection(targetClass = String.class, fetch=FetchType.EAGER) + @Column(name="tag") + @CollectionTable(name="physical_network_tags", joinColumns=@JoinColumn(name="physical_network_id")) + List tags; + + @ElementCollection(targetClass = String.class, fetch=FetchType.EAGER) + @Column(name="isolation_method") + @CollectionTable(name="physical_network_isolation_methods", joinColumns=@JoinColumn(name="physical_network_id")) + List isolationMethods; + + public PhysicalNetworkVO(){ + + } + + public PhysicalNetworkVO(long dataCenterId, String vnet, String speed, Long domainId, BroadcastDomainRange broadcastDomainRange) { + this.dataCenterId = dataCenterId; + this.setVnet(vnet); + this.setSpeed(speed); + this.domainId = domainId; + if(broadcastDomainRange != null){ + this.broadcastDomainRange = broadcastDomainRange; + }else{ + this.broadcastDomainRange = BroadcastDomainRange.Pod; + } + this.state = State.Disabled; + } + + @Override + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + @Override + public long getId() { + return id; + } + + @Override + public List getTags() { + return tags != null ? tags : new ArrayList(); + } + + public void addTag(String tag) { + if (tags == null) { + tags = new ArrayList(); + } + tags.add(tag); + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public Long getDomainId() { + return domainId; + } + + @Override + public BroadcastDomainRange getBroadcastDomainRange() { + return broadcastDomainRange; + } + + public void setBroadcastDomainRange(BroadcastDomainRange broadcastDomainRange) { + this.broadcastDomainRange = broadcastDomainRange; + } + + @Override + public int hashCode() { + return NumbersUtil.hash(id); + } + + @Override + public long getDataCenterId() { + return dataCenterId; + } + + public Date getRemoved() { + return removed; + } + + public void setRemoved(Date removed) { + this.removed = removed; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + @Override + public List getIsolationMethods() { + return isolationMethods != null ? isolationMethods : new ArrayList(); + } + + public void addIsolationMethod(String isolationMethod) { + if (isolationMethods == null) { + isolationMethods = new ArrayList(); + } + isolationMethods.add(isolationMethod); + } + + public void setIsolationMethods(List isolationMethods) { + this.isolationMethods = isolationMethods; + } + + public void setVnet(String vnet) { + this.vnet = vnet; + } + + @Override + public String getVnet() { + return vnet; + } + + public void setSpeed(String speed) { + this.speed = speed; + } + + @Override + public String getSpeed() { + return speed; + } +} diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 8f912ff5502..e27a8fb58e4 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -66,4 +66,8 @@ public interface NetworkDao extends GenericDao { List listByZoneIncludingRemoved(long zoneId); Long getNetworkCountByOfferingId(long offeringId); + + List listByPhysicalNetwork(long physicalNetworkId); + + List listSecurityGroupEnabledNetworks(); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index 4ffd6c077ca..c50c4ec15b0 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -23,8 +23,8 @@ import java.util.Random; import javax.ejb.Local; import javax.persistence.TableGenerator; -import com.cloud.network.Network.GuestIpType; import com.cloud.network.Network; +import com.cloud.network.Network.GuestIpType; import com.cloud.network.NetworkAccountDaoImpl; import com.cloud.network.NetworkAccountVO; import com.cloud.network.NetworkDomainVO; @@ -32,7 +32,6 @@ import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; -import com.cloud.storage.dao.VolumeDaoImpl.SumCount; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -56,7 +55,9 @@ public class NetworkDaoImpl extends GenericDaoBase implements N final SearchBuilder ZoneBroadcastUriSearch; final SearchBuilder ZoneSecurityGroupSearch; final GenericSearchBuilder CountByOfferingId; - + final SearchBuilder PhysicalNetworkSearch; + final SearchBuilder securityGroupSearch; + NetworkAccountDaoImpl _accountsDao = ComponentLocator.inject(NetworkAccountDaoImpl.class); NetworkDomainDaoImpl _domainsDao = ComponentLocator.inject(NetworkDomainDaoImpl.class); NetworkOpDaoImpl _opDao = ComponentLocator.inject(NetworkOpDaoImpl.class); @@ -78,6 +79,7 @@ public class NetworkDaoImpl extends GenericDaoBase implements N AllFieldsSearch.and("guesttype", AllFieldsSearch.entity().getGuestType(), Op.EQ); AllFieldsSearch.and("related", AllFieldsSearch.entity().getRelated(), Op.EQ); AllFieldsSearch.and("type", AllFieldsSearch.entity().getType(), Op.EQ); + AllFieldsSearch.and("physicalNetwork", AllFieldsSearch.entity().getPhysicalNetworkId(), Op.EQ); AllFieldsSearch.done(); AccountSearch = createSearchBuilder(); @@ -121,6 +123,15 @@ public class NetworkDaoImpl extends GenericDaoBase implements N CountByOfferingId.and("removed", CountByOfferingId.entity().getRemoved(), Op.NULL); CountByOfferingId.done(); + + PhysicalNetworkSearch = createSearchBuilder(); + PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ); + PhysicalNetworkSearch.done(); + + securityGroupSearch = createSearchBuilder(); + securityGroupSearch.and("isSgEnabled", securityGroupSearch.entity().isSecurityGroupEnabled(), SearchCriteria.Op.EQ); + securityGroupSearch.done(); + _tgMacAddress = _tgs.get("macAddress"); } @@ -331,4 +342,18 @@ public class NetworkDaoImpl extends GenericDaoBase implements N List results = customSearch(sc, null); return results.get(0); } + + public List listByPhysicalNetwork(long physicalNetworkId){ + SearchCriteria sc = PhysicalNetworkSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + return listBy(sc); + } + + @Override + public List listSecurityGroupEnabledNetworks() { + SearchCriteria sc = securityGroupSearch.create(); + sc.setParameters("isSgEnabled", true); + return listBy(sc); + } + } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDao.java b/server/src/com/cloud/network/dao/PhysicalNetworkDao.java new file mode 100644 index 00000000000..c2c1a04ecfc --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkDao.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import com.cloud.network.PhysicalNetworkVO; +import com.cloud.utils.db.GenericDao; + +public interface PhysicalNetworkDao extends GenericDao { + List listByZone(long zoneId); + List listByZoneIncludingRemoved(long zoneId); +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java new file mode 100644 index 00000000000..d49c3830876 --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.PhysicalNetworkVO; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value=PhysicalNetworkDao.class) @DB(txn=false) +public class PhysicalNetworkDaoImpl extends GenericDaoBase implements PhysicalNetworkDao { + final SearchBuilder ZoneSearch; + + protected PhysicalNetworkDaoImpl() { + super(); + ZoneSearch = createSearchBuilder(); + ZoneSearch.and("dataCenterId", ZoneSearch.entity().getDataCenterId(), Op.EQ); + ZoneSearch.done(); + + } + + @Override + public List listByZone(long zoneId) { + SearchCriteria sc = ZoneSearch.create(); + sc.setParameters("dataCenterId", zoneId); + return search(sc, null); + } + + @Override + public List listByZoneIncludingRemoved(long zoneId) { + SearchCriteria sc = ZoneSearch.create(); + sc.setParameters("dataCenterId", zoneId); + return listIncludingRemovedBy(sc); + } + + +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java new file mode 100644 index 00000000000..c9e292ef24c --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + + +public class PhysicalNetworkIsolationMethodDaoImpl extends GenericDaoBase implements GenericDao { + private final GenericSearchBuilder IsolationMethodSearch; + private final SearchBuilder AllFieldsSearch; + + protected PhysicalNetworkIsolationMethodDaoImpl() { + super(); + IsolationMethodSearch = createSearchBuilder(String.class); + IsolationMethodSearch.selectField(IsolationMethodSearch.entity().getIsolationMethod()); + IsolationMethodSearch.and("physicalNetworkId", IsolationMethodSearch.entity().getPhysicalNetworkId(), Op.EQ); + IsolationMethodSearch.done(); + + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ); + AllFieldsSearch.and("physicalNetworkId", AllFieldsSearch.entity().getPhysicalNetworkId(), Op.EQ); + AllFieldsSearch.and("isolationMethod", AllFieldsSearch.entity().getIsolationMethod(), Op.EQ); + AllFieldsSearch.done(); + } + + public List getAllIsolationMethod(long physicalNetworkId) { + SearchCriteria sc = IsolationMethodSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + + return customSearch(sc, null); + } + + public String getIsolationMethod(long physicalNetworkId) { + SearchCriteria sc = IsolationMethodSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + + return customSearch(sc, null).get(0); + } + + public int clearIsolationMethods(long physicalNetworkId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + + return remove(sc); + } + +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java b/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java new file mode 100644 index 00000000000..7698308b528 --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * This class is just used to work with the DAO. It shouldn't be used anywhere. + * + */ +@Entity +@Table(name = "physical_network_isolation_methods") +public class PhysicalNetworkIsolationMethodVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "physical_network_id") + private long physicalNetworkId; + + @Column(name = "isolation_method") + private String isolationMethod; + + /** + * There should never be a public constructor for this class. Since it's + * only here to define the table for the DAO class. + */ + protected PhysicalNetworkIsolationMethodVO() { + } + + protected PhysicalNetworkIsolationMethodVO(long physicalNetworkId, String isolationMethod) { + this.physicalNetworkId = physicalNetworkId; + this.isolationMethod = isolationMethod; + } + + public long getId() { + return id; + } + + public long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public String getIsolationMethod() { + return isolationMethod; + } +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java new file mode 100644 index 00000000000..b41e022c7aa --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; + +public interface PhysicalNetworkServiceProviderDao extends GenericDao { + List listBy(long physicalNetworkId); +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java new file mode 100644 index 00000000000..0bb9b24fcec --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value=PhysicalNetworkServiceProviderDao.class) @DB(txn=false) +public class PhysicalNetworkServiceProviderDaoImpl extends GenericDaoBase implements PhysicalNetworkServiceProviderDao { + final SearchBuilder physicalNetworkSearch; + + protected PhysicalNetworkServiceProviderDaoImpl() { + super(); + physicalNetworkSearch = createSearchBuilder(); + physicalNetworkSearch.and("physicalNetworkId", physicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ); + physicalNetworkSearch.done(); + + } + + @Override + public List listBy(long physicalNetworkId) { + SearchCriteria sc = physicalNetworkSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + return search(sc, null); + } + +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java new file mode 100644 index 00000000000..a731596be2a --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.cloud.network.PhysicalNetworkServiceProvider; + +@Entity +@Table(name = "physical_network_service_providers") +public class PhysicalNetworkServiceProviderVO implements PhysicalNetworkServiceProvider { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "physical_network_id") + private long physicalNetworkId; + + @Column(name = "destination_physical_network_id") + private long destPhysicalNetworkId; + + + @Column(name = "provider_name") + private String providerName; + + @Column(name="state") + @Enumerated(value=EnumType.STRING) + State state; + + public PhysicalNetworkServiceProviderVO() { + } + + public PhysicalNetworkServiceProviderVO(long physicalNetworkId, String name) { + this.physicalNetworkId = physicalNetworkId; + this.providerName = name; + this.state = State.Disabled; + } + + @Override + public long getId() { + return id; + } + + @Override + public long getPhysicalNetworkId() { + return physicalNetworkId; + } + + + @Override + public State getState() { + return state; + } + + @Override + public void setState(State state) { + this.state = state; + } + + @Override + public String getProviderName() { + return providerName; + } + + public void setDestinationPhysicalNetworkId(long destPhysicalNetworkId) { + this.destPhysicalNetworkId = destPhysicalNetworkId; + } + + @Override + public long getDestinationPhysicalNetworkId() { + return destPhysicalNetworkId; + } +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java new file mode 100644 index 00000000000..a90e4d00c59 --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java @@ -0,0 +1,62 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + + +public class PhysicalNetworkTagDaoImpl extends GenericDaoBase implements GenericDao { + private final GenericSearchBuilder TagSearch; + private final SearchBuilder AllFieldsSearch; + + protected PhysicalNetworkTagDaoImpl() { + super(); + TagSearch = createSearchBuilder(String.class); + TagSearch.selectField(TagSearch.entity().getTag()); + TagSearch.and("physicalNetworkId", TagSearch.entity().getPhysicalNetworkId(), Op.EQ); + TagSearch.done(); + + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ); + AllFieldsSearch.and("physicalNetworkId", AllFieldsSearch.entity().getPhysicalNetworkId(), Op.EQ); + AllFieldsSearch.and("tag", AllFieldsSearch.entity().getTag(), Op.EQ); + AllFieldsSearch.done(); + } + + public List getTags(long physicalNetworkId) { + SearchCriteria sc = TagSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + + return customSearch(sc, null); + } + + public int clearTags(long physicalNetworkId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + + return remove(sc); + } + +} diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java b/server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java new file mode 100644 index 00000000000..d34c7b41171 --- /dev/null +++ b/server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.dao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * This class is just used to work with the DAO. It shouldn't be used anywhere. + * + */ +@Entity +@Table(name = "physical_network_tags") +public class PhysicalNetworkTagVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "physical_network_id") + private long physicalNetworkId; + + @Column(name = "tag") + private String tag; + + /** + * There should never be a public constructor for this class. Since it's + * only here to define the table for the DAO class. + */ + protected PhysicalNetworkTagVO() { + } + + protected PhysicalNetworkTagVO(long physicalNetworkId, String tag) { + this.physicalNetworkId = physicalNetworkId; + this.tag = tag; + } + + public long getId() { + return id; + } + + public long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public String getTag() { + return tag; + } +} diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java index b2e91f71f83..c468666f1e9 100644 --- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -114,7 +114,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { // Get a vlan tag int vlanTag; if (config.getBroadcastUri() == null) { - String vnet = _dcDao.allocateVnet(zone.getId(), config.getAccountId(), context.getReservationId()); + String vnet = _dcDao.allocateVnet(zone.getId(), config.getPhysicalNetworkId(), config.getAccountId(), context.getReservationId()); try { vlanTag = Integer.parseInt(vnet); @@ -130,7 +130,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { } // Determine the offset from the lowest vlan tag - int offset = _externalNetworkMgr.getVlanOffset(zone, vlanTag); + int offset = _externalNetworkMgr.getVlanOffset(config.getPhysicalNetworkId(), vlanTag); // Determine the new gateway and CIDR String[] oldCidr = config.getCidr().split("/"); diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java index 61cb7f981bb..1bb13ffaacd 100644 --- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -144,7 +144,7 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { network.getDataCenterId(), State.Allocated); if (network.getBroadcastUri() == null) { - String vnet = _dcDao.allocateVnet(dcId, network.getAccountId(), context.getReservationId()); + String vnet = _dcDao.allocateVnet(dcId, network.getPhysicalNetworkId(), network.getAccountId(), context.getReservationId()); if (vnet == null) { throw new InsufficientVirtualNetworkCapcityException("Unable to allocate vnet as a part of network " + network + " implement ", DataCenter.class, dcId); } @@ -235,7 +235,7 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { public void shutdown(NetworkProfile profile, NetworkOffering offering) { s_logger.debug("Releasing vnet for the network id=" + profile.getId()); if (profile.getBroadcastUri() != null) { - _dcDao.releaseVnet(profile.getBroadcastUri().getHost(), profile.getDataCenterId(), profile.getAccountId(), profile.getReservationId()); + _dcDao.releaseVnet(profile.getBroadcastUri().getHost(), profile.getDataCenterId(), profile.getPhysicalNetworkId(), profile.getAccountId(), profile.getReservationId()); EventUtils.saveEvent(UserContext.current().getCallerUserId(), profile.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_RELEASE, "Released Zone Vlan: " +profile.getBroadcastUri().getHost()+" for Network: "+profile.getId(), 0); profile.setBroadcastUri(null); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 6f81f3813cc..70bdca07858 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -3322,8 +3322,8 @@ public class ManagementServerImpl implements ManagementServer { boolean securityGroupsEnabled = false; boolean elasticLoadBalancerEnabled = false; String supportELB = "false"; - List dc = _dcDao.listSecurityGroupEnabledZones(); - if (dc != null && !dc.isEmpty()) { + List networks = _networkDao.listSecurityGroupEnabledNetworks(); + if (networks != null && !networks.isEmpty()) { securityGroupsEnabled = true; String elbEnabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); elasticLoadBalancerEnabled = elbEnabled==null?false:Boolean.parseBoolean(elbEnabled); diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 8458d49302f..a0ec7c97698 100755 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -91,6 +91,7 @@ public class DatabaseConfig { static { // initialize the objectNames ArrayList objectNames.add("zone"); + objectNames.add("physicalNetwork"); objectNames.add("vlan"); objectNames.add("pod"); objectNames.add("cluster"); @@ -154,7 +155,6 @@ public class DatabaseConfig { fieldNames.add("tags"); fieldNames.add("networktype"); fieldNames.add("clusterId"); - s_configurationDescriptions.put("host.stats.interval", "the interval in milliseconds when host stats are retrieved from agents"); @@ -431,6 +431,8 @@ public class DatabaseConfig { private void saveCurrentObject() { if ("zone".equals(_currentObjectName)) { saveZone(); + } else if ("physicalNetwork".equals(_currentObjectName)) { + savePhysicalNetwork(); } else if ("vlan".equals(_currentObjectName)) { saveVlan(); } else if ("pod".equals(_currentObjectName)) { @@ -618,7 +620,7 @@ public class DatabaseConfig { String dns2 = _currentObjectParams.get("dns2"); String internalDns1 = _currentObjectParams.get("internalDns1"); String internalDns2 = _currentObjectParams.get("internalDns2"); - String vnetRange = _currentObjectParams.get("vnet"); + //String vnetRange = _currentObjectParams.get("vnet"); String guestNetworkCidr = _currentObjectParams.get("guestNetworkCidr"); String networkType = _currentObjectParams.get("networktype"); @@ -639,17 +641,27 @@ public class DatabaseConfig { if (!IPRangeConfig.validCIDR(guestNetworkCidr)) { printError("Please enter a valid value for guestNetworkCidr"); } - int vnetStart = -1; - int vnetEnd = -1; - if (vnetRange != null) { + + pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, guestNetworkCidr, networkType); + + } + + private void savePhysicalNetwork() { + long id = Long.parseLong(_currentObjectParams.get("id")); + String zoneId = _currentObjectParams.get("zoneId"); + String vnetRange = _currentObjectParams.get("vnet"); + + int vnetStart = -1; + int vnetEnd = -1; + if (vnetRange != null) { String[] tokens = vnetRange.split("-"); vnetStart = Integer.parseInt(tokens[0]); vnetEnd = Integer.parseInt(tokens[1]); } - - pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, vnetStart, vnetEnd, guestNetworkCidr, networkType); + long zoneDbId = Long.parseLong(zoneId); + pzc.savePhysicalNetwork(false, id, zoneDbId, vnetStart, vnetEnd); - } + } private void saveVlan() { String zoneId = _currentObjectParams.get("zoneId"); diff --git a/server/src/com/cloud/test/PodZoneConfig.java b/server/src/com/cloud/test/PodZoneConfig.java index a7cc4b70298..3262cdd8deb 100644 --- a/server/src/com/cloud/test/PodZoneConfig.java +++ b/server/src/com/cloud/test/PodZoneConfig.java @@ -254,7 +254,7 @@ public class PodZoneConfig { } @DB - public void saveZone(boolean printOutput, long id, String name, String dns1, String dns2, String dns3, String dns4, int vnetStart, int vnetEnd, String guestNetworkCidr, String networkType) { + public void saveZone(boolean printOutput, long id, String name, String dns1, String dns2, String dns3, String dns4, String guestNetworkCidr, String networkType) { if (printOutput) System.out.println("Saving zone, please wait..."); @@ -299,10 +299,6 @@ public class PodZoneConfig { values += ",'" + networkType + "'"; } - //save vnet information - columns += ", vnet"; - values += ",'" + vnetStart + "-" + vnetEnd + "'"; - columns += ")"; values += ")"; @@ -311,18 +307,46 @@ public class PodZoneConfig { DatabaseConfig.saveSQL(sql, "Failed to save zone due to exception. Please contact Cloud Support."); - // Hardcode the vnet range to be the full range - int begin = 0x64; + if (printOutput) System.out.println("Successfully saved zone."); + } + + @DB + public void savePhysicalNetwork(boolean printOutput, long id, long dcId, int vnetStart, int vnetEnd) { + + if (printOutput) System.out.println("Saving physical network, please wait..."); + + String columns = null; + String values = null; + + columns = "(id "; + values = "('" + id + "'"; + + columns += ", data_center_id "; + values += ",'" + dcId + "'"; + + //save vnet information + columns += ", vnet"; + values += ",'" + vnetStart + "-" + vnetEnd + "'"; + + + columns += ")"; + values += ")"; + + String sql = "INSERT INTO `cloud`.`physical_network` " + columns + " VALUES " + values; + + DatabaseConfig.saveSQL(sql, "Failed to save physical network due to exception. Please contact Cloud Support."); + + // Hardcode the vnet range to be the full range + int begin = 0x64; int end = 64000; // If vnet arguments were passed in, use them if (vnetStart != -1 && vnetEnd != -1) { - begin = vnetStart; - end = vnetEnd; + begin = vnetStart; + end = vnetEnd; } - long dcId = getZoneId(name); - String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id) VALUES ( ?, ?)"; + String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)"; Transaction txn = Transaction.currentTxn(); try { @@ -330,15 +354,16 @@ public class PodZoneConfig { for (int i = begin; i <= end; i++) { stmt.setString(1, Integer.toString(i)); stmt.setLong(2, dcId); + stmt.setLong(3, id); stmt.addBatch(); } stmt.executeBatch(); } catch (SQLException ex) { - printError("Error creating vnet for the data center. Please contact Cloud Support."); + printError("Error creating vnet for the physical network. Please contact Cloud Support."); } - - if (printOutput) System.out.println("Successfully saved zone."); - } + + if (printOutput) System.out.println("Successfully saved physical network."); + } public void deleteZone(String name) { String sql = "DELETE FROM `cloud`.`data_center` WHERE name=\"" + name + "\""; diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index b38ca8ae320..f76d564741c 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -117,6 +117,7 @@ DROP TABLE IF EXISTS `cloud`.`data_center_details`; DROP TABLE IF EXISTS `cloud`.`network_tags`; DROP TABLE IF EXISTS `cloud`.`op_host_transfer`; DROP TABLE IF EXISTS `cloud`.`projects`; +DROP TABLE IF EXISTS `cloud`.`physical_network`; CREATE TABLE `cloud`.`version` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', @@ -168,6 +169,7 @@ CREATE TABLE `cloud`.`networks` ( `cidr` varchar(18) COMMENT 'network cidr', `mode` varchar(32) COMMENT 'How to retrieve ip address in this network', `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from', + `physical_network_id` bigint unsigned COMMENT 'physical network id that this configuration is based on', `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in', `guru_name` varchar(255) NOT NULL COMMENT 'who is responsible for this type of network configuration', `state` varchar(32) NOT NULL COMMENT 'what state is this configuration in', @@ -189,7 +191,7 @@ CREATE TABLE `cloud`.`networks` ( `is_security_group_enabled` tinyint NOT NULL DEFAULT 0 COMMENT '1: enabled, 0: not', `type` char(32) COMMENT 'type of the network, can be Shared or Isolated', PRIMARY KEY (`id`), - CONSTRAINT `fk_networks__network_offering_id` FOREIGN KEY (`network_offering_id`) REFERENCES `network_offerings`(`id`), + CONSTRAINT `fk_networks__network_offering_id` FOREIGN KEY (`network_offering_id`) REFERENCES `network_offerings`(`id`), CONSTRAINT `fk_networks__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_networks__related` FOREIGN KEY(`related`) REFERENCES `networks`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_networks__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), @@ -371,6 +373,7 @@ INSERT INTO `cloud`.`sequence` (name, value) VALUES ('storage_pool_seq', 200); INSERT INTO `cloud`.`sequence` (name, value) VALUES ('volume_seq', 1); INSERT INTO `cloud`.`sequence` (name, value) VALUES ('networks_seq', 200); INSERT INTO `cloud`.`sequence` (name, value) VALUES ('checkpoint_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('physical_networks_seq', 200); CREATE TABLE `cloud`.`volumes` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', @@ -483,7 +486,6 @@ CREATE TABLE `cloud`.`data_center` ( `internal_dns2` varchar(255), `gateway` varchar(15), `netmask` varchar(15), - `vnet` varchar(255), `router_mac_address` varchar(17) NOT NULL DEFAULT '02:00:00:00:00:01' COMMENT 'mac address for the router within the domain', `mac_address` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Next available mac address for the ethernet card interacting with public internet', `guest_network_cidr` varchar(18), @@ -497,7 +499,6 @@ CREATE TABLE `cloud`.`data_center` ( `lb_provider` char(64) DEFAULT 'VirtualRouter', `vpn_provider` char(64) DEFAULT 'VirtualRouter', `userdata_provider` char(64) DEFAULT 'VirtualRouter', - `is_security_group_enabled` tinyint NOT NULL DEFAULT 0 COMMENT '1: enabled, 0: not', `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this data center enabled for allocation for new resources', `zone_token` varchar(255), `removed` datetime COMMENT 'date removed if not null', @@ -562,6 +563,7 @@ CREATE TABLE `cloud`.`host_pod_ref` ( CREATE TABLE `cloud`.`op_dc_vnet_alloc` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary id', `vnet` varchar(18) NOT NULL COMMENT 'vnet', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network the vnet belongs to', `data_center_id` bigint unsigned NOT NULL COMMENT 'data center the vnet belongs to', `reservation_id` char(40) NULL COMMENT 'reservation id', `account_id` bigint unsigned NULL COMMENT 'account the vnet belongs to right now', @@ -1734,5 +1736,57 @@ CREATE TABLE `ntwk_offering_service_map` ( UNIQUE (`network_offering_id`, `service`, `provider`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`physical_network` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this physical network belongs to', + `vnet` varchar(255), + `speed` varchar(32), + `domain_id` bigint unsigned COMMENT 'foreign key to domain id', + `broadcast_domain_range` varchar(32) NOT NULL DEFAULT 'Pod' COMMENT 'range of broadcast domain : Pod/Zone', + `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'what state is this configuration in', + `created` datetime COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_physical_network__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), + INDEX `i_physical_network__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `tag` varchar(255) NOT NULL COMMENT 'tag', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_tags__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + UNIQUE KEY(`physical_network_id`, `tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_isolation_methods` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `isolation_method` varchar(255) NOT NULL COMMENT 'isolation method(VLAN, L3 or GRE)', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_imethods__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + UNIQUE KEY(`physical_network_id`, `isolation_method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_traffic_types` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_traffic_types__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + UNIQUE KEY(`physical_network_id`, `traffic_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_service_providers` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name', + `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'provider state', + `destination_physical_network_id` bigint unsigned COMMENT 'id of the physical network to bridge to', + PRIMARY KEY (`id`), + CONSTRAINT `fk_pnetwork_service_providers__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET foreign_key_checks = 1; diff --git a/setup/db/server-setup.xml b/setup/db/server-setup.xml index bc30986065e..b917c519666 100755 --- a/setup/db/server-setup.xml +++ b/setup/db/server-setup.xml @@ -22,8 +22,16 @@ 560-579 10.1.1.0/24 - --> + + + + 200 + 1 + 1075-1089 + + --> +