ape: Provide request actor as an additional target #1089
12 changed files with 613 additions and 563 deletions
2
go.mod
2
go.mod
|
@ -9,7 +9,7 @@ require (
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20231101111734-b3ad3335ff65
|
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20231101111734-b3ad3335ff65
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20240301150205-6fe4e2541d0b
|
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20240301150205-6fe4e2541d0b
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1
|
||||||
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240410114823-1f190e1668ec
|
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240412130734-0e69e485115a
|
||||||
git.frostfs.info/TrueCloudLab/tzhash v1.8.0
|
git.frostfs.info/TrueCloudLab/tzhash v1.8.0
|
||||||
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02
|
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02
|
||||||
github.com/cheggaaa/pb v1.0.29
|
github.com/cheggaaa/pb v1.0.29
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -12,8 +12,8 @@ git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20240301150205-6fe4e2541d0b
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20240301150205-6fe4e2541d0b/go.mod h1:XcgrbZ88XfvhAMxmZCQJ0dv6FyRSq6Mg2J7nN8uuO0k=
|
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20240301150205-6fe4e2541d0b/go.mod h1:XcgrbZ88XfvhAMxmZCQJ0dv6FyRSq6Mg2J7nN8uuO0k=
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1 h1:ccBRK21rFvY5R1WotI6LNoPlizk7qSvdfD8lNIRudVc=
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1 h1:ccBRK21rFvY5R1WotI6LNoPlizk7qSvdfD8lNIRudVc=
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1/go.mod h1:C1Ygde2n843yTZEQ0FP69jYiuaYV0kriLvP4zm8JuvM=
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1/go.mod h1:C1Ygde2n843yTZEQ0FP69jYiuaYV0kriLvP4zm8JuvM=
|
||||||
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240410114823-1f190e1668ec h1:OG8tBs5CN2HKp10sAWdtiFaX8qSGFyLGWfQmf4FQ6bE=
|
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240412130734-0e69e485115a h1:wbndKvHbwDQiSMQWL75RxiTZCeUyCi7NUj1lsfdAGkc=
|
||||||
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240410114823-1f190e1668ec/go.mod h1:H/AW85RtYxVTbcgwHW76DqXeKlsiCIOeNXHPqyDBrfQ=
|
git.frostfs.info/TrueCloudLab/policy-engine v0.0.0-20240412130734-0e69e485115a/go.mod h1:H/AW85RtYxVTbcgwHW76DqXeKlsiCIOeNXHPqyDBrfQ=
|
||||||
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 h1:M2KR3iBj7WpY3hP10IevfIB9MURr4O9mwVfJ+SjT3HA=
|
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 h1:M2KR3iBj7WpY3hP10IevfIB9MURr4O9mwVfJ+SjT3HA=
|
||||||
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0/go.mod h1:okpbKfVYf/BpejtfFTfhZqFP+sZ8rsHrP8Rr/jYPNRc=
|
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0/go.mod h1:okpbKfVYf/BpejtfFTfhZqFP+sZ8rsHrP8Rr/jYPNRc=
|
||||||
git.frostfs.info/TrueCloudLab/tzhash v1.8.0 h1:UFMnUIk0Zh17m8rjGHJMqku2hCgaXDqjqZzS4gsb4UA=
|
git.frostfs.info/TrueCloudLab/tzhash v1.8.0 h1:UFMnUIk0Zh17m8rjGHJMqku2hCgaXDqjqZzS4gsb4UA=
|
||||||
|
|
|
@ -157,9 +157,12 @@ func (ac *apeChecker) List(ctx context.Context, req *container.ListRequest) (*co
|
||||||
reqProps,
|
reqProps,
|
||||||
)
|
)
|
||||||
|
|
||||||
s, found, err := ac.router.IsAllowed(apechain.Ingress,
|
rt := policyengine.NewRequestTargetWithNamespace(namespace)
|
||||||
policyengine.NewRequestTargetWithNamespace(namespace),
|
rt.User = &policyengine.Target{
|
||||||
request)
|
Type: policyengine.User,
|
||||||
|
Name: fmt.Sprintf("%s:%s", namespace, pk.Address()),
|
||||||
|
}
|
||||||
|
s, found, err := ac.router.IsAllowed(apechain.Ingress, rt, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -202,9 +205,12 @@ func (ac *apeChecker) Put(ctx context.Context, req *container.PutRequest) (*cont
|
||||||
reqProps,
|
reqProps,
|
||||||
)
|
)
|
||||||
|
|
||||||
s, found, err := ac.router.IsAllowed(apechain.Ingress,
|
rt := policyengine.NewRequestTargetWithNamespace(namespace)
|
||||||
policyengine.NewRequestTargetWithNamespace(namespace),
|
rt.User = &policyengine.Target{
|
||||||
request)
|
Type: policyengine.User,
|
||||||
|
Name: fmt.Sprintf("%s:%s", namespace, pk.Address()),
|
||||||
|
}
|
||||||
|
s, found, err := ac.router.IsAllowed(apechain.Ingress, rt, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -277,7 +283,7 @@ func (ac *apeChecker) validateContainerBoundedOperation(containerID *refs.Contai
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
reqProps, err := ac.getRequestProps(mh, vh, cont, id)
|
reqProps, pk, err := ac.getRequestProps(mh, vh, cont, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -298,7 +304,7 @@ func (ac *apeChecker) validateContainerBoundedOperation(containerID *refs.Contai
|
||||||
)
|
)
|
||||||
|
|
||||||
s, found, err := ac.router.IsAllowed(apechain.Ingress,
|
s, found, err := ac.router.IsAllowed(apechain.Ingress,
|
||||||
policyengine.NewRequestTarget(namespace, id.EncodeToString()),
|
policyengine.NewRequestTargetExtended(namespace, id.EncodeToString(), fmt.Sprintf("%s:%s", namespace, pk.Address()), nil),
|
||||||
request)
|
request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -350,19 +356,19 @@ func (ac *apeChecker) getContainerProps(c *containercore.Container) map[string]s
|
||||||
|
|
||||||
func (ac *apeChecker) getRequestProps(mh *session.RequestMetaHeader, vh *session.RequestVerificationHeader,
|
func (ac *apeChecker) getRequestProps(mh *session.RequestMetaHeader, vh *session.RequestVerificationHeader,
|
||||||
cont *containercore.Container, cnrID cid.ID,
|
cont *containercore.Container, cnrID cid.ID,
|
||||||
) (map[string]string, error) {
|
) (map[string]string, *keys.PublicKey, error) {
|
||||||
actor, pk, err := ac.getActorAndPublicKey(mh, vh, cnrID)
|
actor, pk, err := ac.getActorAndPublicKey(mh, vh, cnrID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
role, err := ac.getRole(actor, pk, cont, cnrID)
|
role, err := ac.getRole(actor, pk, cont, cnrID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return map[string]string{
|
return map[string]string{
|
||||||
nativeschema.PropertyKeyActorPublicKey: hex.EncodeToString(pk.Bytes()),
|
nativeschema.PropertyKeyActorPublicKey: hex.EncodeToString(pk.Bytes()),
|
||||||
nativeschema.PropertyKeyActorRole: role,
|
nativeschema.PropertyKeyActorRole: role,
|
||||||
}, nil
|
}, pk, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ac *apeChecker) getRole(actor *user.ID, pk *keys.PublicKey, cont *containercore.Container, cnrID cid.ID) (string, error) {
|
func (ac *apeChecker) getRole(actor *user.ID, pk *keys.PublicKey, cont *containercore.Container, cnrID cid.ID) (string, error) {
|
||||||
|
|
|
@ -19,6 +19,10 @@ func apeTarget(chainTarget *control.ChainTarget) (engine.Target, error) {
|
||||||
return engine.ContainerTarget(chainTarget.GetName()), nil
|
return engine.ContainerTarget(chainTarget.GetName()), nil
|
||||||
case control.ChainTarget_NAMESPACE:
|
case control.ChainTarget_NAMESPACE:
|
||||||
return engine.NamespaceTarget(chainTarget.GetName()), nil
|
return engine.NamespaceTarget(chainTarget.GetName()), nil
|
||||||
|
case control.ChainTarget_USER:
|
||||||
|
return engine.UserTarget(chainTarget.GetName()), nil
|
||||||
|
case control.ChainTarget_GROUP:
|
||||||
|
return engine.GroupTarget(chainTarget.GetName()), nil
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
return engine.Target{}, status.Error(codes.InvalidArgument,
|
return engine.Target{}, status.Error(codes.InvalidArgument,
|
||||||
|
@ -42,6 +46,16 @@ func controlTarget(chainTarget *engine.Target) (control.ChainTarget, error) {
|
||||||
Name: nm,
|
Name: nm,
|
||||||
Type: control.ChainTarget_NAMESPACE,
|
Type: control.ChainTarget_NAMESPACE,
|
||||||
}, nil
|
}, nil
|
||||||
|
case engine.User:
|
||||||
|
return control.ChainTarget{
|
||||||
|
Name: chainTarget.Name,
|
||||||
|
Type: control.ChainTarget_USER,
|
||||||
|
}, nil
|
||||||
|
case engine.Group:
|
||||||
|
return control.ChainTarget{
|
||||||
|
Name: chainTarget.Name,
|
||||||
|
Type: control.ChainTarget_GROUP,
|
||||||
|
}, nil
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
return control.ChainTarget{}, status.Error(codes.InvalidArgument,
|
return control.ChainTarget{}, status.Error(codes.InvalidArgument,
|
||||||
|
|
6
pkg/services/control/service.pb.go
generated
6
pkg/services/control/service.pb.go
generated
|
@ -3188,7 +3188,8 @@ type FlushCacheRequest_Body struct {
|
||||||
|
|
||||||
// ID of the shard.
|
// ID of the shard.
|
||||||
Shard_ID [][]byte `protobuf:"bytes,1,rep,name=shard_ID,json=shardID,proto3" json:"shard_ID,omitempty"`
|
Shard_ID [][]byte `protobuf:"bytes,1,rep,name=shard_ID,json=shardID,proto3" json:"shard_ID,omitempty"`
|
||||||
// If true, then writecache will be left in read-only mode after flush completed.
|
// If true, then writecache will be left in read-only mode after flush
|
||||||
|
// completed.
|
||||||
Seal bool `protobuf:"varint,2,opt,name=seal,proto3" json:"seal,omitempty"`
|
Seal bool `protobuf:"varint,2,opt,name=seal,proto3" json:"seal,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3525,7 +3526,8 @@ type GetShardEvacuationStatusResponse_Body struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
// Total objects to evacuate count. The value is approximate, so evacuated + failed + skipped == total is not guaranteed after completion.
|
// Total objects to evacuate count. The value is approximate, so evacuated +
|
||||||
|
// failed + skipped == total is not guaranteed after completion.
|
||||||
TotalObjects uint64 `protobuf:"varint,1,opt,name=total_objects,json=totalObjects,proto3" json:"total_objects,omitempty"`
|
TotalObjects uint64 `protobuf:"varint,1,opt,name=total_objects,json=totalObjects,proto3" json:"total_objects,omitempty"`
|
||||||
// Evacuated objects count.
|
// Evacuated objects count.
|
||||||
EvacuatedObjects uint64 `protobuf:"varint,2,opt,name=evacuated_objects,json=evacuatedObjects,proto3" json:"evacuated_objects,omitempty"`
|
EvacuatedObjects uint64 `protobuf:"varint,2,opt,name=evacuated_objects,json=evacuatedObjects,proto3" json:"evacuated_objects,omitempty"`
|
||||||
|
|
File diff suppressed because it is too large
Load diff
30
pkg/services/control/service_grpc.pb.go
generated
30
pkg/services/control/service_grpc.pb.go
generated
|
@ -59,13 +59,15 @@ type ControlServiceClient interface {
|
||||||
// Synchronizes all log operations for the specified tree.
|
// Synchronizes all log operations for the specified tree.
|
||||||
SynchronizeTree(ctx context.Context, in *SynchronizeTreeRequest, opts ...grpc.CallOption) (*SynchronizeTreeResponse, error)
|
SynchronizeTree(ctx context.Context, in *SynchronizeTreeRequest, opts ...grpc.CallOption) (*SynchronizeTreeResponse, error)
|
||||||
// EvacuateShard moves all data from one shard to the others.
|
// EvacuateShard moves all data from one shard to the others.
|
||||||
// Deprecated: Use StartShardEvacuation/GetShardEvacuationStatus/StopShardEvacuation
|
// Deprecated: Use
|
||||||
|
// StartShardEvacuation/GetShardEvacuationStatus/StopShardEvacuation
|
||||||
EvacuateShard(ctx context.Context, in *EvacuateShardRequest, opts ...grpc.CallOption) (*EvacuateShardResponse, error)
|
EvacuateShard(ctx context.Context, in *EvacuateShardRequest, opts ...grpc.CallOption) (*EvacuateShardResponse, error)
|
||||||
// StartShardEvacuation starts moving all data from one shard to the others.
|
// StartShardEvacuation starts moving all data from one shard to the others.
|
||||||
StartShardEvacuation(ctx context.Context, in *StartShardEvacuationRequest, opts ...grpc.CallOption) (*StartShardEvacuationResponse, error)
|
StartShardEvacuation(ctx context.Context, in *StartShardEvacuationRequest, opts ...grpc.CallOption) (*StartShardEvacuationResponse, error)
|
||||||
// GetShardEvacuationStatus returns evacuation status.
|
// GetShardEvacuationStatus returns evacuation status.
|
||||||
GetShardEvacuationStatus(ctx context.Context, in *GetShardEvacuationStatusRequest, opts ...grpc.CallOption) (*GetShardEvacuationStatusResponse, error)
|
GetShardEvacuationStatus(ctx context.Context, in *GetShardEvacuationStatusRequest, opts ...grpc.CallOption) (*GetShardEvacuationStatusResponse, error)
|
||||||
// ResetShardEvacuationStatus resets evacuation status if there is no running evacuation process.
|
// ResetShardEvacuationStatus resets evacuation status if there is no running
|
||||||
|
// evacuation process.
|
||||||
ResetShardEvacuationStatus(ctx context.Context, in *ResetShardEvacuationStatusRequest, opts ...grpc.CallOption) (*ResetShardEvacuationStatusResponse, error)
|
ResetShardEvacuationStatus(ctx context.Context, in *ResetShardEvacuationStatusRequest, opts ...grpc.CallOption) (*ResetShardEvacuationStatusResponse, error)
|
||||||
// StopShardEvacuation stops moving all data from one shard to the others.
|
// StopShardEvacuation stops moving all data from one shard to the others.
|
||||||
StopShardEvacuation(ctx context.Context, in *StopShardEvacuationRequest, opts ...grpc.CallOption) (*StopShardEvacuationResponse, error)
|
StopShardEvacuation(ctx context.Context, in *StopShardEvacuationRequest, opts ...grpc.CallOption) (*StopShardEvacuationResponse, error)
|
||||||
|
@ -77,11 +79,14 @@ type ControlServiceClient interface {
|
||||||
AddChainLocalOverride(ctx context.Context, in *AddChainLocalOverrideRequest, opts ...grpc.CallOption) (*AddChainLocalOverrideResponse, error)
|
AddChainLocalOverride(ctx context.Context, in *AddChainLocalOverrideRequest, opts ...grpc.CallOption) (*AddChainLocalOverrideResponse, error)
|
||||||
// Get local access policy engine overrides stored in the node by chain id.
|
// Get local access policy engine overrides stored in the node by chain id.
|
||||||
GetChainLocalOverride(ctx context.Context, in *GetChainLocalOverrideRequest, opts ...grpc.CallOption) (*GetChainLocalOverrideResponse, error)
|
GetChainLocalOverride(ctx context.Context, in *GetChainLocalOverrideRequest, opts ...grpc.CallOption) (*GetChainLocalOverrideResponse, error)
|
||||||
// List local access policy engine overrides stored in the node by container id.
|
// List local access policy engine overrides stored in the node by container
|
||||||
|
// id.
|
||||||
ListChainLocalOverrides(ctx context.Context, in *ListChainLocalOverridesRequest, opts ...grpc.CallOption) (*ListChainLocalOverridesResponse, error)
|
ListChainLocalOverrides(ctx context.Context, in *ListChainLocalOverridesRequest, opts ...grpc.CallOption) (*ListChainLocalOverridesResponse, error)
|
||||||
// Remove local access policy engine overrides stored in the node by chaind id.
|
// Remove local access policy engine overrides stored in the node by chaind
|
||||||
|
// id.
|
||||||
RemoveChainLocalOverride(ctx context.Context, in *RemoveChainLocalOverrideRequest, opts ...grpc.CallOption) (*RemoveChainLocalOverrideResponse, error)
|
RemoveChainLocalOverride(ctx context.Context, in *RemoveChainLocalOverrideRequest, opts ...grpc.CallOption) (*RemoveChainLocalOverrideResponse, error)
|
||||||
// Remove local access policy engine overrides stored in the node by chaind id.
|
// Remove local access policy engine overrides stored in the node by chaind
|
||||||
|
// id.
|
||||||
RemoveChainLocalOverridesByTarget(ctx context.Context, in *RemoveChainLocalOverridesByTargetRequest, opts ...grpc.CallOption) (*RemoveChainLocalOverridesByTargetResponse, error)
|
RemoveChainLocalOverridesByTarget(ctx context.Context, in *RemoveChainLocalOverridesByTargetRequest, opts ...grpc.CallOption) (*RemoveChainLocalOverridesByTargetResponse, error)
|
||||||
// List targets of the local APE overrides stored in the node.
|
// List targets of the local APE overrides stored in the node.
|
||||||
ListTargetsLocalOverrides(ctx context.Context, in *ListTargetsLocalOverridesRequest, opts ...grpc.CallOption) (*ListTargetsLocalOverridesResponse, error)
|
ListTargetsLocalOverrides(ctx context.Context, in *ListTargetsLocalOverridesRequest, opts ...grpc.CallOption) (*ListTargetsLocalOverridesResponse, error)
|
||||||
|
@ -305,13 +310,15 @@ type ControlServiceServer interface {
|
||||||
// Synchronizes all log operations for the specified tree.
|
// Synchronizes all log operations for the specified tree.
|
||||||
SynchronizeTree(context.Context, *SynchronizeTreeRequest) (*SynchronizeTreeResponse, error)
|
SynchronizeTree(context.Context, *SynchronizeTreeRequest) (*SynchronizeTreeResponse, error)
|
||||||
// EvacuateShard moves all data from one shard to the others.
|
// EvacuateShard moves all data from one shard to the others.
|
||||||
// Deprecated: Use StartShardEvacuation/GetShardEvacuationStatus/StopShardEvacuation
|
// Deprecated: Use
|
||||||
|
// StartShardEvacuation/GetShardEvacuationStatus/StopShardEvacuation
|
||||||
EvacuateShard(context.Context, *EvacuateShardRequest) (*EvacuateShardResponse, error)
|
EvacuateShard(context.Context, *EvacuateShardRequest) (*EvacuateShardResponse, error)
|
||||||
// StartShardEvacuation starts moving all data from one shard to the others.
|
// StartShardEvacuation starts moving all data from one shard to the others.
|
||||||
StartShardEvacuation(context.Context, *StartShardEvacuationRequest) (*StartShardEvacuationResponse, error)
|
StartShardEvacuation(context.Context, *StartShardEvacuationRequest) (*StartShardEvacuationResponse, error)
|
||||||
// GetShardEvacuationStatus returns evacuation status.
|
// GetShardEvacuationStatus returns evacuation status.
|
||||||
GetShardEvacuationStatus(context.Context, *GetShardEvacuationStatusRequest) (*GetShardEvacuationStatusResponse, error)
|
GetShardEvacuationStatus(context.Context, *GetShardEvacuationStatusRequest) (*GetShardEvacuationStatusResponse, error)
|
||||||
// ResetShardEvacuationStatus resets evacuation status if there is no running evacuation process.
|
// ResetShardEvacuationStatus resets evacuation status if there is no running
|
||||||
|
// evacuation process.
|
||||||
ResetShardEvacuationStatus(context.Context, *ResetShardEvacuationStatusRequest) (*ResetShardEvacuationStatusResponse, error)
|
ResetShardEvacuationStatus(context.Context, *ResetShardEvacuationStatusRequest) (*ResetShardEvacuationStatusResponse, error)
|
||||||
// StopShardEvacuation stops moving all data from one shard to the others.
|
// StopShardEvacuation stops moving all data from one shard to the others.
|
||||||
StopShardEvacuation(context.Context, *StopShardEvacuationRequest) (*StopShardEvacuationResponse, error)
|
StopShardEvacuation(context.Context, *StopShardEvacuationRequest) (*StopShardEvacuationResponse, error)
|
||||||
|
@ -323,11 +330,14 @@ type ControlServiceServer interface {
|
||||||
AddChainLocalOverride(context.Context, *AddChainLocalOverrideRequest) (*AddChainLocalOverrideResponse, error)
|
AddChainLocalOverride(context.Context, *AddChainLocalOverrideRequest) (*AddChainLocalOverrideResponse, error)
|
||||||
// Get local access policy engine overrides stored in the node by chain id.
|
// Get local access policy engine overrides stored in the node by chain id.
|
||||||
GetChainLocalOverride(context.Context, *GetChainLocalOverrideRequest) (*GetChainLocalOverrideResponse, error)
|
GetChainLocalOverride(context.Context, *GetChainLocalOverrideRequest) (*GetChainLocalOverrideResponse, error)
|
||||||
// List local access policy engine overrides stored in the node by container id.
|
// List local access policy engine overrides stored in the node by container
|
||||||
|
// id.
|
||||||
ListChainLocalOverrides(context.Context, *ListChainLocalOverridesRequest) (*ListChainLocalOverridesResponse, error)
|
ListChainLocalOverrides(context.Context, *ListChainLocalOverridesRequest) (*ListChainLocalOverridesResponse, error)
|
||||||
// Remove local access policy engine overrides stored in the node by chaind id.
|
// Remove local access policy engine overrides stored in the node by chaind
|
||||||
|
// id.
|
||||||
RemoveChainLocalOverride(context.Context, *RemoveChainLocalOverrideRequest) (*RemoveChainLocalOverrideResponse, error)
|
RemoveChainLocalOverride(context.Context, *RemoveChainLocalOverrideRequest) (*RemoveChainLocalOverrideResponse, error)
|
||||||
// Remove local access policy engine overrides stored in the node by chaind id.
|
// Remove local access policy engine overrides stored in the node by chaind
|
||||||
|
// id.
|
||||||
RemoveChainLocalOverridesByTarget(context.Context, *RemoveChainLocalOverridesByTargetRequest) (*RemoveChainLocalOverridesByTargetResponse, error)
|
RemoveChainLocalOverridesByTarget(context.Context, *RemoveChainLocalOverridesByTargetRequest) (*RemoveChainLocalOverridesByTargetResponse, error)
|
||||||
// List targets of the local APE overrides stored in the node.
|
// List targets of the local APE overrides stored in the node.
|
||||||
ListTargetsLocalOverrides(context.Context, *ListTargetsLocalOverridesRequest) (*ListTargetsLocalOverridesResponse, error)
|
ListTargetsLocalOverrides(context.Context, *ListTargetsLocalOverridesRequest) (*ListTargetsLocalOverridesResponse, error)
|
||||||
|
|
59
pkg/services/control/types.pb.go
generated
59
pkg/services/control/types.pb.go
generated
|
@ -205,6 +205,8 @@ const (
|
||||||
ChainTarget_UNDEFINED ChainTarget_TargetType = 0
|
ChainTarget_UNDEFINED ChainTarget_TargetType = 0
|
||||||
ChainTarget_NAMESPACE ChainTarget_TargetType = 1
|
ChainTarget_NAMESPACE ChainTarget_TargetType = 1
|
||||||
ChainTarget_CONTAINER ChainTarget_TargetType = 2
|
ChainTarget_CONTAINER ChainTarget_TargetType = 2
|
||||||
|
ChainTarget_USER ChainTarget_TargetType = 3
|
||||||
|
ChainTarget_GROUP ChainTarget_TargetType = 4
|
||||||
)
|
)
|
||||||
|
|
||||||
// Enum value maps for ChainTarget_TargetType.
|
// Enum value maps for ChainTarget_TargetType.
|
||||||
|
@ -213,11 +215,15 @@ var (
|
||||||
0: "UNDEFINED",
|
0: "UNDEFINED",
|
||||||
1: "NAMESPACE",
|
1: "NAMESPACE",
|
||||||
2: "CONTAINER",
|
2: "CONTAINER",
|
||||||
|
3: "USER",
|
||||||
|
4: "GROUP",
|
||||||
}
|
}
|
||||||
ChainTarget_TargetType_value = map[string]int32{
|
ChainTarget_TargetType_value = map[string]int32{
|
||||||
"UNDEFINED": 0,
|
"UNDEFINED": 0,
|
||||||
"NAMESPACE": 1,
|
"NAMESPACE": 1,
|
||||||
"CONTAINER": 2,
|
"CONTAINER": 2,
|
||||||
|
"USER": 3,
|
||||||
|
"GROUP": 4,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -814,40 +820,41 @@ var file_pkg_services_control_types_proto_rawDesc = []byte{
|
||||||
0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x22, 0x36, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x74,
|
0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x22, 0x36, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x74,
|
||||||
0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,
|
0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79,
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79,
|
||||||
0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x91,
|
0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa6,
|
||||||
0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x33,
|
0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x33,
|
||||||
0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x63,
|
0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x63,
|
||||||
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x61, 0x72, 0x67,
|
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x61, 0x72, 0x67,
|
||||||
0x65, 0x74, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74,
|
0x65, 0x74, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74,
|
||||||
0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||||
0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65,
|
0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65,
|
||||||
0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
|
0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
|
||||||
0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43,
|
0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43,
|
||||||
0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
|
0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
|
||||||
0x10, 0x02, 0x2a, 0x4e, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x6d, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74,
|
0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x53, 0x45, 0x52, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05,
|
||||||
0x75, 0x73, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44,
|
0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x6d, 0x61,
|
||||||
0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49,
|
0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55,
|
||||||
0x4e, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10,
|
0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a,
|
||||||
0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45,
|
0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x46, 0x46,
|
||||||
0x10, 0x03, 0x2a, 0x6a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74,
|
0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45,
|
||||||
0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41,
|
0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x2a, 0x6a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74,
|
||||||
0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12,
|
0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x48, 0x45, 0x41, 0x4c, 0x54,
|
||||||
0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a,
|
0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
|
||||||
0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x48, 0x55, 0x54,
|
0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47,
|
||||||
0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x52,
|
0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x11, 0x0a,
|
||||||
0x45, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x2a, 0x6a,
|
0x0d, 0x53, 0x48, 0x55, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03,
|
||||||
0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53,
|
0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e,
|
||||||
0x48, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49,
|
0x47, 0x10, 0x04, 0x2a, 0x6a, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x6f, 0x64, 0x65,
|
||||||
0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52,
|
0x12, 0x18, 0x0a, 0x14, 0x53, 0x48, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55,
|
||||||
0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e,
|
0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45,
|
||||||
0x4c, 0x59, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44,
|
0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45,
|
||||||
0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x5f, 0x52,
|
0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x47,
|
||||||
0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69,
|
0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x47, 0x52, 0x41,
|
||||||
0x74, 0x2e, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x66, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2f, 0x54,
|
0x44, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x42,
|
||||||
0x72, 0x75, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x4c, 0x61, 0x62, 0x2f, 0x66, 0x72, 0x6f, 0x73,
|
0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x2e, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x66, 0x73, 0x2e, 0x69,
|
||||||
0x74, 0x66, 0x73, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, 0x72,
|
0x6e, 0x66, 0x6f, 0x2f, 0x54, 0x72, 0x75, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x4c, 0x61, 0x62,
|
||||||
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x62, 0x06, 0x70,
|
0x2f, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x66, 0x73, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x67, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72,
|
||||||
|
0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -6,183 +6,186 @@ option go_package = "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/con
|
||||||
|
|
||||||
// Signature of some message.
|
// Signature of some message.
|
||||||
message Signature {
|
message Signature {
|
||||||
// Public key used for signing.
|
// Public key used for signing.
|
||||||
bytes key = 1 [json_name = "key"];
|
bytes key = 1 [ json_name = "key" ];
|
||||||
|
|
||||||
// Binary signature.
|
// Binary signature.
|
||||||
bytes sign = 2 [json_name = "signature"];
|
bytes sign = 2 [ json_name = "signature" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status of the storage node in the FrostFS network map.
|
// Status of the storage node in the FrostFS network map.
|
||||||
enum NetmapStatus {
|
enum NetmapStatus {
|
||||||
// Undefined status, default value.
|
// Undefined status, default value.
|
||||||
STATUS_UNDEFINED = 0;
|
STATUS_UNDEFINED = 0;
|
||||||
|
|
||||||
// Node is online.
|
// Node is online.
|
||||||
ONLINE = 1;
|
ONLINE = 1;
|
||||||
|
|
||||||
// Node is offline.
|
// Node is offline.
|
||||||
OFFLINE = 2;
|
OFFLINE = 2;
|
||||||
|
|
||||||
// Node is maintained by the owner.
|
// Node is maintained by the owner.
|
||||||
MAINTENANCE = 3;
|
MAINTENANCE = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FrostFS node description.
|
// FrostFS node description.
|
||||||
message NodeInfo {
|
message NodeInfo {
|
||||||
// Public key of the FrostFS node in a binary format.
|
// Public key of the FrostFS node in a binary format.
|
||||||
bytes public_key = 1 [json_name = "publicKey"];
|
bytes public_key = 1 [ json_name = "publicKey" ];
|
||||||
|
|
||||||
// Ways to connect to a node.
|
// Ways to connect to a node.
|
||||||
repeated string addresses = 2 [json_name = "addresses"];
|
repeated string addresses = 2 [ json_name = "addresses" ];
|
||||||
|
|
||||||
// Administrator-defined Attributes of the FrostFS Storage Node.
|
// Administrator-defined Attributes of the FrostFS Storage Node.
|
||||||
//
|
//
|
||||||
// `Attribute` is a Key-Value metadata pair. Key name must be a valid UTF-8
|
// `Attribute` is a Key-Value metadata pair. Key name must be a valid UTF-8
|
||||||
// string. Value can't be empty.
|
// string. Value can't be empty.
|
||||||
//
|
//
|
||||||
// Node's attributes are mostly used during Storage Policy evaluation to
|
// Node's attributes are mostly used during Storage Policy evaluation to
|
||||||
// calculate object's placement and find a set of nodes satisfying policy
|
// calculate object's placement and find a set of nodes satisfying policy
|
||||||
// requirements. There are some "well-known" node attributes common to all the
|
// requirements. There are some "well-known" node attributes common to all the
|
||||||
// Storage Nodes in the network and used implicitly with default values if not
|
// Storage Nodes in the network and used implicitly with default values if not
|
||||||
// explicitly set:
|
// explicitly set:
|
||||||
//
|
//
|
||||||
// * Capacity \
|
// * Capacity \
|
||||||
// Total available disk space in Gigabytes.
|
// Total available disk space in Gigabytes.
|
||||||
// * Price \
|
// * Price \
|
||||||
// Price in GAS tokens for storing one GB of data during one Epoch. In node
|
// Price in GAS tokens for storing one GB of data during one Epoch. In node
|
||||||
// attributes it's a string presenting floating point number with comma or
|
// attributes it's a string presenting floating point number with comma or
|
||||||
// point delimiter for decimal part. In the Network Map it will be saved as
|
// point delimiter for decimal part. In the Network Map it will be saved as
|
||||||
// 64-bit unsigned integer representing number of minimal token fractions.
|
// 64-bit unsigned integer representing number of minimal token fractions.
|
||||||
// * Locode \
|
// * Locode \
|
||||||
// Node's geographic location in
|
// Node's geographic location in
|
||||||
// [UN/LOCODE](https://www.unece.org/cefact/codesfortrade/codes_index.html)
|
// [UN/LOCODE](https://www.unece.org/cefact/codesfortrade/codes_index.html)
|
||||||
// format approximated to the nearest point defined in standard.
|
// format approximated to the nearest point defined in standard.
|
||||||
// * Country \
|
// * Country \
|
||||||
// Country code in
|
// Country code in
|
||||||
// [ISO 3166-1_alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
// [ISO 3166-1_alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
||||||
// format. Calculated automatically from `Locode` attribute
|
// format. Calculated automatically from `Locode` attribute
|
||||||
// * Region \
|
// * Region \
|
||||||
// Country's administative subdivision where node is located. Calculated
|
// Country's administative subdivision where node is located. Calculated
|
||||||
// automatically from `Locode` attribute based on `SubDiv` field. Presented
|
// automatically from `Locode` attribute based on `SubDiv` field. Presented
|
||||||
// in [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) format.
|
// in [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) format.
|
||||||
// * City \
|
// * City \
|
||||||
// City, town, village or rural area name where node is located written
|
// City, town, village or rural area name where node is located written
|
||||||
// without diacritics . Calculated automatically from `Locode` attribute.
|
// without diacritics . Calculated automatically from `Locode` attribute.
|
||||||
//
|
//
|
||||||
// For detailed description of each well-known attribute please see the
|
// For detailed description of each well-known attribute please see the
|
||||||
// corresponding section in FrostFS Technical specification.
|
// corresponding section in FrostFS Technical specification.
|
||||||
message Attribute {
|
message Attribute {
|
||||||
// Key of the node attribute.
|
// Key of the node attribute.
|
||||||
string key = 1 [json_name = "key"];
|
string key = 1 [ json_name = "key" ];
|
||||||
|
|
||||||
// Value of the node attribute.
|
// Value of the node attribute.
|
||||||
string value = 2 [json_name = "value"];
|
string value = 2 [ json_name = "value" ];
|
||||||
|
|
||||||
// Parent keys, if any. For example for `City` it could be `Region` and
|
// Parent keys, if any. For example for `City` it could be `Region` and
|
||||||
// `Country`.
|
// `Country`.
|
||||||
repeated string parents = 3 [json_name = "parents"];
|
repeated string parents = 3 [ json_name = "parents" ];
|
||||||
}
|
}
|
||||||
// Carries list of the FrostFS node attributes in a key-value form. Key name
|
// Carries list of the FrostFS node attributes in a key-value form. Key name
|
||||||
// must be a node-unique valid UTF-8 string. Value can't be empty. NodeInfo
|
// must be a node-unique valid UTF-8 string. Value can't be empty. NodeInfo
|
||||||
// structures with duplicated attribute names or attributes with empty values
|
// structures with duplicated attribute names or attributes with empty values
|
||||||
// will be considered invalid.
|
// will be considered invalid.
|
||||||
repeated Attribute attributes = 3 [json_name = "attributes"];
|
repeated Attribute attributes = 3 [ json_name = "attributes" ];
|
||||||
|
|
||||||
// Carries state of the FrostFS node.
|
// Carries state of the FrostFS node.
|
||||||
NetmapStatus state = 4 [json_name = "state"];
|
NetmapStatus state = 4 [ json_name = "state" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Network map structure.
|
// Network map structure.
|
||||||
message Netmap {
|
message Netmap {
|
||||||
// Network map revision number.
|
// Network map revision number.
|
||||||
uint64 epoch = 1 [json_name = "epoch"];
|
uint64 epoch = 1 [ json_name = "epoch" ];
|
||||||
|
|
||||||
// Nodes presented in network.
|
// Nodes presented in network.
|
||||||
repeated NodeInfo nodes = 2 [json_name = "nodes"];
|
repeated NodeInfo nodes = 2 [ json_name = "nodes" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Health status of the storage node application.
|
// Health status of the storage node application.
|
||||||
enum HealthStatus {
|
enum HealthStatus {
|
||||||
// Undefined status, default value.
|
// Undefined status, default value.
|
||||||
HEALTH_STATUS_UNDEFINED = 0;
|
HEALTH_STATUS_UNDEFINED = 0;
|
||||||
|
|
||||||
// Storage node application is starting.
|
// Storage node application is starting.
|
||||||
STARTING = 1;
|
STARTING = 1;
|
||||||
|
|
||||||
// Storage node application is started and serves all services.
|
// Storage node application is started and serves all services.
|
||||||
READY = 2;
|
READY = 2;
|
||||||
|
|
||||||
// Storage node application is shutting down.
|
// Storage node application is shutting down.
|
||||||
SHUTTING_DOWN = 3;
|
SHUTTING_DOWN = 3;
|
||||||
|
|
||||||
// Storage node application is reconfiguring.
|
// Storage node application is reconfiguring.
|
||||||
RECONFIGURING = 4;
|
RECONFIGURING = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shard description.
|
// Shard description.
|
||||||
message ShardInfo {
|
message ShardInfo {
|
||||||
// ID of the shard.
|
// ID of the shard.
|
||||||
bytes shard_ID = 1 [json_name = "shardID"];
|
bytes shard_ID = 1 [ json_name = "shardID" ];
|
||||||
|
|
||||||
// Path to shard's metabase.
|
// Path to shard's metabase.
|
||||||
string metabase_path = 2 [json_name = "metabasePath"];
|
string metabase_path = 2 [ json_name = "metabasePath" ];
|
||||||
|
|
||||||
// Shard's blobstor info.
|
// Shard's blobstor info.
|
||||||
repeated BlobstorInfo blobstor = 3 [json_name = "blobstor"];
|
repeated BlobstorInfo blobstor = 3 [ json_name = "blobstor" ];
|
||||||
|
|
||||||
// Path to shard's write-cache, empty if disabled.
|
// Path to shard's write-cache, empty if disabled.
|
||||||
string writecache_path = 4 [json_name = "writecachePath"];
|
string writecache_path = 4 [ json_name = "writecachePath" ];
|
||||||
|
|
||||||
// Work mode of the shard.
|
// Work mode of the shard.
|
||||||
ShardMode mode = 5;
|
ShardMode mode = 5;
|
||||||
|
|
||||||
// Amount of errors occured.
|
// Amount of errors occured.
|
||||||
uint32 errorCount = 6;
|
uint32 errorCount = 6;
|
||||||
|
|
||||||
// Path to shard's pilorama storage.
|
// Path to shard's pilorama storage.
|
||||||
string pilorama_path = 7 [json_name = "piloramaPath"];
|
string pilorama_path = 7 [ json_name = "piloramaPath" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blobstor component description.
|
// Blobstor component description.
|
||||||
message BlobstorInfo {
|
message BlobstorInfo {
|
||||||
// Path to the root.
|
// Path to the root.
|
||||||
string path = 1 [json_name = "path"];
|
string path = 1 [ json_name = "path" ];
|
||||||
// Component type.
|
// Component type.
|
||||||
string type = 2 [json_name = "type"];
|
string type = 2 [ json_name = "type" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work mode of the shard.
|
// Work mode of the shard.
|
||||||
enum ShardMode {
|
enum ShardMode {
|
||||||
// Undefined mode, default value.
|
// Undefined mode, default value.
|
||||||
SHARD_MODE_UNDEFINED = 0;
|
SHARD_MODE_UNDEFINED = 0;
|
||||||
|
|
||||||
// Read-write.
|
// Read-write.
|
||||||
READ_WRITE = 1;
|
READ_WRITE = 1;
|
||||||
|
|
||||||
// Read-only.
|
// Read-only.
|
||||||
READ_ONLY = 2;
|
READ_ONLY = 2;
|
||||||
|
|
||||||
// Degraded.
|
// Degraded.
|
||||||
DEGRADED = 3;
|
DEGRADED = 3;
|
||||||
|
|
||||||
// DegradedReadOnly.
|
// DegradedReadOnly.
|
||||||
DEGRADED_READ_ONLY = 4;
|
DEGRADED_READ_ONLY = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ChainTarget is an object to which local overrides
|
// ChainTarget is an object to which local overrides
|
||||||
// are applied.
|
// are applied.
|
||||||
message ChainTarget {
|
message ChainTarget {
|
||||||
enum TargetType {
|
enum TargetType {
|
||||||
UNDEFINED = 0;
|
UNDEFINED = 0;
|
||||||
|
|
||||||
NAMESPACE = 1;
|
NAMESPACE = 1;
|
||||||
|
|
||||||
CONTAINER = 2;
|
CONTAINER = 2;
|
||||||
}
|
|
||||||
|
|
||||||
TargetType type = 1;
|
USER = 3;
|
||||||
|
|
||||||
string Name = 2;
|
GROUP = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetType type = 1;
|
||||||
|
|
||||||
|
string Name = 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
|
apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
|
||||||
policyengine "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
policyengine "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
||||||
nativeschema "git.frostfs.info/TrueCloudLab/policy-engine/schema/native"
|
nativeschema "git.frostfs.info/TrueCloudLab/policy-engine/schema/native"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
type checkerImpl struct {
|
type checkerImpl struct {
|
||||||
|
@ -84,8 +85,13 @@ func (c *checkerImpl) CheckAPE(ctx context.Context, prm Prm) error {
|
||||||
return fmt.Errorf("failed to create ape request: %w", err)
|
return fmt.Errorf("failed to create ape request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
status, ruleFound, err := c.chainRouter.IsAllowed(apechain.Ingress,
|
pub, err := keys.NewPublicKeyFromString(prm.SenderKey)
|
||||||
policyengine.NewRequestTarget(prm.Namespace, prm.Container.EncodeToString()), r)
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rt := policyengine.NewRequestTargetExtended(prm.Namespace, prm.Container.EncodeToString(), fmt.Sprintf("%s:%s", prm.Namespace, pub.Address()), nil)
|
||||||
|
status, ruleFound, err := c.chainRouter.IsAllowed(apechain.Ingress, rt, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
policyengine "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
policyengine "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
||||||
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine/inmemory"
|
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine/inmemory"
|
||||||
nativeschema "git.frostfs.info/TrueCloudLab/policy-engine/schema/native"
|
nativeschema "git.frostfs.info/TrueCloudLab/policy-engine/schema/native"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -147,7 +148,9 @@ var (
|
||||||
|
|
||||||
role = "Container"
|
role = "Container"
|
||||||
|
|
||||||
senderKey = hex.EncodeToString([]byte{1, 0, 0, 1})
|
senderPrivateKey, _ = keys.NewPrivateKey()
|
||||||
|
|
||||||
|
senderKey = hex.EncodeToString(senderPrivateKey.PublicKey().Bytes())
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAPECheck(t *testing.T) {
|
func TestAPECheck(t *testing.T) {
|
||||||
|
|
|
@ -51,7 +51,8 @@ func (s *Service) checkAPE(container *core.Container, cid cid.ID, operation acl.
|
||||||
reqProps,
|
reqProps,
|
||||||
)
|
)
|
||||||
|
|
||||||
status, found, err := s.router.IsAllowed(apechain.Ingress, engine.NewRequestTarget(namespace, cid.EncodeToString()), request)
|
rt := engine.NewRequestTargetExtended(namespace, cid.EncodeToString(), fmt.Sprintf("%s:%s", namespace, publicKey.Address()), nil)
|
||||||
|
status, found, err := s.router.IsAllowed(apechain.Ingress, rt, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return apeErr(err)
|
return apeErr(err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue