- Make all API commands Async and add events
- Make BroadcatsDomainRange case insensitive
- Process all _networkElements to build the Service -> Provider map during NetworkMgr::configure()
This commit is contained in:
prachi 2011-10-20 17:10:00 -07:00
parent 21344e3c36
commit 0d7ddb5d58
13 changed files with 214 additions and 39 deletions

View File

@ -21,16 +21,20 @@ package com.cloud.api.commands;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCreateCmd;
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.event.EventTypes;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
@Implementation(description="Adds a network serviceProvider to a physical network", responseObject=ProviderResponse.class)
public class AddNetworkServiceProviderCmd extends BaseCmd {
public class AddNetworkServiceProviderCmd extends BaseAsyncCreateCmd {
public static final Logger s_logger = Logger.getLogger(AddNetworkServiceProviderCmd.class.getName());
private static final String s_name = "addnetworkserviceproviderresponse";
@ -80,7 +84,8 @@ public class AddNetworkServiceProviderCmd extends BaseCmd {
@Override
public void execute(){
PhysicalNetworkServiceProvider result = _networkService.addProviderToPhysicalNetwork(getPhysicalNetworkId(), getProviderName(), getDestinationPhysicalNetworkId());
UserContext.current().setEventDetails("Network ServiceProvider Id: "+getEntityId());
PhysicalNetworkServiceProvider result = _networkService.getCreatedPhysicalNetworkServiceProvider(getEntityId());
if (result != null) {
ProviderResponse response = _responseGenerator.createNetworkServiceProviderResponse(result);
response.setResponseName(getCommandName());
@ -89,4 +94,24 @@ public class AddNetworkServiceProviderCmd extends BaseCmd {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add service provider to physical network");
}
}
@Override
public void create() throws ResourceAllocationException {
PhysicalNetworkServiceProvider result = _networkService.addProviderToPhysicalNetwork(getPhysicalNetworkId(), getProviderName(), getDestinationPhysicalNetworkId());
if (result != null) {
setEntityId(result.getId());
} else {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add service provider entity to physical network");
}
}
@Override
public String getEventType() {
return EventTypes.EVENT_SERVICE_PROVIDER_CREATE;
}
@Override
public String getEventDescription() {
return "Adding physical network ServiceProvider: " + getEntityId();
}
}

View File

@ -23,16 +23,20 @@ import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCreateCmd;
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.event.EventTypes;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.network.PhysicalNetwork;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
@Implementation(description="Creates a physical network", responseObject=PhysicalNetworkResponse.class)
public class CreatePhysicalNetworkCmd extends BaseCmd {
public class CreatePhysicalNetworkCmd extends BaseAsyncCreateCmd {
public static final Logger s_logger = Logger.getLogger(CreatePhysicalNetworkCmd.class.getName());
private static final String s_name = "createphysicalnetworkresponse";
@ -107,9 +111,30 @@ public class CreatePhysicalNetworkCmd extends BaseCmd {
return Account.ACCOUNT_ID_SYSTEM;
}
@Override
public String getEventType() {
return EventTypes.EVENT_PHYSICAL_NETWORK_CREATE;
}
@Override
public String getCreateEventType() {
return EventTypes.EVENT_PHYSICAL_NETWORK_CREATE;
}
@Override
public String getCreateEventDescription() {
return "creating Physical Network";
}
@Override
public String getEventDescription() {
return "creating Physical Network. Id: "+getEntityId();
}
@Override
public void execute(){
PhysicalNetwork result = _networkService.createPhysicalNetwork(getZoneId(),getVlan(),getNetworkSpeed(), getIsolationMethods(),getBroadcastDomainRange(),getDomainId(), getTags());
UserContext.current().setEventDetails("Physical Network Id: "+getEntityId());
PhysicalNetwork result = _networkService.getCreatedPhysicalNetwork(getEntityId());
if (result != null) {
PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result);
response.setResponseName(getCommandName());
@ -118,4 +143,15 @@ public class CreatePhysicalNetworkCmd extends BaseCmd {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create physical network");
}
}
@Override
public void create() throws ResourceAllocationException {
PhysicalNetwork result = _networkService.createPhysicalNetwork(getZoneId(),getVlan(),getNetworkSpeed(), getIsolationMethods(),getBroadcastDomainRange(),getDomainId(), getTags());
if (result != null) {
setEntityId(result.getId());
} else {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create physical network entity");
}
}
}

View File

@ -21,15 +21,17 @@ package com.cloud.api.commands;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCmd;
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.event.EventTypes;
import com.cloud.user.Account;
@Implementation(description="Deletes a Network Service Provider.", responseObject=SuccessResponse.class)
public class DeleteNetworkServiceProviderCmd extends BaseCmd {
public class DeleteNetworkServiceProviderCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(DeleteNetworkServiceProviderCmd.class.getName());
private static final String s_name = "deletenetworkserviceproviderresponse";
@ -75,4 +77,16 @@ public class DeleteNetworkServiceProviderCmd extends BaseCmd {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete network service provider");
}
}
@Override
public String getEventType() {
return EventTypes.EVENT_SERVICE_PROVIDER_DELETE;
}
@Override
public String getEventDescription() {
return "Deleting Physical network ServiceProvider: " + getId();
}
}

View File

@ -21,15 +21,18 @@ package com.cloud.api.commands;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCmd;
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.event.EventTypes;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
@Implementation(description="Deletes a Physical Network.", responseObject=SuccessResponse.class)
public class DeletePhysicalNetworkCmd extends BaseCmd {
public class DeletePhysicalNetworkCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(DeletePhysicalNetworkCmd.class.getName());
private static final String s_name = "deletephysicalnetworkresponse";
@ -67,6 +70,7 @@ public class DeletePhysicalNetworkCmd extends BaseCmd {
@Override
public void execute(){
UserContext.current().setEventDetails("Physical Network Id: " + id);
boolean result = _networkService.deletePhysicalNetwork(getId());
if (result) {
SuccessResponse response = new SuccessResponse(getCommandName());
@ -75,4 +79,15 @@ public class DeletePhysicalNetworkCmd extends BaseCmd {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete physical network");
}
}
@Override
public String getEventDescription() {
return "Deleting Physical network: " + getId();
}
@Override
public String getEventType() {
return EventTypes.EVENT_PHYSICAL_NETWORK_DELETE;
}
}

View File

@ -21,16 +21,18 @@ package com.cloud.api.commands;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCmd;
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.event.EventTypes;
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 class UpdateNetworkServiceProviderCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(UpdateNetworkServiceProviderCmd.class.getName());
private static final String s_name = "updatenetworkserviceproviderresponse";
@ -82,8 +84,14 @@ public class UpdateNetworkServiceProviderCmd extends BaseCmd {
}
}
@Override
public String getEventType() {
return EventTypes.EVENT_SERVICE_PROVIDER_UPDATE;
}
@Override
public String getEventDescription() {
return "Updating physical network ServiceProvider: " + getId();
}
}

View File

@ -23,16 +23,18 @@ import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.BaseAsyncCmd;
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.event.EventTypes;
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 class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(UpdatePhysicalNetworkCmd.class.getName());
private static final String s_name = "updatephysicalnetworkresponse";
@ -109,8 +111,18 @@ public class UpdatePhysicalNetworkCmd extends BaseCmd {
response.setResponseName(getCommandName());
this.setResponseObject(response);
}else {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create physical network");
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update physical network");
}
}
@Override
public String getEventDescription() {
return "Updating Physical network: " + getId();
}
@Override
public String getEventType() {
return EventTypes.EVENT_PHYSICAL_NETWORK_UPDATE;
}
}

View File

@ -214,4 +214,15 @@ public class EventTypes {
//Network as a Service
public static final String EVENT_NETWORK_ELEMENT_CONFIGURE = "NETWORK.ELEMENT.CONFIGURE";
//Physical Network Events
public static final String EVENT_PHYSICAL_NETWORK_CREATE = "PHYSICAL.NETWORK.CREATE";
public static final String EVENT_PHYSICAL_NETWORK_DELETE = "PHYSICAL.NETWORK.DELETE";
public static final String EVENT_PHYSICAL_NETWORK_UPDATE = "PHYSICAL.NETWORK.UPDATE";
//Physical Network Service Provider Events
public static final String EVENT_SERVICE_PROVIDER_CREATE = "SERVICE.PROVIDER.CREATE";
public static final String EVENT_SERVICE_PROVIDER_DELETE = "SERVICE.PROVIDER.DELETE";
public static final String EVENT_SERVICE_PROVIDER_UPDATE = "SERVICE.PROVIDER.UPDATE";
}

View File

@ -109,4 +109,12 @@ public interface NetworkService {
PhysicalNetworkServiceProvider updateNetworkServiceProvider(Long id, Boolean enabled);
boolean deleteNetworkServiceProvider(Long id);
PhysicalNetwork getPhysicalNetwork(Long physicalNetworkId);
PhysicalNetwork getCreatedPhysicalNetwork(Long physicalNetworkId);
PhysicalNetworkServiceProvider getPhysicalNetworkServiceProvider(Long providerId);
PhysicalNetworkServiceProvider getCreatedPhysicalNetworkServiceProvider(Long providerId);
}

View File

@ -41,8 +41,8 @@ public interface PhysicalNetwork {
}
public enum BroadcastDomainRange {
Pod,
Zone;
POD,
ZONE;
}
long getId();

View File

@ -267,6 +267,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
HashMap<Long, Long> _lastNetworkIdsToFree = new HashMap<Long, Long>();
private static HashMap<Service, List<Provider>> s_serviceToImplementedProvidersMap = new HashMap<Service, List<Provider>>();
@Override
public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp) throws InsufficientAddressCapacityException {
@ -883,6 +885,24 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
_executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Network-Scavenger"));
_allowSubdomainNetworkAccess = Boolean.valueOf(_configs.get(Config.SubDomainNetworkAccess.key()));
//populate s_serviceToImplementedProvidersMap with current _networkElements
for (NetworkElement element : _networkElements) {
Map<Service, Map<Capability, String>> capabilities = element.getCapabilities();
Provider implementedProvider = element.getProvider();
if(capabilities != null && implementedProvider != null){
for(Service service : capabilities.keySet()){
if(s_serviceToImplementedProvidersMap.containsKey(service)){
List<Provider> providers = s_serviceToImplementedProvidersMap.get(service);
providers.add(implementedProvider);
}else{
List<Provider> providers = new ArrayList<Provider>();
providers.add(implementedProvider);
s_serviceToImplementedProvidersMap.put(service, providers);
}
}
}
}
s_logger.info("Network Manager is configured.");
@ -3403,6 +3423,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_CREATE, eventDescription = "Creating Physical Network", create = true)
public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List<String> isolationMethods, String broadcastDomainRangeStr, Long domainId, List<String> tags) {
// Check if zone exists
if (zoneId == null) {
@ -3446,7 +3467,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
BroadcastDomainRange broadcastDomainRange = null;
if (broadcastDomainRangeStr != null && !broadcastDomainRangeStr.isEmpty()) {
try {
broadcastDomainRange = PhysicalNetwork.BroadcastDomainRange.valueOf(broadcastDomainRangeStr);
broadcastDomainRange = PhysicalNetwork.BroadcastDomainRange.valueOf(broadcastDomainRangeStr.toUpperCase());
} catch (IllegalArgumentException ex) {
throw new InvalidParameterValueException("Unable to resolve broadcastDomainRange '" + broadcastDomainRangeStr + "' to a supported value {Pod or Zone}");
}
@ -3496,6 +3517,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_UPDATE, eventDescription = "updating physical network", async = true)
public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> isolationMethods, List<String> tags, String newVnetRangeString, String state) {
// verify input parameters
@ -3534,7 +3556,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
PhysicalNetwork.IsolationMethod isolationMethodVal = null;
if (isMethod != null && !isMethod.isEmpty()) {
try {
isolationMethodVal = PhysicalNetwork.IsolationMethod.valueOf(isMethod);
isolationMethodVal = PhysicalNetwork.IsolationMethod.valueOf(isMethod.toUpperCase());
} catch (IllegalArgumentException ex) {
throw new InvalidParameterValueException("Unable to resolve IsolationMethod '" + isMethod + "' to a supported value {VLAN or L3 or GRE}");
}
@ -3630,6 +3652,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_DELETE, eventDescription = "deleting physical network", async = true)
public boolean deletePhysicalNetwork(Long physicalNetworkId) {
// verify input parameters
@ -3637,7 +3660,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
if (network == null) {
throw new InvalidParameterValueException("Network id=" + physicalNetworkId + "doesn't exist in the system");
}
//for all networks associated, check if they can be deleted.
//delete physical network only if no network is associated to it
List<NetworkVO> networks = _networksDao.listByPhysicalNetwork(physicalNetworkId);
@ -3756,31 +3779,22 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
}
List<Provider> supportedProviders = new ArrayList<Provider>();
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());
}
Set<Provider> supportedProviders = new HashSet<Provider>();
if(service != null){
supportedProviders.addAll(s_serviceToImplementedProvidersMap.get(service));
}else{
for(List<Provider> pList : s_serviceToImplementedProvidersMap.values()){
supportedProviders.addAll(pList);
}
}
return supportedProviders;
return new ArrayList<Provider>(supportedProviders);
}
private boolean isServiceProvided(NetworkElement element, Service service){
if(element.getCapabilities() != null){
return element.getCapabilities().containsKey(service);
}
return false;
}
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_SERVICE_PROVIDER_CREATE, eventDescription = "Creating Physical Network ServiceProvider", create = true)
public PhysicalNetworkServiceProvider addProviderToPhysicalNetwork(Long physicalNetworkId, String providerName, Long destinationPhysicalNetworkId) {
// verify input parameters
@ -3837,6 +3851,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_SERVICE_PROVIDER_UPDATE, eventDescription = "Updating physical network ServiceProvider", async = true)
public PhysicalNetworkServiceProvider updateNetworkServiceProvider(Long id, Boolean enabled) {
PhysicalNetworkServiceProviderVO provider = _pNSPDao.findById(id);
@ -3859,6 +3874,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_SERVICE_PROVIDER_DELETE, eventDescription = "Deleting physical network ServiceProvider", async = true)
public boolean deleteNetworkServiceProvider(Long id) {
PhysicalNetworkServiceProviderVO provider = _pNSPDao.findById(id);
@ -3870,5 +3886,27 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
return _pNSPDao.remove(id);
}
@Override
public PhysicalNetwork getPhysicalNetwork(Long physicalNetworkId){
return _physicalNetworkDao.findById(physicalNetworkId);
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_CREATE, eventDescription = "Creating Physical Network", async = true)
public PhysicalNetwork getCreatedPhysicalNetwork(Long physicalNetworkId) {
return getPhysicalNetwork(physicalNetworkId);
}
@Override
public PhysicalNetworkServiceProvider getPhysicalNetworkServiceProvider(Long providerId) {
return _pNSPDao.findById(providerId);
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_SERVICE_PROVIDER_CREATE, eventDescription = "Creating Physical Network ServiceProvider", async = true)
public PhysicalNetworkServiceProvider getCreatedPhysicalNetworkServiceProvider(Long providerId) {
return getPhysicalNetworkServiceProvider(providerId);
}
}

