Skip to content

Commit d73bb22

Browse files
bvbharatAbhinandan Prateek
authored andcommitted
Incorportaed the review changes Now dhcpservice IPs are removed when last vm from the subnet is removed. Rebased with master.
Signed-off-by: Abhinandan Prateek <aprateek@apache.org>
1 parent 4ac6ebb commit d73bb22

29 files changed

Lines changed: 384 additions & 220 deletions

api/src/com/cloud/agent/api/to/DnsmasqTO.java renamed to api/src/com/cloud/agent/api/to/DhcpTO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
// under the License.
1717
package com.cloud.agent.api.to;
1818

19-
public class DnsmasqTO {
19+
public class DhcpTO {
2020
String routerIp;
2121
String gateway;
2222
String netmask;
2323
String startIpOfSubnet;
2424

25-
public DnsmasqTO(String routerIp, String gateway, String netmask, String StartIpOfSubnet) {
25+
public DhcpTO(String routerIp, String gateway, String netmask, String StartIpOfSubnet) {
2626
this.routerIp = routerIp;
2727
this.startIpOfSubnet = StartIpOfSubnet;
2828
this.gateway = gateway;

api/src/com/cloud/network/Network.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ public static class Capability {
180180
public static final Capability SupportedEgressProtocols = new Capability("SupportedEgressProtocols");
181181
public static final Capability HealthCheckPolicy = new Capability("HealthCheckPolicy");
182182
public static final Capability LbSchemes = new Capability("LbSchemes");
183+
public static final Capability DhcpAccrossMultipleSubnets = new Capability("DhcpAccrossMultipleSubnets");
183184

184185
private String name;
185186

api/src/com/cloud/network/NetworkService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package com.cloud.network;
1818

1919
import java.util.List;
20+
import java.util.Map;
2021

22+
import com.cloud.offering.NetworkOffering;
2123
import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
2224
import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
2325
import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
@@ -180,4 +182,5 @@ NicSecondaryIp allocateSecondaryGuestIP(Account account, long zoneId, Long nicId
180182
/* lists the nic informaton */
181183
List<? extends Nic> listNics(ListNicsCmd listNicsCmd);
182184

185+
Map<Network.Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service);
183186
}

api/src/com/cloud/network/element/DhcpServiceProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@
2929
public interface DhcpServiceProvider extends NetworkElement {
3030
boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
3131
boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
32-
boolean removeDhcpSupportForSubnet(Network network);
32+
boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException;
3333
}

core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
// under the License.
1717
package com.cloud.agent.api.routing;
1818

19-
import com.cloud.agent.api.to.DnsmasqTO;
19+
import com.cloud.agent.api.to.DhcpTO;
2020

2121
import java.util.List;
2222

@@ -26,20 +26,23 @@ public class DnsMasqConfigCommand extends NetworkElementCommand {
2626
String dns2;
2727
String internal_dns1;
2828
String internal_dns2;
29-
List<DnsmasqTO> dnsmasqTOs;
29+
List<DhcpTO> dhcpTOs;
30+
boolean useExternal_dns;
31+
String domain_suffix;
32+
boolean dns;
3033

31-
public DnsMasqConfigCommand(String domain, List<DnsmasqTO> dnsmasqTOs, String dns1, String dns2, String internal_dns1, String internal_dns2) {
34+
public DnsMasqConfigCommand(String domain, List<DhcpTO> dhcpTOs, String dns1, String dns2, String internal_dns1, String internal_dns2) {
3235
this.domain = domain;
33-
this.dnsmasqTOs = dnsmasqTOs;
36+
this.dhcpTOs = dhcpTOs;
3437
this.dns1= dns1;
3538
this.dns2= dns2;
3639
this.internal_dns1 = internal_dns1;
3740
this.internal_dns2 = internal_dns2;
3841

3942
}
4043

41-
public List<DnsmasqTO> getIps() {
42-
return dnsmasqTOs;
44+
public List<DhcpTO> getIps() {
45+
return dhcpTOs;
4346
}
4447

4548
public String getDomain() {
@@ -62,4 +65,29 @@ public String getInternal_dns2() {
6265
return internal_dns2;
6366
}
6467

68+
public void setUseExternalDns(boolean useExternal_dns) {
69+
this.useExternal_dns = useExternal_dns;
70+
}
71+
72+
public void setDomainSuffix(String domain_suffix) {
73+
this.domain_suffix = domain_suffix;
74+
}
75+
76+
public void setIfDnsProvided(boolean dns) {
77+
this.dns =dns;
78+
}
79+
80+
public String getDomainSuffix() {
81+
return this.domain_suffix;
82+
}
83+
84+
public boolean getUseExternalDns() {
85+
return useExternal_dns;
86+
}
87+
88+
public boolean isDnsProvided() {
89+
return dns;
90+
}
91+
92+
6593
}

core/src/com/cloud/network/DnsMasqConfigurator.java

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package com.cloud.network;
1818

1919
import com.cloud.agent.api.routing.DnsMasqConfigCommand;
20-
import com.cloud.agent.api.to.DnsmasqTO;
20+
import com.cloud.agent.api.to.DhcpTO;
2121
import org.apache.log4j.Logger;
2222

2323
import java.util.Arrays;
@@ -74,11 +74,10 @@ public class DnsMasqConfigurator {
7474
"dhcp-option=6,router_ip,external_dns\n",
7575
"dhcp-optsfile=/etc/dhcpopts.txt\n",
7676

77-
7877
};
7978

8079
public String[] generateConfiguration(DnsMasqConfigCommand dnsMasqconfigcmd) {
81-
List<DnsmasqTO> dnsmasqTOs = dnsMasqconfigcmd.getIps();
80+
List<DhcpTO> dhcpTOs = dnsMasqconfigcmd.getIps();
8281
List <String> dnsMasqconf = Arrays.asList(Dnsmasq_config);
8382
String range="";
8483
String gateway="";
@@ -95,15 +94,42 @@ public String[] generateConfiguration(DnsMasqConfigCommand dnsMasqconfigcmd) {
9594
dns_external = dns_external + "*";
9695
dns_external = dns_external.replace(",*","");
9796
int i=0;
98-
for (; i< dnsmasqTOs.size(); i++) {
99-
range=range + "dhcp-range=set:range"+i+","+dnsmasqTOs.get(i).getStartIpOfSubnet()+",static\n";
100-
gateway=gateway +"dhcp-option=tag:range"+i+",3,"+dnsmasqTOs.get(i).getGateway()+"\n";
101-
netmask=netmask +"dhcp-option=tag:range"+i+",1,"+dnsmasqTOs.get(i).getNetmask()+"\n";
102-
dnsServers=dnsServers+"dhcp-option=tag:range"+i+",6,"+dnsmasqTOs.get(i).getRouterIp()+","+dns_external+"\n";
97+
for (; i< dhcpTOs.size(); i++) {
98+
range=range + "dhcp-range=set:range"+i+","+ dhcpTOs.get(i).getStartIpOfSubnet()+",static\n";
99+
gateway=gateway +"dhcp-option=tag:range"+i+",3,"+ dhcpTOs.get(i).getGateway()+"\n";
100+
netmask=netmask +"dhcp-option=tag:range"+i+",1,"+ dhcpTOs.get(i).getNetmask()+"\n";
101+
if (!dnsMasqconfigcmd.isDnsProvided()) {
102+
dnsServers = dnsServers+"dhcp-option=tag:range"+i+",6,"+dns_external+"\n";
103+
}
104+
else {
105+
dnsServers=dnsServers+"dhcp-option=tag:range"+i+",6,"+ dhcpTOs.get(i).getRouterIp()+","+dns_external+"\n";
106+
}
107+
103108
}
104-
dnsMasqconf.set(12, "domain="+domain+"\n");
105-
dnsMasqconf.set(14, "domain="+domain+"\n");
106-
dnsMasqconf.set(16,"domain="+domain+"\n");
109+
String domain_suffix= dnsMasqconfigcmd.getDomainSuffix();
110+
111+
if (domain != null) {
112+
if (domain_suffix != null) {
113+
114+
dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
115+
dnsMasqconf.set(12, "domain="+domain_suffix+domain+"\n");
116+
dnsMasqconf.set(14, "domain="+domain_suffix+domain+"\n");
117+
dnsMasqconf.set(16,"domain="+domain_suffix+domain+"\n");
118+
} else {
119+
dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
120+
dnsMasqconf.set(12, "domain="+domain+"\n");
121+
dnsMasqconf.set(14, "domain="+domain+"\n");
122+
dnsMasqconf.set(16,"domain="+domain+"\n");
123+
}
124+
}
125+
///if no domain is specified. this happens when dns service is not provided by the virtualrouter.
126+
else {
127+
dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
128+
dnsMasqconf.set(12, "domain="+"cloudnine.internal\n");
129+
dnsMasqconf.set(14, "domain="+"cloudnine.internal\n");
130+
dnsMasqconf.set(16,"domain="+"cloudnine.internal\n");
131+
}
132+
107133
dnsMasqconf.set(18, range);
108134
dnsMasqconf.set(22, gateway);
109135
dnsMasqconf.set(23, netmask);

engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ public List<SummedCapacity> findCapacityBy(Integer capacityType, Long zoneId, L
387387
SummedCapacitySearch.and("clusterId", SummedCapacitySearch.entity().getClusterId(), Op.EQ);
388388
}
389389
if (capacityType != null){
390-
SummedCapacitySearch.and("capacityType", SummedCapacitySearch.entity().getCapacityType(), Op.EQ);
390+
SummedCapacitySearch.and("capacityType", SummedCapacitySearch.entity().getCapacityType(), Op.EQ);
391391
}
392392

393393
SummedCapacitySearch.done();

engine/schema/src/com/cloud/network/dao/IPAddressDao.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
7575

7676
long countFreeIpsInVlan(long vlanDbId);
7777

78-
boolean deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp) throws SQLException;
78+
void deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp);
7979

80-
boolean deletePublicIPRange(long vlanDbId) throws SQLException;
80+
boolean deletePublicIPRange(long vlanDbId) ;
81+
82+
void lockRange(long vlandbId);
8183
}

engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.network.dao;
1818

19+
import com.cloud.dc.DataCenterVnetVO;
1920
import com.cloud.dc.Vlan.VlanType;
2021
import com.cloud.dc.VlanVO;
2122
import com.cloud.dc.dao.VlanDao;
@@ -54,7 +55,8 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
5455
protected SearchBuilder<IPAddressVO> VlanDbIdSearchUnallocated;
5556
protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCount;
5657
protected GenericSearchBuilder<IPAddressVO, Integer> AllocatedIpCount;
57-
protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCountForDashboard;
58+
protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCountForDashboard;
59+
protected SearchBuilder<IPAddressVO> DeleteAllExceptGivenIp;
5860
protected GenericSearchBuilder<IPAddressVO, Long> AllocatedIpCountForAccount;
5961
@Inject protected VlanDao _vlanDao;
6062
protected GenericSearchBuilder<IPAddressVO, Long> CountFreePublicIps;
@@ -128,6 +130,10 @@ public void init() {
128130
join.and("vlanType", join.entity().getVlanType(), Op.EQ);
129131
CountFreePublicIps.join("vlans", join, CountFreePublicIps.entity().getVlanId(), join.entity().getId(), JoinBuilder.JoinType.INNER);
130132
CountFreePublicIps.done();
133+
134+
DeleteAllExceptGivenIp = createSearchBuilder();
135+
DeleteAllExceptGivenIp.and("vlanDbId", DeleteAllExceptGivenIp.entity().getVlanId(), Op.EQ);
136+
DeleteAllExceptGivenIp.and("ip", DeleteAllExceptGivenIp.entity().getAddress(), Op.NEQ);
131137
}
132138

133139
@Override
@@ -366,21 +372,15 @@ public long countFreeIPsInNetwork(long networkId) {
366372
}
367373

368374
@Override
369-
public boolean deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp) throws SQLException {
370-
Transaction txn = Transaction.currentTxn();
371-
String deleteSql = "DELETE FROM `cloud`.`user_ip_address` WHERE vlan_db_id = ? and public_ip_address!=?";
372-
373-
txn.start();
374-
PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteSql);
375-
stmt.setLong(1, vlanDbId);
376-
stmt.setString(2, aliasIp);
377-
stmt.executeUpdate();
378-
txn.commit();
379-
return true;
375+
public void deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp) {
376+
SearchCriteria<IPAddressVO> sc =DeleteAllExceptGivenIp .create();
377+
sc.setParameters("vlan", vlanDbId);
378+
sc.setParameters("ip", aliasIp);
379+
remove(sc);
380380
}
381381

382382
@Override
383-
public boolean deletePublicIPRange(long vlanDbId) throws SQLException{
383+
public boolean deletePublicIPRange(long vlanDbId) {
384384
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
385385
sc.setParameters("vlan", vlanDbId);
386386
remove(sc);
@@ -408,4 +408,11 @@ public IPAddressVO findByAssociatedVmIdAndVmIp(long vmId, String vmIp) {
408408
sc.setParameters("associatedVmIp", vmIp);
409409
return findOneBy(sc);
410410
}
411+
412+
@Override
413+
public void lockRange(long vlandbId) {
414+
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
415+
sc.setParameters("vlan", vlandbId);
416+
lockRows(sc,null,true);
417+
}
411418
}

engine/schema/src/com/cloud/vm/dao/NicDao.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.cloud.vm.NicVO;
2121
import com.cloud.vm.VirtualMachine;
2222

23+
import java.net.URI;
2324
import java.util.List;
2425

2526
public interface NicDao extends GenericDao<NicVO, Long> {
@@ -68,4 +69,6 @@ public interface NicDao extends GenericDao<NicVO, Long> {
6869
List<NicVO> listPlaceholderNicsByNetworkIdAndVmType(long networkId, VirtualMachine.Type vmType);
6970

7071
NicVO findByInstanceIdAndIpAddressAndVmtype(long instanceId, String ipaddress, VirtualMachine.Type type);
72+
73+
List<NicVO> listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri);
7174
}

0 commit comments

Comments
 (0)