From c3c0f0ceddaa497fc874c3ea49b4b320f3edd291 Mon Sep 17 00:00:00 2001 From: Eugenio Grosso Date: Mon, 20 Apr 2026 22:06:00 +0000 Subject: [PATCH] adapter: add NVMETCP address type and FlashArrayConnection.nsid Preparatory data-model changes for NVMe-TCP support on the adaptive storage framework. No behaviour change for existing Fibre Channel users - the extra enum value, field, and getter/setter are only exercised by callers that explicitly use them. ProviderVolume.AddressType gains a NVMETCP value alongside FIBERWWN, so adapters can declare that a volume is addressed by an NVMe EUI-128 (NGUID) rather than a SCSI WWN. FlashArrayVolume.getAddress() produces the NGUID layout expected by the Linux kernel for a FlashArray NVMe namespace: 00 + serial[0:14] + 24a937 (Pure 6-hex OUI) + serial[14:24] which matches the /dev/disk/by-id/nvme-eui. symlink emitted by udev. Fibre Channel callers (addressType != NVMETCP) still get the existing 6 + 24a9370 + serial form. FlashArrayConnection gains a nsid field to carry the namespace id the FlashArray REST API attaches to host-group-scoped NVMe connections, when it is present. --- .../storage/datastore/adapter/ProviderVolume.java | 3 ++- .../adapter/flasharray/FlashArrayConnection.java | 9 +++++++++ .../adapter/flasharray/FlashArrayVolume.java | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/storage/volume/adaptive/src/main/java/org/apache/cloudstack/storage/datastore/adapter/ProviderVolume.java b/plugins/storage/volume/adaptive/src/main/java/org/apache/cloudstack/storage/datastore/adapter/ProviderVolume.java index 25577903e3d..a954560508c 100644 --- a/plugins/storage/volume/adaptive/src/main/java/org/apache/cloudstack/storage/datastore/adapter/ProviderVolume.java +++ b/plugins/storage/volume/adaptive/src/main/java/org/apache/cloudstack/storage/datastore/adapter/ProviderVolume.java @@ -35,6 +35,7 @@ public interface ProviderVolume { public String getExternalName(); public String getExternalConnectionId(); public enum AddressType { - FIBERWWN + FIBERWWN, + NVMETCP } } diff --git a/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayConnection.java b/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayConnection.java index 76cec9f70c4..b115035fda2 100644 --- a/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayConnection.java +++ b/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayConnection.java @@ -31,6 +31,8 @@ public class FlashArrayConnection { private FlashArrayVolume volume; @JsonProperty("lun") private Integer lun; + @JsonProperty("nsid") + private Integer nsid; public FlashArrayConnectionHostgroup getHostGroup() { return hostGroup; @@ -64,5 +66,12 @@ public class FlashArrayConnection { this.lun = lun; } + public Integer getNsid() { + return nsid; + } + + public void setNsid(Integer nsid) { + this.nsid = nsid; + } } diff --git a/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayVolume.java b/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayVolume.java index a3201a753a7..45d73586daa 100644 --- a/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayVolume.java +++ b/plugins/storage/volume/flasharray/src/main/java/org/apache/cloudstack/storage/datastore/adapter/flasharray/FlashArrayVolume.java @@ -27,6 +27,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonInclude(JsonInclude.Include.NON_NULL) public class FlashArrayVolume implements ProviderSnapshot { public static final String PURE_OUI = "24a9370"; + // The 3-byte OUI as it appears inside an NVMe EUI-128 (no trailing nibble). + // FC WWNs use a 7-hex-digit Pure OUI; NVMe NGUIDs embed the same vendor + // prefix in its raw 6-hex-digit form. + public static final String PURE_OUI_EUI = "24a937"; @JsonProperty("destroyed") private Boolean destroyed; @@ -107,6 +111,13 @@ public class FlashArrayVolume implements ProviderSnapshot { @JsonIgnore public String getAddress() { if (serial == null) return null; + if (AddressType.NVMETCP.equals(addressType)) { + // EUI-128 layout for FlashArray NVMe namespaces: + // 00 + serial[0:14] + + serial[14:24] + // This is the value the Linux kernel exposes as + // /dev/disk/by-id/nvme-eui. + return ("00" + serial.substring(0, 14) + PURE_OUI_EUI + serial.substring(14)).toLowerCase(); + } return ("6" + PURE_OUI + serial).toLowerCase(); } @Override