1c996aff2SKonrad Sztybersyntax = "proto3"; 2c996aff2SKonrad Sztyber 3c996aff2SKonrad Sztyberimport "nvme.proto"; 4c996aff2SKonrad Sztyberimport "virtio_blk.proto"; 5c996aff2SKonrad Sztyberimport "nvmf_tcp.proto"; 6c996aff2SKonrad Sztyberimport "nvmf.proto"; 7c996aff2SKonrad Sztyber 8c996aff2SKonrad Sztyber// This file provides the generic definitions for the Storage Management Agent 9c996aff2SKonrad Sztyber// gRPC calls. All of the methods are supposed to be idempotent. Errors are 10c996aff2SKonrad Sztyber// reported as standard gRPC status codes. 11c996aff2SKonrad Sztyber 12c996aff2SKonrad Sztyberpackage sma; 13c996aff2SKonrad Sztyber 14*2f2c95ecSAntti Kervinenoption go_package = "github.com/spdk/sma-goapi/v1alpha1"; 15c996aff2SKonrad Sztyber 16c996aff2SKonrad Sztyber// Enumeration defining types of devices 17c996aff2SKonrad Sztyberenum DeviceType { 18c996aff2SKonrad Sztyber DEVICE_TYPE_INVALID = 0; 19c996aff2SKonrad Sztyber DEVICE_TYPE_NVME = 1; 20c996aff2SKonrad Sztyber DEVICE_TYPE_VIRTIO_BLK = 2; 21c996aff2SKonrad Sztyber DEVICE_TYPE_NVMF_TCP = 3; 22c996aff2SKonrad Sztyber} 23c996aff2SKonrad Sztyber 24c996aff2SKonrad Sztyber// Volume's crypto parameters 25c996aff2SKonrad Sztybermessage VolumeCryptoParameters { 26c996aff2SKonrad Sztyber // Key to be used for encryption 27c996aff2SKonrad Sztyber bytes key = 1; 28c996aff2SKonrad Sztyber // Second key (only required by some ciphers) 29c996aff2SKonrad Sztyber bytes key2 = 2; 30c996aff2SKonrad Sztyber enum Cipher { 31c996aff2SKonrad Sztyber AES_CBC = 0; 32c996aff2SKonrad Sztyber AES_XTS = 1; 33c996aff2SKonrad Sztyber } 34c996aff2SKonrad Sztyber // Cipher to use 35c996aff2SKonrad Sztyber Cipher cipher = 3; 3634083991SMichal Rozegnal // Tweak mode - determine how nvme LBA is converted into tweak 3734083991SMichal Rozegnal enum TweakMode { 3834083991SMichal Rozegnal // default for SPDK bdev_crypto 3934083991SMichal Rozegnal // Tweak[127:0] = {64'b0, LBA[63:0]} 4034083991SMichal Rozegnal TWEAK_MODE_SIMPLE_LBA = 0; 4134083991SMichal Rozegnal 4234083991SMichal Rozegnal // Tweak[127:0] = {1’b0, ~LBA[62:0], LBA[63:0]} 43d6c42f87SMichal Rozegnal TWEAK_MODE_JOIN_NEG_LBA_WITH_LBA = 1; 4434083991SMichal Rozegnal 4534083991SMichal Rozegnal // tweak is derived from nvme LBA that is internally incremented by 1 for every 512 bytes processed 4634083991SMichal Rozegnal // so initial lba = (BLOCK_SIZE_IN_BYTES / 512) * LBA 4734083991SMichal Rozegnal // Tweak[127:0] = {lba[127:0]} 48d6c42f87SMichal Rozegnal TWEAK_MODE_INCR_512_FULL_LBA = 2; 4934083991SMichal Rozegnal 5034083991SMichal Rozegnal // tweak is derived from nvme LBA that is internally incremented by 1 for every 512 bytes processed 5134083991SMichal Rozegnal // so initial lba = (BLOCK_SIZE_IN_BYTES / 512) * LBA 5234083991SMichal Rozegnal // Tweak[127:0] = {lba[63:0], 64'b0} 53d6c42f87SMichal Rozegnal TWEAK_MODE_INCR_512_UPPER_LBA = 3; 5434083991SMichal Rozegnal } 5534083991SMichal Rozegnal TweakMode tweak_mode = 4; 56c996aff2SKonrad Sztyber} 57c996aff2SKonrad Sztyber 58c996aff2SKonrad Sztyber// Parameters describing a volume 59c996aff2SKonrad Sztybermessage VolumeParameters { 60c996aff2SKonrad Sztyber // Volume GUID/UUID 61c996aff2SKonrad Sztyber bytes volume_id = 1; 62c996aff2SKonrad Sztyber oneof connection_params { 63c996aff2SKonrad Sztyber // NVMeoF volume 64c996aff2SKonrad Sztyber nvmf.VolumeConnectionParameters nvmf = 2; 65c996aff2SKonrad Sztyber } 66c996aff2SKonrad Sztyber // Crypto parameters (optional) 67c996aff2SKonrad Sztyber VolumeCryptoParameters crypto = 3; 68c996aff2SKonrad Sztyber} 69c996aff2SKonrad Sztyber 70c996aff2SKonrad Sztyber// Create device request 71c996aff2SKonrad Sztybermessage CreateDeviceRequest { 72c996aff2SKonrad Sztyber // Volume to immediately attach to the created device. This field may be 73c996aff2SKonrad Sztyber // optional for some device types (e.g. NVMe), while it may be required for 74c996aff2SKonrad Sztyber // others (e.g. virtio-blk). 75c996aff2SKonrad Sztyber VolumeParameters volume = 1; 76c996aff2SKonrad Sztyber // Device-specific parameters 77c996aff2SKonrad Sztyber oneof params { 78c996aff2SKonrad Sztyber // NVMe parameters 79c996aff2SKonrad Sztyber nvme.DeviceParameters nvme = 2; 80c996aff2SKonrad Sztyber // Virtio-blk parameters 81c996aff2SKonrad Sztyber virtio_blk.DeviceParameters virtio_blk = 3; 82c996aff2SKonrad Sztyber // NVMe/TCP parameters 83c996aff2SKonrad Sztyber nvmf_tcp.DeviceParameters nvmf_tcp = 4; 84c996aff2SKonrad Sztyber } 85c996aff2SKonrad Sztyber} 86c996aff2SKonrad Sztyber 87c996aff2SKonrad Sztyber// Create device response 88c996aff2SKonrad Sztybermessage CreateDeviceResponse { 89c996aff2SKonrad Sztyber // Device handle that can uniquely identify a device within an instance of 90c996aff2SKonrad Sztyber // Storage Management Agent 91c996aff2SKonrad Sztyber string handle = 1; 92c996aff2SKonrad Sztyber} 93c996aff2SKonrad Sztyber 94c996aff2SKonrad Sztyber// Delete device request 95c996aff2SKonrad Sztybermessage DeleteDeviceRequest { 96c996aff2SKonrad Sztyber // Device handle 97c996aff2SKonrad Sztyber string handle = 1; 98c996aff2SKonrad Sztyber} 99c996aff2SKonrad Sztyber 100c996aff2SKonrad Sztyber// Delete device response 101c996aff2SKonrad Sztybermessage DeleteDeviceResponse {} 102c996aff2SKonrad Sztyber 103c996aff2SKonrad Sztyber// Attach volume request 104c996aff2SKonrad Sztybermessage AttachVolumeRequest { 105c996aff2SKonrad Sztyber // Volume parameters 106c996aff2SKonrad Sztyber VolumeParameters volume = 1; 107c996aff2SKonrad Sztyber // Device handle 108c996aff2SKonrad Sztyber string device_handle = 2; 109c996aff2SKonrad Sztyber} 110c996aff2SKonrad Sztyber 111c996aff2SKonrad Sztyber// Attach volume response 112c996aff2SKonrad Sztybermessage AttachVolumeResponse {} 113c996aff2SKonrad Sztyber 114c996aff2SKonrad Sztyber// Detach volume request 115c996aff2SKonrad Sztybermessage DetachVolumeRequest { 116c996aff2SKonrad Sztyber // Volume GUID/UUID 117c996aff2SKonrad Sztyber bytes volume_id = 1; 118c996aff2SKonrad Sztyber // Device handle 119c996aff2SKonrad Sztyber string device_handle = 2; 120c996aff2SKonrad Sztyber} 121c996aff2SKonrad Sztyber 122c996aff2SKonrad Sztyber// Detach volume response 123c996aff2SKonrad Sztybermessage DetachVolumeResponse {} 124c996aff2SKonrad Sztyber 125c996aff2SKonrad Sztyber// QoS limit values. 0 means unlimited, while UINT64_MAX means to leave the 126c996aff2SKonrad Sztyber// current limit value unchanged. If one of the limits isn't supported by a 127c996aff2SKonrad Sztyber// given device/volume, it must be set to 0. 128c996aff2SKonrad Sztybermessage QosLimit { 129c996aff2SKonrad Sztyber // Read kIOPS 130c996aff2SKonrad Sztyber uint64 rd_iops = 1; 131c996aff2SKonrad Sztyber // Write kIOPS 132c996aff2SKonrad Sztyber uint64 wr_iops = 2; 133c996aff2SKonrad Sztyber // Read/write kIOPS 134c996aff2SKonrad Sztyber uint64 rw_iops = 3; 135c996aff2SKonrad Sztyber // Read bandwidth (MB/s) 136c996aff2SKonrad Sztyber uint64 rd_bandwidth = 4; 137c996aff2SKonrad Sztyber // Write bandwidth (MB/s) 138c996aff2SKonrad Sztyber uint64 wr_bandwidth = 5; 139c996aff2SKonrad Sztyber // Read/write bandwidth (MB/s) 140c996aff2SKonrad Sztyber uint64 rw_bandwidth = 6; 141c996aff2SKonrad Sztyber} 142c996aff2SKonrad Sztyber 143c996aff2SKonrad Sztyber// SetQos request 144c996aff2SKonrad Sztybermessage SetQosRequest { 145c996aff2SKonrad Sztyber // Device handle 146c996aff2SKonrad Sztyber string device_handle = 1; 147c996aff2SKonrad Sztyber // GUID/UUID of a volume to configure QoS on. If this parameter is omitted, 148c996aff2SKonrad Sztyber // the QoS will be set up on the whole device (all volumes attached to that 149c996aff2SKonrad Sztyber // device will share QoS settings). Some device types might only support 150c996aff2SKonrad Sztyber // configuring QoS on per-device (volume_id must be empty) or per-volume level 151c996aff2SKonrad Sztyber // (volume_id cannot be empty). This information can be obtained by sending a 152c996aff2SKonrad Sztyber // GetQosCapabilities request. 153c996aff2SKonrad Sztyber bytes volume_id = 2; 154c996aff2SKonrad Sztyber // Maximum allowed IOPS/bandwidth 155c996aff2SKonrad Sztyber QosLimit maximum = 3; 156c996aff2SKonrad Sztyber} 157c996aff2SKonrad Sztyber 158c996aff2SKonrad Sztyber// SetQos response 159c996aff2SKonrad Sztybermessage SetQosResponse {} 160c996aff2SKonrad Sztyber 161c996aff2SKonrad Sztyber// Get QoS capabilities request 162c996aff2SKonrad Sztybermessage GetQosCapabilitiesRequest { 163c996aff2SKonrad Sztyber // Type of a device to query for QoS capabilities 164c996aff2SKonrad Sztyber DeviceType device_type = 1; 165c996aff2SKonrad Sztyber} 166c996aff2SKonrad Sztyber 167c996aff2SKonrad Sztyber// Get QoS capabilities response 168c996aff2SKonrad Sztybermessage GetQosCapabilitiesResponse { 169c996aff2SKonrad Sztyber message QosCapabilities { 170c996aff2SKonrad Sztyber // Read IOPS 171c996aff2SKonrad Sztyber bool rd_iops = 1; 172c996aff2SKonrad Sztyber // Write IOPS 173c996aff2SKonrad Sztyber bool wr_iops = 2; 174c996aff2SKonrad Sztyber // Read/write IOPS 175c996aff2SKonrad Sztyber bool rw_iops = 3; 176c996aff2SKonrad Sztyber // Read bandwidth 177c996aff2SKonrad Sztyber bool rd_bandwidth = 4; 178c996aff2SKonrad Sztyber // Write bandwidth 179c996aff2SKonrad Sztyber bool wr_bandwidth = 5; 180c996aff2SKonrad Sztyber // Read/write bandwidth 181c996aff2SKonrad Sztyber bool rw_bandwidth = 6; 182c996aff2SKonrad Sztyber } 183c996aff2SKonrad Sztyber // Device level maximum QoS limits 184c996aff2SKonrad Sztyber QosCapabilities max_device_caps = 1; 185c996aff2SKonrad Sztyber // Volume level maximum QoS limits 186c996aff2SKonrad Sztyber QosCapabilities max_volume_caps = 2; 187c996aff2SKonrad Sztyber}; 188c996aff2SKonrad Sztyber 189c996aff2SKonrad Sztyber// Storage Management Agent gRPC service definition 190c996aff2SKonrad Sztyberservice StorageManagementAgent { 191c996aff2SKonrad Sztyber // Creates a new device. A device is an entity that can be used to expose 192c996aff2SKonrad Sztyber // volumes (e.g. an NVMeoF subsystem). 193c996aff2SKonrad Sztyber rpc CreateDevice (CreateDeviceRequest) 194c996aff2SKonrad Sztyber returns (CreateDeviceResponse) {} 195b7964a3cSKonrad Sztyber // Deletes a device. It is only allowed to delete a device with volumes still 196b7964a3cSKonrad Sztyber // attached if that device doesn't support attaching volumes through 197b7964a3cSKonrad Sztyber // AttachVolume (e.g. virtio-blk). In other cases, it is forbidden and 198b7964a3cSKonrad Sztyber // FAILED_PRECONDITION status will be returned. 199c996aff2SKonrad Sztyber rpc DeleteDevice (DeleteDeviceRequest) 200c996aff2SKonrad Sztyber returns (DeleteDeviceResponse) {} 201c996aff2SKonrad Sztyber // Attaches a volume to a specified device making it available through that 202c996aff2SKonrad Sztyber // device (e.g. for NVMeoF this results in adding a namespace to an NVMeoF 203c996aff2SKonrad Sztyber // subsystem). The type of volume doesn't need to match the type of device 204c996aff2SKonrad Sztyber // (e.g. it's perfectly fine to attach an NVMe/TCP volume to a virtio-blk 205c996aff2SKonrad Sztyber // device). 206c996aff2SKonrad Sztyber rpc AttachVolume (AttachVolumeRequest) 207c996aff2SKonrad Sztyber returns (AttachVolumeResponse) {} 208c996aff2SKonrad Sztyber // Detaches a volume from a device 209c996aff2SKonrad Sztyber rpc DetachVolume (DetachVolumeRequest) 210c996aff2SKonrad Sztyber returns (DetachVolumeResponse) {} 211c996aff2SKonrad Sztyber // Configures QoS on a device/volume 212c996aff2SKonrad Sztyber rpc SetQos (SetQosRequest) 213c996aff2SKonrad Sztyber returns (SetQosResponse) {} 214c996aff2SKonrad Sztyber // Returns QoS capabilities of a given device type 215c996aff2SKonrad Sztyber rpc GetQosCapabilities (GetQosCapabilitiesRequest) 216c996aff2SKonrad Sztyber returns (GetQosCapabilitiesResponse) {} 217c996aff2SKonrad Sztyber} 218