From 9916598dfb8ef534bf8f0c4124f59491f2f4f578 Mon Sep 17 00:00:00 2001 From: Anton Nikiforov Date: Fri, 26 Jan 2024 17:10:26 +0300 Subject: [PATCH] [#922] control: Extend api with `ListOverrideDefinedTargets` Signed-off-by: Anton Nikiforov --- pkg/services/control/rpc.go | 48 +++++++++++------ pkg/services/control/server/policy_engine.go | 54 +++++++++++++++++++ pkg/services/control/service.pb.go | Bin 209554 -> 221750 bytes pkg/services/control/service.proto | 29 +++++++++- pkg/services/control/service_frostfs.pb.go | Bin 96685 -> 102396 bytes pkg/services/control/service_grpc.pb.go | Bin 33410 -> 35467 bytes 6 files changed, 113 insertions(+), 18 deletions(-) diff --git a/pkg/services/control/rpc.go b/pkg/services/control/rpc.go index 3fd4d4ae..24b20f87 100644 --- a/pkg/services/control/rpc.go +++ b/pkg/services/control/rpc.go @@ -8,23 +8,24 @@ import ( const serviceName = "control.ControlService" const ( - rpcHealthCheck = "HealthCheck" - rpcSetNetmapStatus = "SetNetmapStatus" - rpcDropObjects = "DropObjects" - rpcListShards = "ListShards" - rpcSetShardMode = "SetShardMode" - rpcSynchronizeTree = "SynchronizeTree" - rpcEvacuateShard = "EvacuateShard" - rpcStartShardEvacuation = "StartShardEvacuation" - rpcGetShardEvacuationStatus = "GetShardEvacuationStatus" - rpcStopShardEvacuation = "StopShardEvacuation" - rpcFlushCache = "FlushCache" - rpcDoctor = "Doctor" - rpcAddChainLocalOverride = "AddChainLocalOverride" - rpcGetChainLocalOverride = "GetChainLocalOverride" - rpcListChainLocalOverrides = "ListChainLocalOverrides" - rpcRemoveChainLocalOverride = "RemoveChainLocalOverride" - rpcSealWriteCache = "SealWriteCache" + rpcHealthCheck = "HealthCheck" + rpcSetNetmapStatus = "SetNetmapStatus" + rpcDropObjects = "DropObjects" + rpcListShards = "ListShards" + rpcSetShardMode = "SetShardMode" + rpcSynchronizeTree = "SynchronizeTree" + rpcEvacuateShard = "EvacuateShard" + rpcStartShardEvacuation = "StartShardEvacuation" + rpcGetShardEvacuationStatus = "GetShardEvacuationStatus" + rpcStopShardEvacuation = "StopShardEvacuation" + rpcFlushCache = "FlushCache" + rpcDoctor = "Doctor" + rpcAddChainLocalOverride = "AddChainLocalOverride" + rpcGetChainLocalOverride = "GetChainLocalOverride" + rpcListChainLocalOverrides = "ListChainLocalOverrides" + rpcRemoveChainLocalOverride = "RemoveChainLocalOverride" + rpcSealWriteCache = "SealWriteCache" + rpcListTargetsLocalOverrides = "ListTargetsLocalOverrides" ) // HealthCheck executes ControlService.HealthCheck RPC. @@ -240,6 +241,19 @@ func ListChainLocalOverrides(cli *client.Client, req *ListChainLocalOverridesReq return wResp.message, nil } +// ListTargetsLocalOverrides executes ControlService.ListTargetsLocalOverrides RPC. +func ListTargetsLocalOverrides(cli *client.Client, req *ListTargetsLocalOverridesRequest, opts ...client.CallOption) (*ListTargetsLocalOverridesResponse, error) { + wResp := newResponseWrapper[ListTargetsLocalOverridesResponse]() + wReq := &requestWrapper{m: req} + + err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcListTargetsLocalOverrides), wReq, wResp, opts...) + if err != nil { + return nil, err + } + + return wResp.message, nil +} + // RemoveChainLocalOverride executes ControlService.RemoveChainLocalOverride RPC. func GetChainLocalOverride(cli *client.Client, req *GetChainLocalOverrideRequest, opts ...client.CallOption) (*GetChainLocalOverrideResponse, error) { wResp := newResponseWrapper[GetChainLocalOverrideResponse]() diff --git a/pkg/services/control/server/policy_engine.go b/pkg/services/control/server/policy_engine.go index bd7f35f4..079b605a 100644 --- a/pkg/services/control/server/policy_engine.go +++ b/pkg/services/control/server/policy_engine.go @@ -25,6 +25,29 @@ func apeTarget(chainTarget *control.ChainTarget) (engine.Target, error) { fmt.Errorf("target type is not supported: %s", chainTarget.GetType().String()).Error()) } +func controlTarget(chainTarget *engine.Target) (control.ChainTarget, error) { + switch chainTarget.Type { + case engine.Container: + return control.ChainTarget{ + Name: chainTarget.Name, + Type: control.ChainTarget_CONTAINER, + }, nil + case engine.Namespace: + // If namespace is empty, we take it for root namespace. + nm := chainTarget.Name + if nm == "root" { + nm = "" + } + return control.ChainTarget{ + Name: nm, + Type: control.ChainTarget_NAMESPACE, + }, nil + default: + } + return control.ChainTarget{}, status.Error(codes.InvalidArgument, + fmt.Errorf("target type is not supported: %c", chainTarget.Type).Error()) +} + 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()) @@ -157,6 +180,37 @@ func (s *Server) RemoveChainLocalOverride(_ context.Context, req *control.Remove return resp, nil } +func (s *Server) ListTargetsLocalOverrides(_ context.Context, req *control.ListTargetsLocalOverridesRequest) (*control.ListTargetsLocalOverridesResponse, error) { + if err := s.isValidRequest(req); err != nil { + return nil, status.Error(codes.PermissionDenied, err.Error()) + } + + apeChainName := apechain.Name(req.GetBody().GetChainName()) + apeTargets, err := s.localOverrideStorage.LocalStorage().ListOverrideDefinedTargets(apeChainName) + if err != nil { + return nil, status.Error(getCodeByLocalStorageErr(err), err.Error()) + } + targets := make([]*control.ChainTarget, 0, len(apeTargets)) + for i := range apeTargets { + target, err := controlTarget(&apeTargets[i]) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + targets = append(targets, &target) + } + + resp := &control.ListTargetsLocalOverridesResponse{ + Body: &control.ListTargetsLocalOverridesResponse_Body{ + Targets: targets, + }, + } + err = SignMessage(s.key, resp) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + return resp, nil +} + func getCodeByLocalStorageErr(err error) codes.Code { if errors.Is(err, engine.ErrChainNotFound) || errors.Is(err, engine.ErrChainNameNotFound) { return codes.NotFound diff --git a/pkg/services/control/service.pb.go b/pkg/services/control/service.pb.go index f6b9ef60874664cafa1b5ffc729cb3e7babbaf89..e0c6e0622a41e8dfe2520f75aadee8d9b07e45bf 100644 GIT binary patch delta 11076 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 NB}9h3#9~OL{|6)oiJ|}i delta 8296 zcmZ`;d013evj0w9x}n)s76DmQj8V33pc_!ZJ;n_%nz%*5L>x1TOB}x$jN&>@j0<9} zQj<6e8a2Tf#h7R3IY~fc+#-rGiyPR+;DQQh64z1Q@7&vs%*^-xfqUvy)v5Z`c5dIj z2YueH^Dggun9Uo7fgSrqqhB2U@{?p#|8aJw+Hl-Y%DsEuQ;nbEp?0{0y;Z_fUA;A3oqs9x z)AO51on0+;cT!gk(DX*B^U5NmP8_h;L;bckR~6sYL2b4A`DwpBjgA0C_5Uf4Bddi! zHyslOwcwXVP~6n@XD;!?GoY3>;`rC{o>f<0nWqjp=l7I%Pr}v9q;9Iw#DmmT^|#fS zi*-^eNS$+Yo9b|A%t30!ErS}-$y3d^>dVziip$ zwVmqlH}JGX(M?_Lt8H@bD3Q14{rl?->Ws!bHLf{aSKm7%NR0|MsD91s)!L>y?qd{f z{-;!=E9#Qp^SH)ML~yQ~c%=S*x6Y2e22$gnOyT)H!iP&egl;1@nZze*S@RY3!#E#% zk(XFOd_fT!Tc{N8FFAbFrZ^+Vr@-n;HxaI8#-;?*5pTXE;W za(iMMks~<4B=Wduw{YXqP~oBaSq*G%i=6UqCvNjbPf^EJA;R0<5FkzH;MN6f!NMI_bx@0(3%ZN_$*@4R ze7M2BFjh=g*e_a4QENvAaZZA8m*);p=Z|o%B9{U3?4kbbA0X34GH6~e=_0N|%~QI; z4r_)fyf6kRo4SihYWC;=F0w&D<|EIuiBIKb9iK}Ve(e8%406|Ck4+UL6mCd>@7bgM zIJ=kbyC$J6xAGenU<9#`6#m=_Tc^F|%{vDOZ+O?haVc!-0BZKN##c zN_g07GsSh{!_UFY3DZ5)h}lMt8VE@Gyddh?_B;#(+cZVX0Y34P=%j0Do`6EmehX)h zK@w>3H!p6X{6QTtrp|t2tQf5D;So3?1z^XEDX@ zSS&gU-k6UQZ*B;5A!cA?M>o~HQKw{$6R+DpTPo%YzCRCnuy9@AQ?OLWx&XOCp_YnZ z?zv1X;vMrfePL?l0=-(;yi^42T`rOpp1T;KoVmFJm#!4ey%ZibLnx2+BS%9h#_g*L4$Y#+C6}TQ1c<((iN$+_6Wul|Z#X(%K4gO)bjxT(I`Y8WQc=CxoB2F#; zCQz=t*EK=k!;i!th#!@}D%mmB>;qw3v_o$U{m}^BIBuutep-5_3-W0~>b#}%KU zUCh`ong!>6tm%%@;h$+11LO_hsH7YC(GGD58lzev-}8`I$yxg}wYreK`H=X9xchFj z3)ke94W&OXaL(~ITDh|0n3&67e=4r%qZ|X?8Ijdj0=c9Lz#t-d{AndJuSF5;5@Xba zTYmCF;LTIVi&6H6RiZ-h?Y+o$@C6E9^|`JzOfTx9D}LH!=ZT|W)1gD6ozxdzd>CE_ zoEAS2=X{BSKnvsQAB9Q%#Q2PwJ0gM?Rs&j4%J}!M5M10HzIRKCjWYA4??kM|YJdH# zm{i2C{fYbxQRaNh6h1YZBDw1v`YTs=qi{|LA!MdAL4^bA)gQ80gAMnm{& zEEmUEQ;f-JPPEv zKao2x7*8JDHjg^-kbE36@g<5TPZMXPQCDt$o7(UfFHu)XxtWjSn`VW*48f)IV8F|% zaPZVTiej&5EZqypkE?1>T+Q#^<%SSyD=GWCQLKc> zoxSJ7kNdw0&3bW3bmhZ=6v{I%iU`S=vzYqYA@#Z7$ac`%9I(cYGXtwgEMbs%WNlT3>W|<)7SG2#Aw7+@s zZ!)*JAj>5QNxJPFiW5;>vI-W~zeB!!Kti2ei_2@wau{MOL2S%p5U3+8bt5w9?j$(b z^gu-D#h%0qHbS3&t?0mxhqx~V*#O6lyTZcpB|vfSELnvQf%1uaIB5C1h zvu1jVHVq(THe=Uu4=91zk9+QhzL}%QM{iwl z!Nf1EL!=PX@D^PELoAGE&ZKy~To8`-{ODao;uDqn=rMUBW9vHH$hm8A&_WN2;KH@! zEpb`xP6Ih(D=djz3p89s@gJ;4$(o?Tj(Qad_SE59Yh777nVSQte=DbkuY&`Q_fani zZ75$4iGMLFO~VniXLw^8&TZ=kXlmENZ2uE zRSA-@`Xgk;p!dL+upUn?Z6@BHPGdYQS^*}e^2PV*Tr0(Mw&NU>)3e-Urj=41US(x{ z{Jb9Zk^US_Mh5K|uLy#|YPoO2l!3J2jt zYq>nmmF*S&Z`DVUz7T*U`S{|_=@#LP`_=-w2{gRhrv z0?@`y6kYrQ43$Lwx*KX(3&ZivNQ+@xv7rrA(+B7T)tOk9Y{RLT#(EwYfHsW!@&jpn z9*vQ;Wa8^Lk*hjGVrcl4Qlb zxf7IzU8vbDJ0(ocMxYHVvmE1E32$Eacf<5sYk>T~-IS!YNn09ET83I#eF41`2^Yu*ck8pU z>AVQAH|(ZzB1<>Ey$2RIPEtJWKYd0odb8;OZac5%+f|JR@-Ym|;$_BHhtRzCG3x{${~8YFCdy9v>obr4$WzlP#J?uA_u zXD}#g4x#~O9z;EX)~5I@NJYoddIo<(8I+X9ea@k@O20wzM|=apA?M(x`5X}RJB2^< z4uLi55Mp5I!4>Ba=szDqQrwcP|2PMw+2^6~heNO-iThqaH|=>C&&hoI0&bt1@ys0# z%d=~NZBY%LK01tCa{bg`Wb+Z~1oLxhVSZLEPMmuL`mY~`{`LD1A?;U$^G9e9Ve+oo z2c`XwLg_z`K-D}4nnwC*SXh1(i0*gbc%Ng~U2zoRf4PJ~HBBxX<+A-3SXLdQ=OwNe zf2Nq?6S$Y0IRmMZGGP7qTex9m^RK8Syj~l0FpH0)wX8k_Y_pG% z8|=n@0aFN`k8Z`>V&%IF?n>P_m}+rYjVwz4i9|7UpmjU~nCb z%Ssj0nI+FNJoN;Qws83gnl2LAd=1^S=o*k2eiF#+IsxJLPSRwKIH^AcbDxtkm8$_k zp`@*^2TJo!!IIIH6sY=t?L}{C=RZeCsq+&i(=KBQJlC6TZb0rKE81k2KcZ8XJ|6 zfHxj3=}pqwT|ZJNCC2jcA89z*V!6XlG{zl+32aH+@h2q1`#(_(rNr`AdnrnFgc`Zw zCrWj)SUDF|&OAdgN>XYp7o4G7sm*bQMtCHpX=+kis>8_p>TzU;b1)0V;;p2BweTzs zHpg=9SsE)vdz_;zvc&SrbM&G~H^hQuL)nD!;Tno@(NM;q;fIa$)Kkh8o~KMoisg&v zbv->VKu>Zkuew0v<^GKelug!H&Zwarxh}1t7d&j5g^7uJ>4eu(n%o*&OCzPnyJ~e& zpNo{GB*VSji!?zpR9>WPQ?l+J=6BOk#Lw)|h2L=K{(Rw}(H>49Es`aizih(L@^_$O zre309Qjz@<4R$dlv+oxeGVk1gqa~MQ$M^#Iiehs&0VgdWR-NTNM8wmID~$}2O)JDM zeBx(HmnwZP6NXJJPrXd9yHuy~^vkF@M6$bL1qPO1=uPKdvZYmd$~c;=Iw;AgnqP5! zU48>0%dDekT>?ou{o`BI-DK4JTdhO21bxPrNWSg*fAuer8U z^m^T1hiU!FRr;g!;p9~sBmZ~5M$_c~_pi}d58YpDBCkFPUkb0ntn}*??bKsU(&+^a z@X-eUE3WIZ3H8Va_`IT?W=LI+>uH=b?p8Fzdg`ndF<|c}w@=)l@g6A}v^F#EZb0Xf zA4T-@uHT|4zkV|&&+&AH#Aa#5BhNP3Qgz`(xiQUYoh?bOVt7J50M;?H>2oMVe)LFp zCbi9~Ppjf4vY7Bwws+?jkdL--8X>!$> zXWgbmCqs%^ui2{GI79CTDf(E_YRR3W?@+8MMNfj1M13CR-=TN|tVz*=Z{`bkXo$(G zdx{@5kSGhBprvT--ptp2Mfs-aK&IFjeK>|6{7x}0wiFqze zf_qM;WJw(1CY2OFK>|nLr!3b;qB`!QNO9QWf7+?4jbuNimTlE)AQ1itIsltf*` zDshPCOaWuwx=f+#HY)f6@&tT9C1hQVlCJZmNNDo(XQyG?gwjJAW-)X5J^X@0PMuh5 zF#;w*T%jnzynvL>nyAGYW5DCws(gg8+@vTbXT@0XBCjE4Q1q49G^B^xClC zJ<0|W>(P92oFeb6Mo#Fg9O8f&WvC=Y@q}pQFb|5w zGH0TqermU@7!ad{qBCUc7TSl$=V?N!q8&Dt>5&z*$eF zjq3l!A!S4p98HZ)yv>3!@zjZ3Rd{oRFbZ z@ups2%?whWe&xci1ihi-M7q8a$W1+5c0S6$sT=w#HT+B;{mGjn|B2$)zF2)S5@Ij( z#YRJaz7%Fbqn*8UlfeOr_=HjPpQcm`=aO z1BSz#KG6sRe&^Ru}bxM=tugXnMXsn%{pU22IIWt_C1Ezj*;4ab0@lCBLTJkIzWj8geFd++W2MR7@ zVu#rd8orR55V;bx-*JR?(*iH?5}7vd8(%%H`Gvt zYA(*nhRqsm5dP-7p7R;eHLYX?OHS7*VswP6n_TO&1X-En<~hBZC~lt)v{7<CO^fdC`x_6AQzT>}7Dj*V>q delta 17 Zcmew}pKa}D)`l&NiJsdx#54LB002z62WbER diff --git a/pkg/services/control/service_grpc.pb.go b/pkg/services/control/service_grpc.pb.go index e09f6750b66eea396b4f5deb3be059fa191cf88a..89337323f97e2ff62cb110042a41e4c6ece0d404 100644 GIT binary patch delta 697 zcmZo_W$K>Fv>}seasZpm*ximzaHnXJPsGnt*m4Ja== zIg`Z$%s<28KKTW!+++h*pUL;wWhPH&4Vt{2Lv}JNn-5rD4x0;*j+tBnlv88(2h!P- zg;-@K|6&gWt54(5;`YfbE(u92N>42*o_v5^ZgLH)v;>lvPkwS@j(=HdQBh_}>g0{g zqLT%hcqh;2kes}MMP~D5j#6G(kZOezh!G0;X$mD7sR}tDZ3>P7u9F)?W%=~DIFXE; zd_hEq9cCq?s2QAXBdWaFL(E+q#Z9;s%S{fjWtqG|m3y**HVfPkOKlf8`vAM_WC69@ z&HcI&Jfu5wy@e{=Bt}uu$?q&U;C!G{CwquRY__+m;74&TeobidU?3??`{kc$V{oh~$x5c8-aPqyzB><1}_Dlc( delta 179 zcmeC4%GA`#v>}seatxdFNoi$hxFtHtU;5dS!E{+uz7>^m9v5L%S^t(WX#K((A4fnYsl99on4IW<7$Z4Txv<(=GW8?pJf_