package control import ( "context" "fmt" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" policyengine "git.frostfs.info/TrueCloudLab/policy-engine" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) func (s *Server) AddChainLocalOverride(_ context.Context, req *control.AddChainLocalOverrideRequest) (*control.AddChainLocalOverrideResponse, error) { if err := s.isValidRequest(req); err != nil { return nil, status.Error(codes.PermissionDenied, err.Error()) } var cid cid.ID err := cid.Decode(req.GetBody().GetContainerId()) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } var chain policyengine.Chain if err = chain.DecodeBytes(req.GetBody().GetChain()); err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } src, err := s.apeChainSrc.GetChainSource(cid) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } s.apeChainCounter.Add(1) // TODO (aarifullin): the such chain id is not well-designed yet. chain.ID = policyengine.ChainID(fmt.Sprintf("%s:%d", policyengine.Ingress, s.apeChainCounter.Load())) src.AddOverride(policyengine.Ingress, &chain) resp := &control.AddChainLocalOverrideResponse{ Body: &control.AddChainLocalOverrideResponse_Body{ ChainId: string(chain.ID), }, } err = SignMessage(s.key, resp) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } return resp, nil } func (s *Server) GetChainLocalOverride(_ context.Context, req *control.GetChainLocalOverrideRequest) (*control.GetChainLocalOverrideResponse, error) { if err := s.isValidRequest(req); err != nil { return nil, status.Error(codes.PermissionDenied, err.Error()) } var cid cid.ID err := cid.Decode(req.GetBody().GetContainerId()) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } src, err := s.apeChainSrc.GetChainSource(cid) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } chain, found := src.GetOverride(policyengine.Ingress, policyengine.ChainID(req.GetBody().GetChainId())) if !found { err = fmt.Errorf("local override has not been found") return nil, status.Error(codes.NotFound, err.Error()) } resp := &control.GetChainLocalOverrideResponse{ Body: &control.GetChainLocalOverrideResponse_Body{ Chain: chain.Bytes(), }, } err = SignMessage(s.key, resp) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } return resp, nil } func (s *Server) ListChainLocalOverrides(_ context.Context, req *control.ListChainLocalOverridesRequest) (*control.ListChainLocalOverridesResponse, error) { if err := s.isValidRequest(req); err != nil { return nil, status.Error(codes.PermissionDenied, err.Error()) } var cid cid.ID err := cid.Decode(req.GetBody().GetContainerId()) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } src, err := s.apeChainSrc.GetChainSource(cid) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } chains := src.ListOverrides(policyengine.Ingress) serializedChains := make([][]byte, 0, len(chains)) for _, chain := range chains { serializedChains = append(serializedChains, chain.Bytes()) } resp := &control.ListChainLocalOverridesResponse{ Body: &control.ListChainLocalOverridesResponse_Body{ Chains: serializedChains, }, } err = SignMessage(s.key, resp) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } return resp, nil } func (s *Server) RemoveChainLocalOverride(_ context.Context, req *control.RemoveChainLocalOverrideRequest) (*control.RemoveChainLocalOverrideResponse, error) { if err := s.isValidRequest(req); err != nil { return nil, status.Error(codes.PermissionDenied, err.Error()) } var cid cid.ID err := cid.Decode(req.GetBody().GetContainerId()) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } src, err := s.apeChainSrc.GetChainSource(cid) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } removed := src.RemoveOverride(policyengine.Ingress, policyengine.ChainID(req.GetBody().GetChainId())) resp := &control.RemoveChainLocalOverrideResponse{ Body: &control.RemoveChainLocalOverrideResponse_Body{ Removed: removed, }, } err = SignMessage(s.key, resp) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } return resp, nil }