Skip to content

Commit 632479d

Browse files
widoyadvr
authored andcommitted
CLOUDSTACK-9853: Add support for Secondary IPv6 Addresses and Subnets (#2028)
This commit adds support for passing IPv6 Addresses and/or Subnets as Secondary IPs. This is groundwork for CLOUDSTACK-9853 where IPv6 Subnets have to be allowed in the Security Groups of Instances to we can add DHCPv6 Prefix Delegation. Use ; instead of : for separating addresses, otherwise it would cause problems with IPv6 Addresses. Signed-off-by: Wido den Hollander <wido@widodh.nl>
1 parent 421517f commit 632479d

9 files changed

Lines changed: 29 additions & 10 deletions

File tree

api/src/com/cloud/vm/NicSecondaryIp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public interface NicSecondaryIp extends ControlledEntity, Identity, InternalIden
3434

3535
String getIp4Address();
3636

37+
String getIp6Address();
38+
3739
long getNetworkId();
3840

3941
long getVmId();

core/src/com/cloud/agent/api/SecurityGroupRulesCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public class SecurityGroupRulesCmd extends Command {
3636
private static final String CIDR_LENGTH_SEPARATOR = "/";
3737
private static final char RULE_TARGET_SEPARATOR = ',';
38-
private static final char RULE_COMMAND_SEPARATOR = ':';
38+
private static final char RULE_COMMAND_SEPARATOR = ';';
3939
protected static final String EGRESS_RULE = "E:";
4040
protected static final String INGRESS_RULE = "I:";
4141
private static final Logger LOGGER = Logger.getLogger(SecurityGroupRulesCmd.class);

core/test/com/cloud/agent/api/SecurityGroupRulesCmdTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void testStringifyCompressedRules() throws Exception {
8686
*/
8787
@Test
8888
public void testCompressStringifiedRules() throws Exception {
89-
final String compressed = "eJzztEpMSrYytDKyMtQz0jPWM9E31THTM9ez0LPUN9Dxc40IUXAlrAQAPdoP3Q==";
89+
final String compressed = "eJzztEpMSrY2tDayNtQz0jPWM9E31THTM9ez0LPUN9Dxc40IUXAlrAQAPusP4w==";
9090
final String a = securityGroupRulesCmd.compressStringifiedRules();
9191
assertTrue(compressed.equals(a));
9292
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121

2222

23+
import com.cloud.utils.StringUtils;
2324
import org.springframework.stereotype.Component;
2425

2526
import com.cloud.utils.db.GenericDaoBase;
@@ -106,7 +107,13 @@ public List<String> getSecondaryIpAddressesForNic(long nicId) {
106107
List<NicSecondaryIpVO> results = search(sc, null);
107108
List<String> ips = new ArrayList<String>(results.size());
108109
for (NicSecondaryIpVO result : results) {
109-
ips.add(result.getIp4Address());
110+
if (StringUtils.isNotBlank(result.getIp4Address())) {
111+
ips.add(result.getIp4Address());
112+
}
113+
114+
if (StringUtils.isNotBlank(result.getIp6Address())) {
115+
ips.add(result.getIp6Address());
116+
}
110117
}
111118
return ips;
112119
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ public NicSecondaryIpVO(long nicId, String ipaddr, long vmId, long accountId, lo
4242
this.networkId = networkId;
4343
}
4444

45+
public NicSecondaryIpVO(long nicId, String ip4Address, String ip6Address, long vmId, long accountId, long domainId, long networkId) {
46+
this.nicId = nicId;
47+
this.vmId = vmId;
48+
this.ip4Address = ip4Address;
49+
this.ip6Address = ip6Address;
50+
this.accountId = accountId;
51+
this.domainId = domainId;
52+
this.networkId = networkId;
53+
}
54+
4555
protected NicSecondaryIpVO() {
4656
}
4757

plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ public Answer execute(final StartCommand command, final LibvirtComputingResource
102102
final StringBuilder sb = new StringBuilder();
103103
if (nicSecIps != null) {
104104
for (final String ip : nicSecIps) {
105-
sb.append(ip).append(":");
105+
sb.append(ip).append(";");
106106
}
107107
secIpsStr = sb.toString();
108108
} else {
109-
secIpsStr = "0:";
109+
secIpsStr = "0;";
110110
}
111111
libvirtComputingResource.defaultNetworkRules(conn, vmName, nic, vmSpec.getId(), secIpsStr);
112112
}

plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,11 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
178178
final StringBuilder sb = new StringBuilder();
179179
if (nicSecIps != null) {
180180
for (final String ip : nicSecIps) {
181-
sb.append(ip).append(":");
181+
sb.append(ip).append(";");
182182
}
183183
secIpsStr = sb.toString();
184184
} else {
185-
secIpsStr = "0:";
185+
secIpsStr = "0;";
186186
}
187187
result = citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules", "vmName", vmName, "vmIP", nic.getIp(), "vmMAC", nic.getMac(),
188188
"vmID", Long.toString(vmSpec.getId()), "secIps", secIpsStr);
@@ -221,4 +221,4 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
221221
}
222222
}
223223
}
224-
}
224+
}

scripts/vm/hypervisor/xenserver/vmops

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ def default_network_rules(session, args):
826826

827827
#add secodnary nic ips to ipset
828828
secIpSet = "1"
829-
ips = sec_ips.split(':')
829+
ips = sec_ips.split(';')
830830
ips.pop()
831831
if ips[0] == "0":
832832
secIpSet = "0";

scripts/vm/network/security_group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
485485

486486
#add secodnary nic ips to ipset
487487
secIpSet = "1"
488-
ips = sec_ips.split(':')
488+
ips = sec_ips.split(';')
489489
ips.pop()
490490
if ips[0] == "0":
491491
secIpSet = "0";

0 commit comments

Comments
 (0)