diff --git a/header/src/main/java/org/zstack/header/storage/addon/NbdRemoteTarget.java b/header/src/main/java/org/zstack/header/storage/addon/NbdRemoteTarget.java index b1224c2b84a..c8224f6319d 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/NbdRemoteTarget.java +++ b/header/src/main/java/org/zstack/header/storage/addon/NbdRemoteTarget.java @@ -1,5 +1,7 @@ package org.zstack.header.storage.addon; +import org.zstack.utils.network.IPv6NetworkUtils; + public class NbdRemoteTarget extends BlockRemoteTarget { private String ip; private int port; @@ -28,6 +30,6 @@ public String getInstallPath() { @Override public String getResourceURI() { - return String.format("nbd://%s:%s", ip, port); + return String.format("nbd://%s:%s", IPv6NetworkUtils.formatHostForUrl(ip), port); } } diff --git a/header/src/main/java/org/zstack/header/storage/backup/NbdRemoteTarget.java b/header/src/main/java/org/zstack/header/storage/backup/NbdRemoteTarget.java index 4b716f209b2..ea9d9c45ee1 100644 --- a/header/src/main/java/org/zstack/header/storage/backup/NbdRemoteTarget.java +++ b/header/src/main/java/org/zstack/header/storage/backup/NbdRemoteTarget.java @@ -2,6 +2,7 @@ import org.apache.commons.lang.StringUtils; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.network.IPv6NetworkUtils; import java.net.URI; import java.net.URISyntaxException; @@ -51,7 +52,7 @@ public String getTargetUri() { public String getTargetUri(String hostname) { StringBuilder uriBuilder = new StringBuilder(); uriBuilder.append("nbd://"); - uriBuilder.append(hostname); + uriBuilder.append(IPv6NetworkUtils.formatHostForUrl(hostname)); uriBuilder.append(":").append(this.port); if (!StringUtils.isEmpty(this.exportName)) { uriBuilder.append("/").append(this.getExportName()); diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ManagementNetworkIpv6Case.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ManagementNetworkIpv6Case.groovy index 3d8f64a1abe..cdbbc514661 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ManagementNetworkIpv6Case.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ManagementNetworkIpv6Case.groovy @@ -262,6 +262,17 @@ class ManagementNetworkIpv6Case extends SubCase { assert SshShell.formatScpTarget("root", "host-01.example.com") == "root@host-01.example.com" } + void testNbdTargetUriUsesBracketedIpv6Host() { + def backupTarget = new org.zstack.header.storage.backup.NbdRemoteTarget(IPV6, 10401, "disk0", null) + assert backupTarget.getTargetUri() == "nbd://[2001:db8::1]:10401/disk0" + assert backupTarget.getTargetUri(IPV4) == "nbd://192.168.1.10:10401/disk0" + + def addonTarget = new org.zstack.header.storage.addon.NbdRemoteTarget() + addonTarget.setIp(IPV6) + addonTarget.setPort(10401) + assert addonTarget.getResourceURI() == "nbd://[2001:db8::1]:10401" + } + void testCallbackCheckerUsesIpv6Options() { String ipv4Script = CallBackNetworkChecker.buildCallbackCheckScript("password", REST_PORT, IPV4) assert ipv4Script.contains("nc ${IPV4} ${REST_PORT}")