forked from TrueCloudLab/frostfs-api
netmap: Add LIKE
operation for filter
in policy
#1
9 changed files with 270 additions and 146 deletions
|
@ -196,7 +196,8 @@ message BearerToken {
|
|||
// valid for this specific container. Otherwise, any container of the same
|
||||
// owner is allowed.
|
||||
//
|
||||
// Deprecated: eACL tables are no longer relevant - `APEOverrides` should be used instead.
|
||||
// Deprecated: eACL tables are no longer relevant - `APEOverrides` should be
|
||||
// used instead.
|
||||
EACLTable eacl_table = 1 [ json_name = "eaclTable" ];
|
||||
|
||||
// `OwnerID` defines to whom the token was issued. It must match the request
|
||||
|
@ -223,11 +224,12 @@ message BearerToken {
|
|||
bool allow_impersonate = 4 [ json_name = "allowImpersonate" ];
|
||||
|
||||
// APEOverride is the list of APE chains defined for a target.
|
||||
// These chains are meant to serve as overrides to the already defined (or even undefined)
|
||||
// APE chains for the target (see contract `Policy`).
|
||||
// These chains are meant to serve as overrides to the already defined (or
|
||||
// even undefined) APE chains for the target (see contract `Policy`).
|
||||
//
|
||||
// The server-side processing of the bearer token with set APE overrides must verify if a client is permitted
|
||||
// to override chains for the target, preventing unauthorized access through the APE mechanism.
|
||||
// The server-side processing of the bearer token with set APE overrides
|
||||
// must verify if a client is permitted to override chains for the target,
|
||||
// preventing unauthorized access through the APE mechanism.
|
||||
message APEOverride {
|
||||
// Target for which chains are applied.
|
||||
frostfs.v2.ape.ChainTarget target = 1 [ json_name = "target" ];
|
||||
|
|
|
@ -25,7 +25,7 @@ service ContainerService {
|
|||
// request to save the container has been sent to the sidechain;
|
||||
// - Common failures (SECTION_FAILURE_COMMON);
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// container create access denied.
|
||||
// container create access denied.
|
||||
rpc Put(PutRequest) returns (PutResponse);
|
||||
|
||||
// `Delete` invokes `Container` smart contract's `Delete` method and returns
|
||||
|
@ -38,7 +38,7 @@ service ContainerService {
|
|||
// request to remove the container has been sent to the sidechain;
|
||||
// - Common failures (SECTION_FAILURE_COMMON);
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// container delete access denied.
|
||||
// container delete access denied.
|
||||
rpc Delete(DeleteRequest) returns (DeleteResponse);
|
||||
|
||||
// Returns container structure from `Container` smart contract storage.
|
||||
|
@ -50,7 +50,7 @@ service ContainerService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// requested container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied.
|
||||
// access to container is denied.
|
||||
rpc Get(GetRequest) returns (GetResponse);
|
||||
|
||||
// Returns all owner's containers from 'Container` smart contract' storage.
|
||||
|
@ -60,21 +60,9 @@ service ContainerService {
|
|||
// container list has been successfully read;
|
||||
// - Common failures (SECTION_FAILURE_COMMON);
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// container list access denied.
|
||||
// container list access denied.
|
||||
rpc List(ListRequest) returns (ListResponse);
|
||||
|
||||
// Invokes 'SetEACL' method of 'Container` smart contract and returns response
|
||||
// immediately. After one more block in sidechain, changes in an Extended ACL
|
||||
// are added into smart contract storage.
|
||||
//
|
||||
// Statuses:
|
||||
// - **OK** (0, SECTION_SUCCESS): \
|
||||
// request to save container eACL has been sent to the sidechain;
|
||||
// - Common failures (SECTION_FAILURE_COMMON);
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// set container eACL access denied.
|
||||
rpc SetExtendedACL(SetExtendedACLRequest) returns (SetExtendedACLResponse);
|
||||
|
||||
// Returns Extended ACL table and signature from `Container` smart contract
|
||||
// storage.
|
||||
//
|
||||
|
@ -87,17 +75,8 @@ service ContainerService {
|
|||
// - **EACL_NOT_FOUND** (3073, SECTION_CONTAINER): \
|
||||
// eACL table not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container eACL is denied.
|
||||
// access to container eACL is denied.
|
||||
rpc GetExtendedACL(GetExtendedACLRequest) returns (GetExtendedACLResponse);
|
||||
|
||||
// Announces the space values used by the container for P2P synchronization.
|
||||
//
|
||||
// Statuses:
|
||||
// - **OK** (0, SECTION_SUCCESS): \
|
||||
// estimation of used space has been successfully announced;
|
||||
// - Common failures (SECTION_FAILURE_COMMON).
|
||||
rpc AnnounceUsedSpace(AnnounceUsedSpaceRequest)
|
||||
returns (AnnounceUsedSpaceResponse);
|
||||
}
|
||||
|
||||
// New NeoFS Container creation request
|
||||
|
@ -283,50 +262,6 @@ message ListResponse {
|
|||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Set Extended ACL
|
||||
message SetExtendedACLRequest {
|
||||
// Set Extended ACL request body does not have separate `ContainerID`
|
||||
// reference. It will be taken from `EACLTable.container_id` field.
|
||||
message Body {
|
||||
// Extended ACL table to set for the container
|
||||
neo.fs.v2.acl.EACLTable eacl = 1;
|
||||
|
||||
// Signature of stable-marshalled Extended ACL table according to RFC-6979.
|
||||
neo.fs.v2.refs.SignatureRFC6979 signature = 2;
|
||||
}
|
||||
// Body of set extended acl request message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries request meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.RequestMetaHeader meta_header = 2;
|
||||
|
||||
// Carries request verification information. This header is used to
|
||||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.RequestVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Set Extended ACL
|
||||
message SetExtendedACLResponse {
|
||||
// `SetExtendedACLResponse` has an empty body because the operation is
|
||||
// asynchronous and the update should be reflected in `Container` smart
|
||||
// contract's storage after next block is issued in sidechain.
|
||||
message Body {}
|
||||
|
||||
// Body of set extended acl response message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries response meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.ResponseMetaHeader meta_header = 2;
|
||||
|
||||
// Carries response verification information. This header is used to
|
||||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Get Extended ACL
|
||||
message GetExtendedACLRequest {
|
||||
// Get Extended ACL request body
|
||||
|
@ -375,57 +310,3 @@ message GetExtendedACLResponse {
|
|||
// transmission.
|
||||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Announce container used space
|
||||
message AnnounceUsedSpaceRequest {
|
||||
// Container used space announcement body.
|
||||
message Body {
|
||||
// Announcement contains used space information for a single container.
|
||||
message Announcement {
|
||||
// Epoch number for which the container size estimation was produced.
|
||||
uint64 epoch = 1;
|
||||
|
||||
// Identifier of the container.
|
||||
neo.fs.v2.refs.ContainerID container_id = 2;
|
||||
|
||||
// Used space is a sum of object payload sizes of a specified
|
||||
// container, stored in the node. It must not include inhumed objects.
|
||||
uint64 used_space = 3;
|
||||
}
|
||||
|
||||
// List of announcements. If nodes share several containers,
|
||||
// announcements are transferred in a batch.
|
||||
repeated Announcement announcements = 1;
|
||||
}
|
||||
|
||||
// Body of announce used space request message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries request meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.RequestMetaHeader meta_header = 2;
|
||||
|
||||
// Carries request verification information. This header is used to
|
||||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.RequestVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Announce container used space
|
||||
message AnnounceUsedSpaceResponse {
|
||||
// `AnnounceUsedSpaceResponse` has an empty body because announcements are
|
||||
// one way communication.
|
||||
message Body {}
|
||||
|
||||
// Body of announce used space response message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries response meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.ResponseMetaHeader meta_header = 2;
|
||||
|
||||
// Carries response verification information. This header is used to
|
||||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
|
|
@ -36,6 +36,9 @@ enum Operation {
|
|||
|
||||
// Logical negation
|
||||
NOT = 9;
|
||||
|
||||
// Matches pattern
|
||||
LIKE = 10;
|
||||
}
|
||||
|
||||
// Selector modifier shows how the node set will be formed. By default selector
|
||||
|
|
|
@ -46,7 +46,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc Get(GetRequest) returns (stream GetResponse);
|
||||
|
@ -115,7 +115,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc Delete(DeleteRequest) returns (DeleteResponse);
|
||||
|
@ -145,7 +145,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc Head(HeadRequest) returns (HeadResponse);
|
||||
|
@ -171,7 +171,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// search container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc Search(SearchRequest) returns (stream SearchResponse);
|
||||
|
@ -208,7 +208,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc GetRange(GetRangeRequest) returns (stream GetRangeResponse);
|
||||
|
@ -243,7 +243,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc GetRangeHash(GetRangeHashRequest) returns (GetRangeHashResponse);
|
||||
|
@ -275,7 +275,7 @@ service ObjectService {
|
|||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object storage container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// access to container is denied;
|
||||
// - **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \
|
||||
// (for trusted object preparation) session private key does not exist or
|
||||
// has
|
||||
|
@ -283,6 +283,51 @@ service ObjectService {
|
|||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc PutSingle(PutSingleRequest) returns (PutSingleResponse);
|
||||
|
||||
// Patch the object. Request uses gRPC stream. First message must set
|
||||
// the address of the object that is going to get patched. If the object's attributes
|
||||
// are patched, then these attrubutes must be set only within the first stream message.
|
||||
//
|
||||
// If the patch request is performed by NOT the object's owner but if the actor has the permission
|
||||
// to perform the patch, then `OwnerID` of the object is changed. In this case the object's owner
|
||||
// loses the object's ownership after the patch request is successfully done.
|
||||
//
|
||||
// As objects are content-addressable the patching causes new object ID generation for the patched object.
|
||||
// This object id is set witihn `PatchResponse`. But the object id may remain unchanged in such cases:
|
||||
// 1. The chunk of the applying patch contains the same value as the object's payload within the same range;
|
||||
// 2. The patch that reverts the changes applied by preceding patch;
|
||||
// 3. The application of the same patches for the object a few times.
|
||||
//
|
||||
// Extended headers can change `Patch` behaviour:
|
||||
// * [ __SYSTEM__NETMAP_EPOCH \
|
||||
// (`__NEOFS__NETMAP_EPOCH` is deprecated) \
|
||||
// Will use the requsted version of Network Map for object placement
|
||||
// calculation.
|
||||
//
|
||||
// Please refer to detailed `XHeader` description.
|
||||
//
|
||||
// Statuses:
|
||||
// - **OK** (0, SECTION_SUCCESS): \
|
||||
// object has been successfully patched and saved in the container;
|
||||
// - Common failures (SECTION_FAILURE_COMMON);
|
||||
// - **ACCESS_DENIED** (2048, SECTION_OBJECT): \
|
||||
// write access to the container is denied;
|
||||
// - **OBJECT_NOT_FOUND** (2049, SECTION_OBJECT): \
|
||||
// object not found in container;
|
||||
// - **OBJECT_ALREADY_REMOVED** (2052, SECTION_OBJECT): \
|
||||
// the requested object has been marked as deleted.
|
||||
// - **OUT_OF_RANGE** (2053, SECTION_OBJECT): \
|
||||
// the requested range is out of bounds;
|
||||
// - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
// object storage container not found;
|
||||
// - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
// access to container is denied;
|
||||
// - **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \
|
||||
// (for trusted object preparation) session private key does not exist or
|
||||
// has been deleted;
|
||||
// - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
// provided session token has expired.
|
||||
rpc Patch(stream PatchRequest) returns (PatchResponse);
|
||||
}
|
||||
|
||||
// GET object request
|
||||
|
@ -584,8 +629,8 @@ message SearchRequest {
|
|||
// * $Object:split.splitID \
|
||||
// 16 byte UUIDv4 used to identify the split object hierarchy parts
|
||||
// * $Object:ec.parent \
|
||||
// If the object is stored according to EC policy, then ec_parent attribute
|
||||
// is set to return an id list of all related EC chunks.
|
||||
// If the object is stored according to EC policy, then ec_parent
|
||||
// attribute is set to return an id list of all related EC chunks.
|
||||
//
|
||||
// There are some well-known filter aliases to match objects by certain
|
||||
// properties:
|
||||
|
@ -816,4 +861,70 @@ message PutSingleResponse {
|
|||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// Object PATCH request
|
||||
message PatchRequest {
|
||||
// PATCH request body
|
||||
message Body {
|
||||
// The address of the object that is requested to get patched.
|
||||
neo.fs.v2.refs.Address address = 1;
|
||||
|
||||
// New attributes for the object. See `replace_attributes` flag usage to define how
|
||||
// new attributes should be set.
|
||||
repeated neo.fs.v2.object.Header.Attribute new_attributes = 2;
|
||||
|
||||
// If this flag is set, then the object's attributes will be entirely replaced by `new_attributes` list.
|
||||
// The empty `new_attributes` list with `replace_attributes = true` just resets attributes list for the object.
|
||||
//
|
||||
// Default `false` value for this flag means the attributes will be just merged. If the incoming `new_attributes`
|
||||
// list contains already existing key, then it just replaces it while merging the lists.
|
||||
bool replace_attributes = 3;
|
||||
|
||||
// The patch for the object's payload.
|
||||
message Patch {
|
||||
// The range of the source object for which the payload is replaced by the patch's chunk.
|
||||
// If the range's `length = 0`, then the patch's chunk is just appended to the original payload
|
||||
// starting from the `offest` without any replace.
|
||||
Range source_range = 1;
|
||||
|
||||
// The chunk that is being appended to or that replaces the original payload on the given range.
|
||||
bytes chunk = 2;
|
||||
}
|
||||
|
||||
// The patch that is applied for the object.
|
||||
Patch patch = 4;
|
||||
}
|
||||
|
||||
// Body for patch request message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries request meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.RequestMetaHeader meta_header = 2;
|
||||
|
||||
// Carries request verification information. This header is used to
|
||||
// authenticate the nodes of the message route and check the correctness of
|
||||
// transmission.
|
||||
neo.fs.v2.session.RequestVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
||||
// Object PATCH response
|
||||
message PatchResponse {
|
||||
// PATCH response body
|
||||
message Body {
|
||||
// The object ID of the saved patched object.
|
||||
neo.fs.v2.refs.ObjectID object_id = 1;
|
||||
}
|
||||
|
||||
// Body for patch response message.
|
||||
Body body = 1;
|
||||
|
||||
// Carries response meta information. Header data is used only to regulate
|
||||
// message transport and does not affect request execution.
|
||||
neo.fs.v2.session.ResponseMetaHeader meta_header = 2;
|
||||
|
||||
// Carries response verification information. This header is used to authenticate
|
||||
// the nodes of the message route and check the correctness of transmission.
|
||||
neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
|
||||
}
|
||||
|
|
|
@ -209,13 +209,15 @@ message Header {
|
|||
// Chunk of a parent header.
|
||||
bytes header = 5 [ json_name = "header" ];
|
||||
// As the origin object is EC-splitted its identifier is known to all
|
||||
// chunks as parent. But parent itself can be a part of Split (does not relate to EC-split).
|
||||
// In this case parent_split_id should be set.
|
||||
// chunks as parent. But parent itself can be a part of Split (does not
|
||||
// relate to EC-split). In this case parent_split_id should be set.
|
||||
bytes parent_split_id = 6 [ json_name = "parentSplitID" ];
|
||||
// EC-parent's parent ID. parent_split_parent_id is set if EC-parent, itself, is a part of Split and
|
||||
// if an object ID of its parent is presented. The field allows to determine how EC-chunk is placed
|
||||
// in Split hierarchy.
|
||||
neo.fs.v2.refs.ObjectID parent_split_parent_id = 7 [ json_name = "parentSplitParentID" ];
|
||||
// EC-parent's parent ID. parent_split_parent_id is set if EC-parent,
|
||||
// itself, is a part of Split and if an object ID of its parent is
|
||||
// presented. The field allows to determine how EC-chunk is placed in Split
|
||||
// hierarchy.
|
||||
neo.fs.v2.refs.ObjectID parent_split_parent_id = 7
|
||||
[ json_name = "parentSplitParentID" ];
|
||||
// EC parent's attributes.
|
||||
repeated Attribute parent_attributes = 8 [ json_name = "parentAttributes" ];
|
||||
}
|
||||
|
|
|
@ -30,6 +30,11 @@
|
|||
- [HeadResponse](#neo.fs.v2.object.HeadResponse)
|
||||
- [HeadResponse.Body](#neo.fs.v2.object.HeadResponse.Body)
|
||||
- [HeaderWithSignature](#neo.fs.v2.object.HeaderWithSignature)
|
||||
- [PatchRequest](#neo.fs.v2.object.PatchRequest)
|
||||
- [PatchRequest.Body](#neo.fs.v2.object.PatchRequest.Body)
|
||||
- [PatchRequest.Body.Patch](#neo.fs.v2.object.PatchRequest.Body.Patch)
|
||||
- [PatchResponse](#neo.fs.v2.object.PatchResponse)
|
||||
- [PatchResponse.Body](#neo.fs.v2.object.PatchResponse.Body)
|
||||
- [PutRequest](#neo.fs.v2.object.PutRequest)
|
||||
- [PutRequest.Body](#neo.fs.v2.object.PutRequest.Body)
|
||||
- [PutRequest.Body.Init](#neo.fs.v2.object.PutRequest.Body.Init)
|
||||
|
@ -88,6 +93,7 @@ rpc Search(SearchRequest) returns (stream SearchResponse);
|
|||
rpc GetRange(GetRangeRequest) returns (stream GetRangeResponse);
|
||||
rpc GetRangeHash(GetRangeHashRequest) returns (GetRangeHashResponse);
|
||||
rpc PutSingle(PutSingleRequest) returns (PutSingleResponse);
|
||||
rpc Patch(stream PatchRequest) returns (PatchResponse);
|
||||
|
||||
```
|
||||
|
||||
|
@ -395,6 +401,55 @@ been deleted;
|
|||
| Name | Input | Output |
|
||||
| ---- | ----- | ------ |
|
||||
| PutSingle | [PutSingleRequest](#neo.fs.v2.object.PutSingleRequest) | [PutSingleResponse](#neo.fs.v2.object.PutSingleResponse) |
|
||||
#### Method Patch
|
||||
|
||||
Patch the object. Request uses gRPC stream. First message must set
|
||||
the address of the object that is going to get patched. If the object's attributes
|
||||
are patched, then these attrubutes must be set only within the first stream message.
|
||||
|
||||
If the patch request is performed by NOT the object's owner but if the actor has the permission
|
||||
to perform the patch, then `OwnerID` of the object is changed. In this case the object's owner
|
||||
loses the object's ownership after the patch request is successfully done.
|
||||
|
||||
As objects are content-addressable the patching causes new object ID generation for the patched object.
|
||||
This object id is set witihn `PatchResponse`. But the object id may remain unchanged in such cases:
|
||||
1. The chunk of the applying patch contains the same value as the object's payload within the same range;
|
||||
2. The patch that reverts the changes applied by preceding patch;
|
||||
3. The application of the same patches for the object a few times.
|
||||
|
||||
Extended headers can change `Patch` behaviour:
|
||||
* [ __SYSTEM__NETMAP_EPOCH \
|
||||
(`__NEOFS__NETMAP_EPOCH` is deprecated) \
|
||||
Will use the requsted version of Network Map for object placement
|
||||
calculation.
|
||||
|
||||
Please refer to detailed `XHeader` description.
|
||||
|
||||
Statuses:
|
||||
- **OK** (0, SECTION_SUCCESS): \
|
||||
object has been successfully patched and saved in the container;
|
||||
- Common failures (SECTION_FAILURE_COMMON);
|
||||
- **ACCESS_DENIED** (2048, SECTION_OBJECT): \
|
||||
write access to the container is denied;
|
||||
- **OBJECT_NOT_FOUND** (2049, SECTION_OBJECT): \
|
||||
object not found in container;
|
||||
- **OBJECT_ALREADY_REMOVED** (2052, SECTION_OBJECT): \
|
||||
the requested object has been marked as deleted.
|
||||
- **OUT_OF_RANGE** (2053, SECTION_OBJECT): \
|
||||
the requested range is out of bounds;
|
||||
- **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \
|
||||
object storage container not found;
|
||||
- **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \
|
||||
access to container is denied;
|
||||
- **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \
|
||||
(for trusted object preparation) session private key does not exist or
|
||||
has been deleted;
|
||||
- **TOKEN_EXPIRED** (4097, SECTION_SESSION): \
|
||||
provided session token has expired.
|
||||
|
||||
| Name | Input | Output |
|
||||
| ---- | ----- | ------ |
|
||||
| Patch | [PatchRequest](#neo.fs.v2.object.PatchRequest) | [PatchResponse](#neo.fs.v2.object.PatchResponse) |
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
@ -691,6 +746,71 @@ following steps:
|
|||
| signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Signed `ObjectID` to verify full header's authenticity |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PatchRequest"></a>
|
||||
|
||||
### Message PatchRequest
|
||||
Object PATCH request
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| body | [PatchRequest.Body](#neo.fs.v2.object.PatchRequest.Body) | | Body for patch request message. |
|
||||
| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. |
|
||||
| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PatchRequest.Body"></a>
|
||||
|
||||
### Message PatchRequest.Body
|
||||
PATCH request body
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| address | [neo.fs.v2.refs.Address](#neo.fs.v2.refs.Address) | | The address of the object that is requested to get patched. |
|
||||
| new_attributes | [Header.Attribute](#neo.fs.v2.object.Header.Attribute) | repeated | New attributes for the object. See `replace_attributes` flag usage to define how new attributes should be set. |
|
||||
| replace_attributes | [bool](#bool) | | If this flag is set, then the object's attributes will be entirely replaced by `new_attributes` list. The empty `new_attributes` list with `replace_attributes = true` just resets attributes list for the object.
|
||||
|
||||
Default `false` value for this flag means the attributes will be just merged. If the incoming `new_attributes` list contains already existing key, then it just replaces it while merging the lists. |
|
||||
| patch | [PatchRequest.Body.Patch](#neo.fs.v2.object.PatchRequest.Body.Patch) | | The patch that is applied for the object. |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PatchRequest.Body.Patch"></a>
|
||||
|
||||
### Message PatchRequest.Body.Patch
|
||||
The patch for the object's payload.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| source_range | [Range](#neo.fs.v2.object.Range) | | The range of the source object for which the payload is replaced by the patch's chunk. If the range's `length = 0`, then the patch's chunk is just appended to the original payload starting from the `offest` without any replace. |
|
||||
| chunk | [bytes](#bytes) | | The chunk that is being appended to or that replaces the original payload on the given range. |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PatchResponse"></a>
|
||||
|
||||
### Message PatchResponse
|
||||
Object PATCH response
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| body | [PatchResponse.Body](#neo.fs.v2.object.PatchResponse.Body) | | Body for patch response message. |
|
||||
| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. |
|
||||
| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PatchResponse.Body"></a>
|
||||
|
||||
### Message PatchResponse.Body
|
||||
PATCH response body
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| object_id | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | | The object ID of the saved patched object. |
|
||||
|
||||
|
||||
<a name="neo.fs.v2.object.PutRequest"></a>
|
||||
|
||||
### Message PutRequest
|
||||
|
|
|
@ -338,6 +338,7 @@ Object request verbs
|
|||
| DELETE | 5 | Refers to object.Delete RPC call |
|
||||
| RANGE | 6 | Refers to object.GetRange RPC call |
|
||||
| RANGEHASH | 7 | Refers to object.GetRangeHash RPC call |
|
||||
| PATCH | 8 | Refers to object.Patch RPC call |
|
||||
|
||||
|
||||
<!-- end enums -->
|
||||
|
|
|
@ -36,6 +36,9 @@ message ObjectSessionContext {
|
|||
|
||||
// Refers to object.GetRangeHash RPC call
|
||||
RANGEHASH = 7;
|
||||
|
||||
// Refers to object.Patch RPC call
|
||||
PATCH = 8;
|
||||
}
|
||||
// Type of request for which the token is issued
|
||||
Verb verb = 1 [ json_name = "verb" ];
|
||||
|
|
|
@ -106,7 +106,8 @@ enum CommonFail {
|
|||
NODE_UNDER_MAINTENANCE = 3;
|
||||
|
||||
// [**1028**] Invalid argument error. If the server fails on validation of a
|
||||
// request parameter as the client sent it incorrectly, then this code should be used.
|
||||
// request parameter as the client sent it incorrectly, then this code should
|
||||
// be used.
|
||||
INVALID_ARGUMENT = 4;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue