InternalLB: allow to specify more than one provider for the LB service when create network offering as diff providers can support internal and public LB for the same network

This commit is contained in:
Alena Prokharchyk 2013-04-15 17:00:31 -07:00
parent a4fc1d7d65
commit b3b16bae48
22 changed files with 204 additions and 86 deletions

View File

@ -33,6 +33,7 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.user.Account;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
@ -268,6 +269,5 @@ public interface NetworkModel {
List<String> getUsedIpsInNetwork(Network network);
Map<String, String> getNtwkOffDetails(long offId);
Map<Detail, String> getNtwkOffDetails(long offId);
}

View File

@ -41,9 +41,9 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
Enabled
}
public enum Details {
internalLbProvider,
publicLbProvider
public enum Detail {
InternalLbProvider,
PublicLbProvider
}
public final static String SystemPublicNetwork = "System-Public-Network";

View File

@ -30,7 +30,6 @@ import javax.inject.Inject;
import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd;
import org.apache.cloudstack.api.command.admin.internallb.CreateInternalLoadBalancerElementCmd;
import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd;
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRuleVO;
import org.apache.cloudstack.network.lb.InternalLoadBalancerManager;
import org.apache.cloudstack.network.lb.dao.ApplicationLoadBalancerRuleDao;
import org.apache.log4j.Logger;

View File

@ -30,13 +30,13 @@ import com.cloud.dc.Vlan;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
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.Networks.TrafficType;
import com.cloud.offering.DiskOffering;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Availability;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.org.Grouping.AllocationState;
@ -204,7 +204,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager {
NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate, Map<Service, Set<Provider>> serviceProviderMap,
boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap,
boolean specifyIpRanges, boolean isPersistent, Map<String, String> details);
boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details);
Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException;

View File