View File

@ -96,7 +96,7 @@ public class PhysicalNetworkVO implements PhysicalNetwork {
if(broadcastDomainRange != null){
this.broadcastDomainRange = broadcastDomainRange;
}else{
this.broadcastDomainRange = BroadcastDomainRange.Pod;
this.broadcastDomainRange = BroadcastDomainRange.ZONE;
}
this.state = State.Disabled;
}

View File

@ -19,6 +19,7 @@
package com.cloud.network.element;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.Local;
@ -37,7 +38,6 @@ import com.cloud.host.Host;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.GuestIpType;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.Network.Type;
@ -54,6 +54,8 @@ import com.cloud.vm.VirtualMachineProfile;
public class ExternalDhcpElement extends AdapterBase implements NetworkElement {
private static final Logger s_logger = Logger.getLogger(ExternalDhcpElement.class);
@Inject ExternalDhcpManager _dhcpMgr;
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
private boolean canHandle(DeployDestination dest, TrafficType trafficType, Type networkType) {
DataCenter dc = dest.getDataCenter();
Pod pod = dest.getPod();
@ -67,9 +69,15 @@ public class ExternalDhcpElement extends AdapterBase implements NetworkElement {
return false;
}
private static Map<Service, Map<Capability, String>> setCapabilities() {
Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
capabilities.put(Service.Dhcp, null);
return capabilities;
}
@Override
public Map<Service, Map<Capability, String>> getCapabilities() {
return null;
return capabilities;
}
@Override

View File

@ -1771,7 +1771,7 @@ CREATE TABLE `cloud`.`physical_network` (
`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',
`broadcast_domain_range` varchar(32) NOT NULL DEFAULT 'ZONE' 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',