xref: /spdk/proto/sma.proto (revision 2f2c95ec8838c28abc931526d6789a2995557cf2)
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