@ -126,10 +126,12 @@ import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.vpc.VpcManager;
import com.cloud.offering.DiskOffering;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Availability;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offering.ServiceOffering;
import com.cloud.offerings.NetworkOfferingServiceMapVO;
import com.cloud.offerings.NetworkOfferingVO;
@ -3198,7 +3200,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
Network.GuestType guestType = null;
boolean specifyIpRanges = cmd.getSpecifyIpRanges();
boolean isPersistent = cmd.getIsPersistent();
Map<String, String> details = cmd.getDetails();
Map<String, String> detailsStr = cmd.getDetails();
// Verify traffic type
for (TrafficType tType : TrafficType.values()) {
@ -3291,10 +3293,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
Network.Service service = Network.Service.getService(serviceStr);
if (serviceProviderMap.containsKey(service)) {
Set<Provider> providers = new HashSet<Provider>();
// in Acton, don't allow to specify more than 1 provider per service
if (svcPrv.get(serviceStr) != null && svcPrv.get(serviceStr).size() > 1) {
// Allow to specify more than 1 provider per service only if the service is LB
if (!serviceStr.equalsIgnoreCase(Service.Lb.getName()) && svcPrv.get(serviceStr) != null && svcPrv.get(serviceStr).size() > 1) {
throw new InvalidParameterValueException("In the current release only one provider can be " +
"specified for the service");
"specified for the service if the service is not LB");
}
for (String prvNameStr : svcPrv.get(serviceStr)) {
// check if provider is supported
@ -3367,6 +3369,21 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
firewallProviderSet.add(firewallProvider);
serviceProviderMap.put(Service.Firewall, firewallProviderSet);
}
Map<NetworkOffering.Detail, String> details = new HashMap<NetworkOffering.Detail, String>();
for (String detailStr : detailsStr.keySet()) {
NetworkOffering.Detail offDetail = null;
for (NetworkOffering.Detail supportedDetail: NetworkOffering.Detail.values()) {
if (detailStr.equalsIgnoreCase(supportedDetail.toString())) {
offDetail = supportedDetail;
break;
}
}
if (offDetail == null) {
throw new InvalidParameterValueException("Unsupported detail " + detailStr);
}
details.put(offDetail, detailsStr.get(detailStr));
}
return createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false,
serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details);
@ -3457,7 +3474,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@DB
public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate,
Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId,
boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<String, String> details) {
boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details) {
String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
int multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
@ -3614,26 +3631,37 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
return offering;
}
protected void validateNtwkOffDetails(Map<String, String> details, Map<Service, Set<Provider>> serviceProviderMap) {
for (String key : details.keySet()) {
NetworkOffering.Details detail = null;
for (NetworkOffering.Details value : NetworkOffering.Details.values()) {
if (key.equalsIgnoreCase(value.toString())) {
detail = value;
break;
protected void validateNtwkOffDetails(Map<Detail, String> details, Map<Service, Set<Provider>> serviceProviderMap) {
for (Detail detail : details.keySet()) {
Provider lbProvider = null;
if (detail == NetworkOffering.Detail.InternalLbProvider || detail == NetworkOffering.Detail.PublicLbProvider) {
//1) Vaidate the detail values - have to match the lb provider name
String providerStr = details.get(detail);
if (Network.Provider.getProvider(providerStr) == null) {
throw new InvalidParameterValueException("Invalid value " + providerStr + " for the detail " + detail);
}
}
if (detail == null) {
throw new InvalidParameterValueException("Unsupported detail key");
}
if (detail == NetworkOffering.Details.internalLbProvider || detail == NetworkOffering.Details.publicLbProvider) {
Provider provider = Network.Provider.getProvider(details.get(key));
if (provider == null) {
throw new InvalidParameterValueException("Invalid value for the key " + key);
if (serviceProviderMap.get(Service.Lb) != null) {
for (Provider provider : serviceProviderMap.get(Service.Lb)) {
if (provider.getName().equalsIgnoreCase(providerStr)) {
lbProvider = provider;
break;
}
}
}
if (lbProvider == null) {
throw new InvalidParameterValueException("Invalid value " + details.get(detail)
+ " for the detail " + detail + ". The provider is not supported by the network offering");
}
Set<Provider> providers = serviceProviderMap.get(Service.Lb);
if (providers == null || !providers.contains(details.get(key))) {
throw new InvalidParameterValueException("Invalid value for the key " + key + ". The provider is not supported by the network offering");
//2) validate if the provider supports the scheme
Set<Provider> lbProviders = new HashSet<Provider>();
lbProviders.add(lbProvider);
if (detail == NetworkOffering.Detail.InternalLbProvider) {
_networkModel.checkCapabilityForProvider(lbProviders, Service.Lb, Capability.LbSchemes, Scheme.Internal.toString());
} else if (detail == NetworkOffering.Detail.PublicLbProvider){
_networkModel.checkCapabilityForProvider(lbProviders, Service.Lb, Capability.LbSchemes, Scheme.Public.toString());
}
}
}

View File

@ -43,6 +43,7 @@ import com.cloud.network.element.StaticNatServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.rules.StaticNat;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
@ -333,7 +334,7 @@ public interface NetworkManager {
int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network);
LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme);
boolean isSecondaryIpSetForNic(long nicId);

View File

@ -151,6 +151,7 @@ import com.cloud.offering.NetworkOffering.Availability;
import com.cloud.offerings.NetworkOfferingServiceMapVO;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.org.Grouping;
import com.cloud.user.Account;
@ -242,6 +243,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
RemoteAccessVpnService _vpnMgr;
@Inject
PodVlanMapDao _podVlanMapDao;
@Inject
NetworkOfferingDetailsDao _ntwkOffDetailsDao;
List<NetworkGuru> _networkGurus;
public List<NetworkGuru> getNetworkGurus() {
@ -3732,35 +3735,62 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
return null;
}
protected NetworkElement getElementForServiceInNetwork(Network network, Service service) {
protected List<NetworkElement> getElementForServiceInNetwork(Network network, Service service) {
List<NetworkElement> elements = new ArrayList<NetworkElement>();
List<Provider> providers = getProvidersForServiceInNetwork(network, service);
//Only support one provider now
if (providers == null) {
s_logger.error("Cannot find " + service.getName() + " provider for network " + network.getId());
return null;
}
if (providers.size() != 1) {
if (providers.size() != 1 && service != Service.Lb) {
//support more than one LB providers only
s_logger.error("Found " + providers.size() + " " + service.getName() + " providers for network!" + network.getId());
return null;
}
for (Provider provider : providers) {
NetworkElement element = _networkModel.getElementImplementingProvider(provider.getName());
s_logger.info("Let " + element.getName() + " handle " + service.getName() + " in network " + network.getId());
elements.add(element);
}
NetworkElement element = _networkModel.getElementImplementingProvider(providers.get(0).getName());
s_logger.info("Let " + element.getName() + " handle " + service.getName() + " in network " + network.getId());
return element;
return elements;
}
@Override
public StaticNatServiceProvider getStaticNatProviderForNetwork(Network network) {
NetworkElement element = getElementForServiceInNetwork(network, Service.StaticNat);
//only one provider per Static nat service is supoprted
NetworkElement element = getElementForServiceInNetwork(network, Service.StaticNat).get(0);
assert element instanceof StaticNatServiceProvider;
return (StaticNatServiceProvider)element;
}
@Override
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
NetworkElement element = getElementForServiceInNetwork(network, Service.Lb);
assert element instanceof LoadBalancingServiceProvider;
return (LoadBalancingServiceProvider)element;
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
List<NetworkElement> lbElements = getElementForServiceInNetwork(network, Service.Lb);
NetworkElement lbElement = null;
if (lbElements.size() > 1) {
String providerName = null;
//get network offering details
NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
if (lbScheme == Scheme.Public) {
providerName = _ntwkOffDetailsDao.getDetail(off.getId(), NetworkOffering.Detail.PublicLbProvider);
} else {
providerName = _ntwkOffDetailsDao.getDetail(off.getId(), NetworkOffering.Detail.InternalLbProvider);
}
if (providerName == null) {
throw new InvalidParameterValueException("Can't find Lb provider supporting scheme " + lbScheme.toString() + " in network " + network);
}
lbElement = _networkModel.getElementImplementingProvider(providerName);
} else if (lbElements.size() == 1){
lbElement = lbElements.get(0);
}
assert lbElement != null;
assert lbElement instanceof LoadBalancingServiceProvider;
return (LoadBalancingServiceProvider)lbElement;
}
@Override
public boolean isNetworkInlineMode(Network network) {
NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());

View File

@ -85,6 +85,7 @@ import com.cloud.network.rules.FirewallRuleVO;
import com.cloud.network.rules.dao.PortForwardingRulesDao;
import com.cloud.network.vpc.dao.PrivateIpDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingServiceMapVO;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
@ -606,7 +607,6 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
NetworkElement element = getElementImplementingProvider(instance.getProvider());
if (element != null) {
Map<Service, Map<Capability, String>> elementCapabilities = element.getCapabilities();
;
if (elementCapabilities != null) {
networkCapabilities.put(service, elementCapabilities.get(service));
}
@ -1467,10 +1467,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
throw new UnsupportedServiceException("Service " + service.getName() + " doesn't have capability " + cap.getName() + " for element=" + element.getName() + " implementing Provider="
+ provider.getName());
}
capValue = capValue.toLowerCase();
if (!value.contains(capValue)) {
if (!value.toLowerCase().contains(capValue.toLowerCase())) {
throw new UnsupportedServiceException("Service " + service.getName() + " doesn't support value " + capValue + " for capability " + cap.getName() + " for element=" + element.getName()
+ " implementing Provider=" + provider.getName());
}
@ -2079,7 +2077,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
}
@Override
public Map<String, String> getNtwkOffDetails(long offId) {
public Map<Detail, String> getNtwkOffDetails(long offId) {
return _ntwkOffDetailsDao.getNtwkOffDetails(offId);
}
}

View File

@ -35,4 +35,5 @@ public interface NetworkServiceMapDao extends GenericDao<NetworkServiceMapVO, Lo
void deleteByNetworkId(long networkId);
List<String> getDistinctProviders(long networkId);
String isProviderForNetwork(long networkId, Provider provider);
List<String> getProvidersForServiceInNetwork(long networkId, Service service);
}

View File

@ -56,6 +56,7 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceMapVO
DistinctProvidersSearch = createSearchBuilder(String.class);
DistinctProvidersSearch.and("networkId", DistinctProvidersSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
DistinctProvidersSearch.and("provider", DistinctProvidersSearch.entity().getProvider(), SearchCriteria.Op.EQ);
DistinctProvidersSearch.and("service", DistinctProvidersSearch.entity().getService(), SearchCriteria.Op.EQ);
DistinctProvidersSearch.selectField(DistinctProvidersSearch.entity().getProvider());
DistinctProvidersSearch.done();
}
@ -163,5 +164,13 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceMapVO
return results.get(0);
}
}
@Override
public List<String> getProvidersForServiceInNetwork(long networkId, Service service) {
SearchCriteria<String> sc = DistinctProvidersSearch.create();
sc.setParameters("networkId", networkId);
sc.setParameters("service", service.getName());
return customSearch(sc, null);
}
}

View File

@ -1388,21 +1388,15 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
throw ex;
}
NetworkVO network = _networkDao.findById(networkId);
// verify that lb service is supported by the network
if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
InvalidParameterValueException ex = new InvalidParameterValueException(
"LB service is not supported in specified network id");
ex.addProxyObject(network, networkId, "networkId");
throw ex;
}
isLbServiceSupportedInNetwork(networkId, Scheme.Public);
_firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPort, srcPort, protocol,
Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
sourceIpId, srcPort, srcPort, algorithm,
network.getId(), ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
// verify rule is supported by Lb provider of the network
Ip sourceIp = getSourceIp(newRule);
@ -2073,5 +2067,23 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
}
return dstList;
}
protected void isLbServiceSupportedInNetwork(long networkId, Scheme scheme) {
Network network = _networkDao.findById(networkId);
//1) Check if the LB service is supported
if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
InvalidParameterValueException ex = new InvalidParameterValueException(
"LB service is not supported in specified network id");
ex.addProxyObject(network, network.getId(), "networkId");
throw ex;
}
//2) Check if the provider supports the scheme
LoadBalancingServiceProvider lbProvider = _networkMgr.getLoadBalancingProviderForNetwork(network, scheme);
if (lbProvider == null) {
throw new InvalidParameterValueException("Lb rule with scheme " + scheme.toString() + " is not supported by lb providers in network " + network);
}
}
}

