NaaS: Remove separate configuration fields for virtual router elements

The fields are duplicated with network offerings.
This commit is contained in:
Sheng Yang 2011-10-31 14:07:45 -07:00
parent 928fc64ebc
commit 00bb63ac67
11 changed files with 93 additions and 304 deletions

View File

@ -49,36 +49,30 @@ public class ConfigureDhcpElementCmd extends BaseAsyncCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.UUID, type=CommandType.STRING, required=true, description="the UUID of the virtual router element")
private String uuid;
@Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the network service provider ID of the virtual router element")
private Long nspId;
@Parameter(name=ApiConstants.DHCP_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dhcp service would be enabled")
private Boolean dhcpService;
@Parameter(name=ApiConstants.DNS_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dns service would be enabled")
private Boolean dnsService;
@Parameter(name=ApiConstants.USERDATA_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is user data service would be enabled")
private Boolean userdataService;
@Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enabled/Disabled the service provider")
private Boolean enabled;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public String getUUID() {
return uuid;
public void setNspId(Long nspId) {
this.nspId = nspId;
}
public Boolean getDhcpService() {
return dhcpService;
public Long getNspId() {
return nspId;
}
public Boolean getDnsService() {
return dnsService;
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public Boolean getUserdataService() {
return userdataService;
public Boolean getEnabled() {
return enabled;
}
/////////////////////////////////////////////////////
@ -106,7 +100,7 @@ public class ConfigureDhcpElementCmd extends BaseAsyncCmd {
@Override
public String getEventDescription() {
return "configuring dhcp element: " + getUUID();
return "configuring dhcp element: " + _service.getIdByNspId(nspId);
}
public AsyncJob.Type getInstanceType() {
@ -114,12 +108,12 @@ public class ConfigureDhcpElementCmd extends BaseAsyncCmd {
}
public Long getInstanceId() {
return _service.getIdByUUID(uuid);
return _service.getIdByNspId(nspId);
}
@Override
public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
UserContext.current().setEventDetails("Dhcp element: " + getUUID());
UserContext.current().setEventDetails("Dhcp element: " + _service.getIdByNspId(nspId));
Boolean result = _service.configure(this);
if (result){
SuccessResponse response = new SuccessResponse();

View File

@ -49,71 +49,32 @@ public class ConfigureRedundantVirtualRouterElementCmd extends BaseAsyncCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.UUID, type=CommandType.STRING, required=true, description="the UUID of the virtual router element")
private String uuid;
@Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the network service provider ID of the virtual router element")
private Long nspId;
@Parameter(name=ApiConstants.DHCP_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dhcp service would be enabled")
private Boolean dhcpService;
@Parameter(name=ApiConstants.DNS_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dns service would be enabled")
private Boolean dnsService;
@Parameter(name=ApiConstants.GATEWAY_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is gateway service would be enabled")
private Boolean gatewayService;
@Parameter(name=ApiConstants.FIREWALL_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is firewall service would be enabled")
private Boolean firewallService;
@Parameter(name=ApiConstants.LB_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is lb service would be enabled")
private Boolean lbService;
@Parameter(name=ApiConstants.USERDATA_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is user data service would be enabled")
private Boolean userdataService;
@Parameter(name=ApiConstants.SOURCE_NAT_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is source nat service would be enabled")
private Boolean sourceNatService;
@Parameter(name=ApiConstants.VPN_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is vpn service would be enabled")
private Boolean vpnService;
@Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enabled/Disabled the service provider")
private Boolean enabled;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public String getUUID() {
return uuid;
public void setNspId(Long nspId) {
this.nspId = nspId;
}
public Boolean getDhcpService() {
return dhcpService;
public Long getNspId() {
return nspId;
}
public Boolean getDnsService() {
return dnsService;
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public Boolean getGatewayService() {
return gatewayService;
public Boolean getEnabled() {
return enabled;
}
public Boolean getFirewallService() {
return firewallService;
}
public Boolean getLbService() {
return lbService;
}
public Boolean getUserdataService() {
return userdataService;
}
public Boolean getSourceNatService() {
return sourceNatService;
}
public Boolean getVpnService() {
return vpnService;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
@ -140,7 +101,7 @@ public class ConfigureRedundantVirtualRouterElementCmd extends BaseAsyncCmd {
@Override
public String getEventDescription() {
return "configuring redundant virtual router element: " + getUUID();
return "configuring redundant virtual router element: " + _service.getIdByNspId(nspId);
}
public AsyncJob.Type getInstanceType() {
@ -148,12 +109,12 @@ public class ConfigureRedundantVirtualRouterElementCmd extends BaseAsyncCmd {
}
public Long getInstanceId() {
return _service.getIdByUUID(uuid);
return _service.getIdByNspId(getNspId());
}
@Override
public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
UserContext.current().setEventDetails("Redundant virtual router element: " + getUUID());
UserContext.current().setEventDetails("Redundant virtual router element: " + _service.getIdByNspId(nspId));
Boolean result = _service.configure(this);
if (result){
SuccessResponse response = new SuccessResponse();

View File

@ -49,71 +49,30 @@ public class ConfigureVirtualRouterElementCmd extends BaseAsyncCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.UUID, type=CommandType.STRING, required=true, description="the UUID of the virtual router element")
private String uuid;
@Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the network service provider ID of the virtual router element")
private Long nspId;
@Parameter(name=ApiConstants.DHCP_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dhcp service would be enabled")
private Boolean dhcpService;
@Parameter(name=ApiConstants.DNS_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is dns service would be enabled")
private Boolean dnsService;
@Parameter(name=ApiConstants.GATEWAY_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is gateway service would be enabled")
private Boolean gatewayService;
@Parameter(name=ApiConstants.FIREWALL_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is firewall service would be enabled")
private Boolean firewallService;
@Parameter(name=ApiConstants.LB_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is lb service would be enabled")
private Boolean lbService;
@Parameter(name=ApiConstants.USERDATA_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is user data service would be enabled")
private Boolean userdataService;
@Parameter(name=ApiConstants.SOURCE_NAT_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is source nat service would be enabled")
private Boolean sourceNatService;
@Parameter(name=ApiConstants.VPN_SERVICE, type=CommandType.BOOLEAN, required=true, description="true is vpn service would be enabled")
private Boolean vpnService;
@Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enabled/Disabled the service provider")
private Boolean enabled;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public String getUUID() {
return uuid;
public void setNspId(Long nspId) {
this.nspId = nspId;
}
public Boolean getDhcpService() {
return dhcpService;
public Long getNspId() {
return nspId;
}
public Boolean getDnsService() {
return dnsService;
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public Boolean getGatewayService() {
return gatewayService;
}
public Boolean getFirewallService() {
return firewallService;
}
public Boolean getLbService() {
return lbService;
}
public Boolean getUserdataService() {
return userdataService;
}
public Boolean getSourceNatService() {
return sourceNatService;
}
public Boolean getVpnService() {
return vpnService;
public Boolean getEnabled() {
return enabled;
}
/////////////////////////////////////////////////////
@ -141,7 +100,7 @@ public class ConfigureVirtualRouterElementCmd extends BaseAsyncCmd {
@Override
public String getEventDescription() {
return "configuring virtual router element: " + getUUID();
return "configuring virtual router element: " + _service.getIdByNspId(nspId);
}
public AsyncJob.Type getInstanceType() {
@ -149,12 +108,12 @@ public class ConfigureVirtualRouterElementCmd extends BaseAsyncCmd {
}
public Long getInstanceId() {
return _service.getIdByUUID(uuid);
return _service.getIdByNspId(getNspId());
}
@Override
public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
UserContext.current().setEventDetails("Virtual router element: " + getUUID());
UserContext.current().setEventDetails("Virtual router element: " + _service.getIdByNspId(nspId));
Boolean result = _service.configure(this);
if (result){
SuccessResponse response = new SuccessResponse();

View File

@ -5,7 +5,7 @@ import com.cloud.utils.component.PluggableService;
public interface DhcpElementService extends PluggableService{
boolean configure(ConfigureDhcpElementCmd cmd);
boolean addElement(Long nspId, String uuid);
Long getIdByUUID(String uuid);
boolean isReady(String uuid);
boolean addElement(Long nspId);
Long getIdByNspId(Long nspId);
boolean isReady(long nspId);
}

View File

@ -17,13 +17,10 @@
*/
package com.cloud.network.dao;
import java.util.List;
import com.cloud.network.element.VirtualRouterElementsVO;
import com.cloud.network.element.VirtualRouterElements.VirtualRouterElementsType;
import com.cloud.utils.db.GenericDao;
public interface VirtualRouterElementsDao extends GenericDao<VirtualRouterElementsVO, Long> {
public List<VirtualRouterElementsVO> findByNspIdAndType(long nspId, VirtualRouterElementsType type);
public VirtualRouterElementsVO findByUUID(String uuid);
public VirtualRouterElementsVO findByNspIdAndType(long nspId, VirtualRouterElementsType type);
}

View File

@ -17,8 +17,6 @@
*/
package com.cloud.network.dao;
import java.util.List;
import javax.ejb.Local;
import com.cloud.network.element.VirtualRouterElementsVO;
@ -42,17 +40,10 @@ public class VirtualRouterElementsDaoImpl extends GenericDaoBase<VirtualRouterEl
}
@Override
public List<VirtualRouterElementsVO> findByNspIdAndType(long nspId, VirtualRouterElementsType type) {
public VirtualRouterElementsVO findByNspIdAndType(long nspId, VirtualRouterElementsType type) {
SearchCriteria<VirtualRouterElementsVO> sc = AllFieldsSearch.create();
sc.setParameters("nsp_id", nspId);
sc.setParameters("type", type);
return listBy(sc);
}
@Override
public VirtualRouterElementsVO findByUUID(String uuid) {
SearchCriteria<VirtualRouterElementsVO> sc = AllFieldsSearch.create();
sc.setParameters("uuid", uuid);
return findOneBy(sc);
}
}

View File

@ -213,21 +213,12 @@ public class DhcpElement extends AdapterBase implements DhcpElementService, User
@Override
public boolean configure(ConfigureDhcpElementCmd cmd) {
VirtualRouterElementsVO element = _vrElementsDao.findByUUID(cmd.getUUID());
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(cmd.getNspId(), VirtualRouterElementsType.DhcpElement);
if (element == null) {
s_logger.trace("Can't find element with UUID " + cmd.getUUID());
s_logger.trace("Can't find element with network service provider ID " + cmd.getNspId());
return false;
}
element.setIsDhcpProvided(cmd.getDhcpService());
element.setIsDnsProvided(cmd.getDnsService());
element.setIsGatewayProvided(false);
element.setIsFirewallProvided(false);
element.setIsLoadBalanceProvided(false);
element.setIsSourceNatProvided(false);
element.setIsVpnProvided(false);
element.setIsReady(true);
element.setIsReady(cmd.getEnabled());
_vrElementsDao.persist(element);
@ -235,29 +226,25 @@ public class DhcpElement extends AdapterBase implements DhcpElementService, User
}
@Override
public boolean addElement(Long nspId, String uuid) {
public boolean addElement(Long nspId) {
long serviceOfferingId = _routerMgr.getDefaultVirtualRouterServiceOfferingId();
if (serviceOfferingId == 0) {
return false;
}
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, uuid, VirtualRouterElementsType.DhcpElement,
false, false, false, false, false, false, false);
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, null, VirtualRouterElementsType.DhcpElement);
_vrElementsDao.persist(element);
return true;
}
@Override
public Long getIdByUUID(String uuid) {
VirtualRouterElementsVO element = _vrElementsDao.findByUUID(uuid);
if (element == null) {
return new Long(0);
}
public Long getIdByNspId(Long nspId) {
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(nspId, VirtualRouterElementsType.DhcpElement);
return element.getId();
}
@Override
public boolean isReady(String uuid) {
VirtualRouterElementsVO element = _vrElementsDao.findByUUID(uuid);
public boolean isReady(long nspId) {
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(nspId, VirtualRouterElementsType.DhcpElement);
if (element == null) {
return false;
}

View File

@ -83,29 +83,20 @@ public class RedundantVirtualRouterElement extends VirtualRouterElement implemen
@Override
public boolean configure(ConfigureRedundantVirtualRouterElementCmd cmd) {
VirtualRouterElementsVO element = _vrElementsDao.findByUUID(cmd.getUUID());
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(cmd.getNspId(), VirtualRouterElementsType.RedundantVirtualRouterElement);
if (element == null) {
s_logger.trace("Can't find element with UUID " + cmd.getUUID());
s_logger.trace("Can't find element with UUID " + cmd.getNspId());
return false;
}
element.setIsDhcpProvided(cmd.getDhcpService());
element.setIsDnsProvided(cmd.getDnsService());
element.setIsGatewayProvided(cmd.getGatewayService());
element.setIsFirewallProvided(cmd.getFirewallService());
element.setIsLoadBalanceProvided(cmd.getLbService());
element.setIsSourceNatProvided(cmd.getSourceNatService());
element.setIsVpnProvided(cmd.getVpnService());
element.setIsReady(true);
element.setIsReady(cmd.getEnabled());
_vrElementsDao.persist(element);
return true;
}
@Override
public boolean addElement(Long nspId, String uuid) {
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, uuid, VirtualRouterElementsType.RedundantVirtualRouterElement,
false, false, false, false, false, false, false);
public boolean addElement(Long nspId) {
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, null, VirtualRouterElementsType.RedundantVirtualRouterElement);
_vrElementsDao.persist(element);
return true;
}

View File

@ -402,29 +402,21 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
@Override
public boolean configure(ConfigureVirtualRouterElementCmd cmd) {
VirtualRouterElementsVO element = _vrElementsDao.findByUUID(cmd.getUUID());
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(cmd.getNspId(), VirtualRouterElementsType.VirtualRouterElement);
if (element == null) {
s_logger.trace("Can't find element with UUID " + cmd.getUUID());
s_logger.trace("Can't find element with network service provider id " + cmd.getNspId());
return false;
}
element.setIsDhcpProvided(cmd.getDhcpService());
element.setIsDnsProvided(cmd.getDnsService());
element.setIsGatewayProvided(cmd.getGatewayService());
element.setIsFirewallProvided(cmd.getFirewallService());
element.setIsLoadBalanceProvided(cmd.getLbService());
element.setIsSourceNatProvided(cmd.getSourceNatService());
element.setIsVpnProvided(cmd.getVpnService());
element.setIsReady(true);
element.setIsReady(cmd.getEnabled());
_vrElementsDao.persist(element);
return true;
}
@Override
public boolean addElement(Long nspId, String uuid) {
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, uuid, VirtualRouterElementsType.VirtualRouterElement,
false, false, false, false, false, false, false);
public boolean addElement(Long nspId) {
VirtualRouterElementsVO element = new VirtualRouterElementsVO(nspId, null, VirtualRouterElementsType.VirtualRouterElement);
_vrElementsDao.persist(element);
return true;
}
@ -450,8 +442,11 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
@Override
public boolean isReady(PhysicalNetworkServiceProvider provider) {
// TODO Auto-generated method stub
return true;
VirtualRouterElementsVO element = _vrElementsDao.findByNspIdAndType(provider.getId(), VirtualRouterElementsType.VirtualRouterElement);
if (element == null) {
return false;
}
return element.getIsReady();
}
@Override
@ -460,4 +455,10 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
// TODO Auto-generated method stub
return true;
}
@Override
public Long getIdByNspId(Long nspId) {
VirtualRouterElementsVO vr = _vrElementsDao.findByNspIdAndType(nspId, VirtualRouterElementsType.VirtualRouterElement);
return vr.getId();
}
}

View File

@ -51,45 +51,16 @@ public class VirtualRouterElementsVO implements VirtualRouterElements {
@Column(name="uuid")
private String uuid;
@Column(name="dhcp_provided")
private boolean isDhcpProvided;
@Column(name="dns_provided")
private boolean isDnsProvided;
@Column(name="gateway_provided")
private boolean isGatewayProvided;
@Column(name="firewall_provided")
private boolean isFirewallProvided;
@Column(name="source_nat_provided")
private boolean isSourceNatProvided;
@Column(name="load_balance_provided")
private boolean isLoadBalanceProvided;
@Column(name="vpn_provided")
private boolean isVpnProvided;
@Column(name=GenericDao.REMOVED_COLUMN)
Date removed;
public VirtualRouterElementsVO() {
}
public VirtualRouterElementsVO(long nspId, String uuid, VirtualRouterElementsType type, boolean isDhcpProvided, boolean isDnsProvided,
boolean isGatewayProvided, boolean isFirewallProvided, boolean isSourceNatProvided, boolean isLoadBalanceProvided, boolean isVpnProvided) {
public VirtualRouterElementsVO(long nspId, String uuid, VirtualRouterElementsType type) {
this.nspId = nspId;
this.uuid = uuid;
this.type = type;
this.isDhcpProvided = isDhcpProvided;
this.isDnsProvided = isDnsProvided;
this.isGatewayProvided = isGatewayProvided;
this.isFirewallProvided = isFirewallProvided;
this.isSourceNatProvided = isSourceNatProvided;
this.isLoadBalanceProvided = isLoadBalanceProvided;
this.isVpnProvided = isVpnProvided;
}
public long getNspId() {
@ -104,62 +75,6 @@ public class VirtualRouterElementsVO implements VirtualRouterElements {
return id;
}
public boolean getIsDhcpProvided() {
return isDhcpProvided;
}
public boolean getIsDnsProvided() {
return isDnsProvided;
}
public boolean getIsGatewayProvided() {
return isGatewayProvided;
}
public boolean getIsFirewallProvided() {
return isFirewallProvided;
}
public boolean getIsSourceNatProvided() {
return isSourceNatProvided;
}
public boolean getIsLoadBalanceProvided() {
return isLoadBalanceProvided;
}
public boolean getIsVpnProvided() {
return isVpnProvided;
}
public void setIsDhcpProvided(boolean isDhcpProvided) {
this.isDhcpProvided = isDhcpProvided;
}
public void setIsDnsProvided(boolean isDnsProvided) {
this.isDnsProvided = isDnsProvided;
}
public void setIsGatewayProvided(boolean isGatewayProvided) {
this.isGatewayProvided = isGatewayProvided;
}
public void setIsFirewallProvided(boolean isFirewallProvided) {
this.isFirewallProvided = isFirewallProvided;
}
public void setIsSourceNatProvided(boolean isSourceNatProvided) {
this.isSourceNatProvided = isSourceNatProvided;
}
public void setIsLoadBalanceProvided(boolean isLoadBalanceProvided) {
this.isLoadBalanceProvided = isLoadBalanceProvided;
}
public void setIsVpnProvided(boolean isVpnProvided) {
this.isVpnProvided = isVpnProvided;
}
@Override
public VirtualRouterElementsType getType() {
return this.type;

View File

@ -1728,24 +1728,6 @@ CREATE TABLE `cloud`.`elastic_lb_vm_map` (
CONSTRAINT `fk_elastic_lb_vm_map__lb_id` FOREIGN KEY `fk_elastic_lb_vm_map__lb_id` (`lb_id`) REFERENCES `load_balancing_rules` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `cloud`.`virtual_router_elements` (
`id` bigint unsigned NOT NULL auto_increment,
`nsp_id` bigint unsigned NOT NULL,
`uuid` varchar(255) UNIQUE,
`ready` int(1) NOT NULL,
`type` varchar(255) NOT NULL,
`dhcp_provided` int(1) NOT NULL,
`dns_provided` int(1) NOT NULL,
`gateway_provided` int(1) NOT NULL,
`firewall_provided` int(1) NOT NULL,
`source_nat_provided` int(1) NOT NULL,
`load_balance_provided` int(1) NOT NULL,
`vpn_provided` int(1) NOT NULL,
`removed` datetime COMMENT 'date removed if not null',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ntwk_offering_service_map` (
`id` bigint unsigned NOT NULL auto_increment,
`network_offering_id` bigint unsigned NOT NULL COMMENT 'network_offering_id',
@ -1822,4 +1804,15 @@ CREATE TABLE `cloud`.`physical_network_external_devices` (
CONSTRAINT `fk_physical_network_external_devices_host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `cloud`.`virtual_router_elements` (
`id` bigint unsigned NOT NULL auto_increment,
`nsp_id` bigint unsigned NOT NULL,
`uuid` varchar(255) UNIQUE,
`type` varchar(255) NOT NULL,
`ready` int(1) NOT NULL,
`removed` datetime COMMENT 'date removed if not null',
PRIMARY KEY (`id`),
CONSTRAINT `fk_virtual_router_elements__nsp_id` FOREIGN KEY (`nsp_id`) REFERENCES `physical_network_service_providers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET foreign_key_checks = 1;