Spdk/proto/sma.proto
Konrad Sztyber c996aff28d build: move protobuf files to a top-level directory
Up until now, the protobuf files were all located under
`python/spdk/sma/proto`.  This was fine, as they were only used in SMA
and we only generated python code.  However, now, we would also like to
to output code for other (e.g. go) languages too, so it no longer make
sense to keep them under `python`.

Only the protobuf files will be stored under `proto`.  The autogenerated
python code will remain under `python`, while the go code will be put in
the `go` directory.

While here, simplified the Makefile by removing a function generating
rules based on a directory, because we keep all protobuf files in the
same location.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I4dcb7b33cd6f2930732f04dee62e35571b09315b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15016
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
2022-10-18 07:23:54 +00:00

195 lines
5.3 KiB
Protocol Buffer

syntax = "proto3";
import "nvme.proto";
import "virtio_blk.proto";
import "nvmf_tcp.proto";
import "nvmf.proto";
// This file provides the generic definitions for the Storage Management Agent
// gRPC calls. All of the methods are supposed to be idempotent. Errors are
// reported as standard gRPC status codes.
package sma;
option go_package = "spdk.io/sma";
// Enumeration defining types of devices
enum DeviceType {
DEVICE_TYPE_INVALID = 0;
DEVICE_TYPE_NVME = 1;
DEVICE_TYPE_VIRTIO_BLK = 2;
DEVICE_TYPE_NVMF_TCP = 3;
}
// Volume's crypto parameters
message VolumeCryptoParameters {
// Key to be used for encryption
bytes key = 1;
// Second key (only required by some ciphers)
bytes key2 = 2;
enum Cipher {
AES_CBC = 0;
AES_XTS = 1;
}
// Cipher to use
Cipher cipher = 3;
}
// Parameters describing a volume
message VolumeParameters {
// Volume GUID/UUID
bytes volume_id = 1;
oneof connection_params {
// NVMeoF volume
nvmf.VolumeConnectionParameters nvmf = 2;
}
// Crypto parameters (optional)
VolumeCryptoParameters crypto = 3;
}
// Create device request
message CreateDeviceRequest {
// Volume to immediately attach to the created device. This field may be
// optional for some device types (e.g. NVMe), while it may be required for
// others (e.g. virtio-blk).
VolumeParameters volume = 1;
// Device-specific parameters
oneof params {
// NVMe parameters
nvme.DeviceParameters nvme = 2;
// Virtio-blk parameters
virtio_blk.DeviceParameters virtio_blk = 3;
// NVMe/TCP parameters
nvmf_tcp.DeviceParameters nvmf_tcp = 4;
}
}
// Create device response
message CreateDeviceResponse {
// Device handle that can uniquely identify a device within an instance of
// Storage Management Agent
string handle = 1;
}
// Delete device request
message DeleteDeviceRequest {
// Device handle
string handle = 1;
}
// Delete device response
message DeleteDeviceResponse {}
// Attach volume request
message AttachVolumeRequest {
// Volume parameters
VolumeParameters volume = 1;
// Device handle
string device_handle = 2;
}
// Attach volume response
message AttachVolumeResponse {}
// Detach volume request
message DetachVolumeRequest {
// Volume GUID/UUID
bytes volume_id = 1;
// Device handle
string device_handle = 2;
}
// Detach volume response
message DetachVolumeResponse {}
// QoS limit values. 0 means unlimited, while UINT64_MAX means to leave the
// current limit value unchanged. If one of the limits isn't supported by a
// given device/volume, it must be set to 0.
message QosLimit {
// Read kIOPS
uint64 rd_iops = 1;
// Write kIOPS
uint64 wr_iops = 2;
// Read/write kIOPS
uint64 rw_iops = 3;
// Read bandwidth (MB/s)
uint64 rd_bandwidth = 4;
// Write bandwidth (MB/s)
uint64 wr_bandwidth = 5;
// Read/write bandwidth (MB/s)
uint64 rw_bandwidth = 6;
}
// SetQos request
message SetQosRequest {
// Device handle
string device_handle = 1;
// GUID/UUID of a volume to configure QoS on. If this parameter is omitted,
// the QoS will be set up on the whole device (all volumes attached to that
// device will share QoS settings). Some device types might only support
// configuring QoS on per-device (volume_id must be empty) or per-volume level
// (volume_id cannot be empty). This information can be obtained by sending a
// GetQosCapabilities request.
bytes volume_id = 2;
// Maximum allowed IOPS/bandwidth
QosLimit maximum = 3;
}
// SetQos response
message SetQosResponse {}
// Get QoS capabilities request
message GetQosCapabilitiesRequest {
// Type of a device to query for QoS capabilities
DeviceType device_type = 1;
}
// Get QoS capabilities response
message GetQosCapabilitiesResponse {
message QosCapabilities {
// Read IOPS
bool rd_iops = 1;
// Write IOPS
bool wr_iops = 2;
// Read/write IOPS
bool rw_iops = 3;
// Read bandwidth
bool rd_bandwidth = 4;
// Write bandwidth
bool wr_bandwidth = 5;
// Read/write bandwidth
bool rw_bandwidth = 6;
}
// Device level maximum QoS limits
QosCapabilities max_device_caps = 1;
// Volume level maximum QoS limits
QosCapabilities max_volume_caps = 2;
};
// Storage Management Agent gRPC service definition
service StorageManagementAgent {
// Creates a new device. A device is an entity that can be used to expose
// volumes (e.g. an NVMeoF subsystem).
rpc CreateDevice (CreateDeviceRequest)
returns (CreateDeviceResponse) {}
// Deletes a device
rpc DeleteDevice (DeleteDeviceRequest)
returns (DeleteDeviceResponse) {}
// Attaches a volume to a specified device making it available through that
// device (e.g. for NVMeoF this results in adding a namespace to an NVMeoF
// subsystem). The type of volume doesn't need to match the type of device
// (e.g. it's perfectly fine to attach an NVMe/TCP volume to a virtio-blk
// device).
rpc AttachVolume (AttachVolumeRequest)
returns (AttachVolumeResponse) {}
// Detaches a volume from a device
rpc DetachVolume (DetachVolumeRequest)
returns (DetachVolumeResponse) {}
// Configures QoS on a device/volume
rpc SetQos (SetQosRequest)
returns (SetQosResponse) {}
// Returns QoS capabilities of a given device type
rpc GetQosCapabilities (GetQosCapabilitiesRequest)
returns (GetQosCapabilitiesResponse) {}
}