View File

@ -18,6 +18,8 @@ package com.cloud.offerings;
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;
@ -25,6 +27,9 @@ import javax.persistence.Table;
import org.apache.cloudstack.api.InternalIdentity;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
@Entity
@Table(name="network_offering_details")
public class NetworkOfferingDetailsVO implements InternalIdentity {
@ -36,17 +41,18 @@ public class NetworkOfferingDetailsVO implements InternalIdentity {
@Column(name="network_offering_id")
private long offeringId;
@Enumerated(value=EnumType.STRING)
@Column(name="name")
private String name;
private NetworkOffering.Detail name;
@Column(name="value", length=1024)
private String value;
public NetworkOfferingDetailsVO() {}
public NetworkOfferingDetailsVO(long offeringId, String name, String value) {
public NetworkOfferingDetailsVO(long offeringId, Detail detailName, String value) {
this.offeringId = offeringId;
this.name = name;
this.name = detailName;
this.value = value;
}
@ -58,7 +64,7 @@ public class NetworkOfferingDetailsVO implements InternalIdentity {
return offeringId;
}
public String getName() {
public NetworkOffering.Detail getName() {
return name;
}
@ -74,7 +80,7 @@ public class NetworkOfferingDetailsVO implements InternalIdentity {
this.offeringId = offeringId;
}
public void setName(String name) {
public void setName(NetworkOffering.Detail name) {
this.name = name;
}

View File

@ -23,6 +23,7 @@ import com.cloud.network.Network;
import com.cloud.network.Networks.TrafficType;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Availability;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.utils.db.GenericDao;
@ -58,6 +59,6 @@ public interface NetworkOfferingDao extends GenericDao<NetworkOfferingVO, Long>
List<NetworkOfferingVO> listByTrafficTypeGuestTypeAndState(NetworkOffering.State state, TrafficType trafficType, Network.GuestType type);
NetworkOfferingVO persist(NetworkOfferingVO off, Map<String, String> details);
NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details);
}

View File

@ -29,6 +29,7 @@ import com.cloud.network.Network;
import com.cloud.network.Networks.TrafficType;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Availability;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingDetailsVO;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.utils.db.DB;
@ -172,18 +173,19 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
@Override
@DB
public NetworkOfferingVO persist(NetworkOfferingVO off, Map<String, String> details) {
public NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details) {
Transaction txn = Transaction.currentTxn();
txn.start();
//1) TODO - persist the details
//1) persist the offering
NetworkOfferingVO vo = super.persist(off);
//2) persist the details
if (details != null && !details.isEmpty()) {
for (String detail : details.keySet()) {
for (NetworkOffering.Detail detail : details.keySet()) {
_detailsDao.persist(new NetworkOfferingDetailsVO(off.getId(), detail, details.get(detail)));
}
}
//2) persist the offering
NetworkOfferingVO vo = super.persist(off);
txn.commit();
return vo;
}

View File

@ -16,13 +16,16 @@
// under the License.
package com.cloud.offerings.dao;
import java.util.Map;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingDetailsVO;
import com.cloud.utils.db.GenericDao;
public interface NetworkOfferingDetailsDao extends GenericDao<NetworkOfferingDetailsVO, Long>{
Map<String, String> getNtwkOffDetails(long offeringId);
Map<NetworkOffering.Detail,String> getNtwkOffDetails(long offeringId);
String getDetail(long offeringId, Detail detailName);
}

View File

@ -20,14 +20,20 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingDetailsVO;
import com.cloud.storage.VMTemplateDetailVO;
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.Func;
import com.cloud.utils.db.SearchCriteria.Op;
public class NetworkOfferingDetailsDaoImpl extends GenericDaoBase<NetworkOfferingDetailsVO, Long> implements NetworkOfferingDetailsDao{
protected final SearchBuilder<NetworkOfferingDetailsVO> DetailSearch;
private final GenericSearchBuilder<NetworkOfferingDetailsVO, String> ValueSearch;
public NetworkOfferingDetailsDaoImpl() {
@ -35,15 +41,21 @@ public class NetworkOfferingDetailsDaoImpl extends GenericDaoBase<NetworkOfferin
DetailSearch.and("offeringId", DetailSearch.entity().getOfferingId(), SearchCriteria.Op.EQ);
DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
DetailSearch.done();
ValueSearch = createSearchBuilder(String.class);
ValueSearch.select(null, Func.DISTINCT, ValueSearch.entity().getValue());
ValueSearch.and("offeringId", ValueSearch.entity().getOfferingId(), SearchCriteria.Op.EQ);
ValueSearch.and("name", ValueSearch.entity().getName(), Op.EQ);
ValueSearch.done();
}
@Override
public Map<String, String> getNtwkOffDetails(long offeringId) {
public Map<NetworkOffering.Detail,String> getNtwkOffDetails(long offeringId) {
SearchCriteria<NetworkOfferingDetailsVO> sc = DetailSearch.create();
sc.setParameters("offeringId", offeringId);
List<NetworkOfferingDetailsVO> results = search(sc, null);
Map<String, String> details = new HashMap<String, String>(results.size());
Map<NetworkOffering.Detail, String> details = new HashMap<NetworkOffering.Detail, String>(results.size());
for (NetworkOfferingDetailsVO result : results) {
details.put(result.getName(), result.getValue());
}
@ -51,4 +63,17 @@ public class NetworkOfferingDetailsDaoImpl extends GenericDaoBase<NetworkOfferin
return details;
}
@Override
public String getDetail(long offeringId, Detail detailName) {
SearchCriteria<String> sc = ValueSearch.create();
sc.setParameters("name", detailName);
sc.setParameters("offeringId", offeringId);
List<String> results = customSearch(sc, null);
if (results.isEmpty()) {
return null;
} else {
return results.get(0);
}
}
}

View File

@ -28,8 +28,8 @@ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementors
import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
import org.springframework.stereotype.Component;
import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
import org.springframework.stereotype.Component;
import com.cloud.dc.DataCenter;
import com.cloud.dc.Pod;
@ -56,24 +56,22 @@ import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRule.State;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.rules.StaticNat;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Manager;
import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicSecondaryIp;
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfileImpl;
@Component
@Local(value = { NetworkManager.class, NetworkService.class })
@ -815,7 +813,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
}
@Override
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
// TODO Auto-generated method stub
return null;
}

View File

@ -39,6 +39,7 @@ import com.cloud.network.dao.NetworkVO;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.Account;
import com.cloud.utils.component.ManagerBase;
@ -864,7 +865,7 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
}
@Override
public Map<String, String> getNtwkOffDetails(long offId) {
public Map<Detail, String> getNtwkOffDetails(long offId) {
// TODO Auto-generated method stub
return null;
}

View File

@ -500,7 +500,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
@Override
public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate,
Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode,
Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<String, String> details) {
Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details) {
// TODO Auto-generated method stub
return null;
}

View File

@ -58,7 +58,6 @@ import com.cloud.network.PhysicalNetwork;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.PhysicalNetworkTrafficType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.UserIpv6Address;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.NetworkServiceMapDao;
@ -71,6 +70,7 @@ import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRule.State;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.rules.StaticNat;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
@ -78,18 +78,15 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Manager;
import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicSecondaryIp;
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfileImpl;
@Component
@Local(value = { NetworkManager.class, NetworkService.class })
@ -1309,7 +1306,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
}
@Override
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
// TODO Auto-generated method stub
return null;
}

View File

@ -46,6 +46,7 @@ import com.cloud.network.dao.NetworkVO;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.Detail;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.user.Account;
@ -876,7 +877,7 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
}
@Override
public Map<String, String> getNtwkOffDetails(long offId) {
public Map<Detail, String> getNtwkOffDetails(long offId) {
// TODO Auto-generated method stub
return null;
}

View File

@ -95,4 +95,10 @@ public class MockNetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceM
// TODO Auto-generated method stub
return null;
}
@Override
public List<String> getProvidersForServiceInNetwork(long networkId, Service service) {
// TODO Auto-generated method stub
return null;
}
}