From 485a5418d287071076bbf3e23720f7f324b59071 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Sat, 17 Sep 2022 16:37:01 +0400 Subject: [PATCH] [#1793] node: Serve `NetmapService.NetmapSnapshot` RPC There is no more need to serve the same request on Control API. Signed-off-by: Leonard Lyubich --- CHANGELOG.md | 5 + .../modules/morph/internal/types.pb.go | Bin 6465 -> 6465 bytes cmd/neofs-cli/internal/client/client.go | 23 +++++ cmd/neofs-cli/modules/control/root.go | 2 - cmd/neofs-cli/modules/control/snapshot.go | 74 -------------- cmd/neofs-cli/modules/netmap/root.go | 2 + cmd/neofs-cli/modules/netmap/snapshot.go | 63 ++++++++++++ cmd/neofs-node/config.go | 8 ++ cmd/neofs-node/netmap.go | 2 + go.mod | 4 +- go.sum | Bin 116646 -> 116646 bytes pkg/morph/client/netmap/netmap.go | 7 +- pkg/network/transport/netmap/grpc/service.go | 15 +++ pkg/services/control/convert.go | 20 ---- pkg/services/control/ir/service.pb.go | Bin 14528 -> 14529 bytes pkg/services/control/ir/service_grpc.pb.go | Bin 3853 -> 3854 bytes pkg/services/control/ir/types.pb.go | Bin 7733 -> 7734 bytes pkg/services/control/rpc.go | 23 ----- .../control/server/netmap_snapshot.go | 91 ------------------ pkg/services/control/service.go | 21 ---- pkg/services/control/service.pb.go | Bin 111461 -> 100929 bytes pkg/services/control/service.proto | 31 ------ pkg/services/control/service_grpc.pb.go | Bin 18306 -> 16645 bytes pkg/services/control/service_neofs.pb.go | Bin 52696 -> 47539 bytes pkg/services/control/service_test.go | 24 ----- pkg/services/control/types.pb.go | Bin 27108 -> 27109 bytes pkg/services/netmap/executor.go | 20 ++++ pkg/services/netmap/response.go | 13 +++ pkg/services/netmap/server.go | 1 + pkg/services/netmap/sign.go | 16 +++ pkg/services/tree/service.pb.go | Bin 99802 -> 99802 bytes pkg/services/tree/service_grpc.pb.go | Bin 15167 -> 15167 bytes pkg/services/tree/types.pb.go | Bin 9844 -> 9844 bytes 33 files changed, 176 insertions(+), 289 deletions(-) delete mode 100644 cmd/neofs-cli/modules/control/snapshot.go create mode 100644 cmd/neofs-cli/modules/netmap/snapshot.go delete mode 100644 pkg/services/control/server/netmap_snapshot.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 0578b30972..502981d05d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Changelog for NeoFS Node ## [Unreleased] - Anmado (안마도, 鞍馬島) ### Added +- Serving `NetmapService.NetmapSnapshot` RPC (#1793) +- `netmap snapshot` command of NeoFS CLI (#1793) - Changelog updates CI step (#1808) - Validate storage node configuration before node startup (#1805) @@ -18,10 +20,13 @@ Changelog for NeoFS Node ### Removed - Remove WIF and NEP2 support in `neofs-cli`'s --wallet flag (#1128) - Remove --generate-key option in `neofs-cli container delete` (#1692) +- Serving `ControlService.NetmapSnapshot` RPC (#1793) +- `control netmap-snapshot` command of NeoFS CLI (#1793) ### Updated ### Updating from v0.32.0 +Replace using the `control netmap-snapshot` command with `netmap snapshot` one in NeoFS CLI. ## [0.32.0] - 2022-09-14 - Pungdo (풍도, 楓島) diff --git a/cmd/neofs-adm/internal/modules/morph/internal/types.pb.go b/cmd/neofs-adm/internal/modules/morph/internal/types.pb.go index ab8c5959a6404bc50cde6b38ad5f8a270b6c3611..26409987b9e6f3b89a51ab0a9a632942bcc85f23 100644 GIT binary patch delta 12 TcmX?TbkJx*0i)T*!V3}rBK-v@ delta 12 TcmX?TbkJx*0i)5z!V3}rBIyMr diff --git a/cmd/neofs-cli/internal/client/client.go b/cmd/neofs-cli/internal/client/client.go index c948563769..90056d9f56 100644 --- a/cmd/neofs-cli/internal/client/client.go +++ b/cmd/neofs-cli/internal/client/client.go @@ -272,6 +272,29 @@ func NodeInfo(prm NodeInfoPrm) (res NodeInfoRes, err error) { return } +// NetMapSnapshotPrm groups parameters of NetMapSnapshot operation. +type NetMapSnapshotPrm struct { + commonPrm +} + +// NetMapSnapshotRes groups the resulting values of NetMapSnapshot operation. +type NetMapSnapshotRes struct { + cliRes *client.ResNetMapSnapshot +} + +// NetMap returns current local snapshot of the NeoFS network map. +func (x NetMapSnapshotRes) NetMap() netmap.NetMap { + return x.cliRes.NetMap() +} + +// NetMapSnapshot requests current network view of the remote server. +// +// Returns any error which prevented the operation from completing correctly in error return. +func NetMapSnapshot(prm NetMapSnapshotPrm) (res NetMapSnapshotRes, err error) { + res.cliRes, err = prm.cli.NetMapSnapshot(context.Background(), client.PrmNetMapSnapshot{}) + return +} + // CreateSessionPrm groups parameters of CreateSession operation. type CreateSessionPrm struct { commonPrm diff --git a/cmd/neofs-cli/modules/control/root.go b/cmd/neofs-cli/modules/control/root.go index 31459d030b..515b60cab3 100644 --- a/cmd/neofs-cli/modules/control/root.go +++ b/cmd/neofs-cli/modules/control/root.go @@ -30,7 +30,6 @@ func init() { healthCheckCmd, setNetmapStatusCmd, dropObjectsCmd, - snapshotCmd, shardsCmd, synchronizeTreeCmd, ) @@ -38,7 +37,6 @@ func init() { initControlHealthCheckCmd() initControlSetNetmapStatusCmd() initControlDropObjectsCmd() - initControlSnapshotCmd() initControlShardsCmd() initControlSynchronizeTreeCmd() } diff --git a/cmd/neofs-cli/modules/control/snapshot.go b/cmd/neofs-cli/modules/control/snapshot.go deleted file mode 100644 index 49345d7873..0000000000 --- a/cmd/neofs-cli/modules/control/snapshot.go +++ /dev/null @@ -1,74 +0,0 @@ -package control - -import ( - "github.com/mr-tron/base58" - rawclient "github.com/nspcc-dev/neofs-api-go/v2/rpc/client" - "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common" - "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags" - "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key" - "github.com/nspcc-dev/neofs-node/pkg/services/control" - "github.com/spf13/cobra" -) - -const ( - netmapSnapshotJSONFlag = commonflags.JSON -) - -var snapshotCmd = &cobra.Command{ - Use: "netmap-snapshot", - Short: "Get network map snapshot", - Long: "Get network map snapshot", - Run: func(cmd *cobra.Command, args []string) { - pk := key.Get(cmd) - - req := new(control.NetmapSnapshotRequest) - req.SetBody(new(control.NetmapSnapshotRequest_Body)) - - signRequest(cmd, pk, req) - - cli := getClient(cmd, pk) - - var resp *control.NetmapSnapshotResponse - var err error - err = cli.ExecRaw(func(client *rawclient.Client) error { - resp, err = control.NetmapSnapshot(client, req) - return err - }) - common.ExitOnErr(cmd, "rpc error: %w", err) - - verifyResponse(cmd, resp.GetSignature(), resp.GetBody()) - - isJSON, _ := cmd.Flags().GetBool(netmapSnapshotJSONFlag) - prettyPrintNetmap(cmd, resp.GetBody().GetNetmap(), isJSON) - }, -} - -func initControlSnapshotCmd() { - commonflags.InitWithoutRPC(snapshotCmd) - - flags := snapshotCmd.Flags() - - flags.String(controlRPC, controlRPCDefault, controlRPCUsage) - flags.Bool(netmapSnapshotJSONFlag, false, "print netmap structure in JSON format") -} - -func prettyPrintNetmap(cmd *cobra.Command, nm *control.Netmap, jsonEncoding bool) { - if jsonEncoding { - common.PrettyPrintJSON(cmd, nm, "netmap") - return - } - - cmd.Println("Epoch:", nm.GetEpoch()) - - for i, node := range nm.GetNodes() { - cmd.Printf("Node %d: %s %s %v\n", i+1, - base58.Encode(node.GetPublicKey()), - node.GetState(), - node.GetAddresses(), - ) - - for _, attr := range node.GetAttributes() { - cmd.Printf("\t%s: %s\n", attr.GetKey(), attr.GetValue()) - } - } -} diff --git a/cmd/neofs-cli/modules/netmap/root.go b/cmd/neofs-cli/modules/netmap/root.go index 89e2e34d42..45a2075f05 100644 --- a/cmd/neofs-cli/modules/netmap/root.go +++ b/cmd/neofs-cli/modules/netmap/root.go @@ -22,9 +22,11 @@ func init() { getEpochCmd, nodeInfoCmd, netInfoCmd, + snapshotCmd, ) initGetEpochCmd() initNetInfoCmd() initNodeInfoCmd() + initSnapshotCmd() } diff --git a/cmd/neofs-cli/modules/netmap/snapshot.go b/cmd/neofs-cli/modules/netmap/snapshot.go new file mode 100644 index 0000000000..bb4a6cd2b7 --- /dev/null +++ b/cmd/neofs-cli/modules/netmap/snapshot.go @@ -0,0 +1,63 @@ +package netmap + +import ( + "encoding/hex" + + internalclient "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/client" + "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common" + "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags" + "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key" + "github.com/nspcc-dev/neofs-sdk-go/netmap" + "github.com/spf13/cobra" +) + +var snapshotCmd = &cobra.Command{ + Use: "snapshot", + Short: "Request current local snapshot of the network map", + Long: `Request current local snapshot of the network map`, + Run: func(cmd *cobra.Command, args []string) { + p := key.GetOrGenerate(cmd) + cli := internalclient.GetSDKClientByFlag(cmd, p, commonflags.RPC) + + var prm internalclient.NetMapSnapshotPrm + prm.SetClient(cli) + + res, err := internalclient.NetMapSnapshot(prm) + common.ExitOnErr(cmd, "rpc error: %w", err) + + prettyPrintNetMap(cmd, res.NetMap()) + }, +} + +func initSnapshotCmd() { + commonflags.Init(snapshotCmd) + commonflags.InitAPI(snapshotCmd) +} + +func prettyPrintNetMap(cmd *cobra.Command, nm netmap.NetMap) { + cmd.Println("Epoch:", nm.Epoch()) + + nodes := nm.Nodes() + for i := range nodes { + var strState string + + switch { + case nodes[i].IsOnline(): + strState = "ONLINE" + case nodes[i].IsOffline(): + strState = "OFFLINE" + } + + cmd.Printf("Node %d: %s %s ", i+1, hex.EncodeToString(nodes[i].PublicKey()), strState) + + netmap.IterateNetworkEndpoints(nodes[i], func(endpoint string) { + cmd.Printf("%s ", endpoint) + }) + + cmd.Println() + + nodes[i].IterateAttributes(func(key, value string) { + cmd.Printf("\t%s: %s\n", key, value) + }) + } +} diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index da027bf5ef..ac3ed7bd20 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -6,6 +6,7 @@ import ( "net" "path/filepath" "sync" + atomicstd "sync/atomic" "time" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" @@ -134,6 +135,13 @@ type cfg struct { persistate *state.PersistentStorage netMapSource netmapCore.Source + + // current network map + netMap atomicstd.Value // type netmap.NetMap +} + +func (c *cfg) ProcessCurrentNetMap(f func(netmap.NetMap)) { + f(c.netMap.Load().(netmap.NetMap)) } type cfgGRPC struct { diff --git a/cmd/neofs-node/netmap.go b/cmd/neofs-node/netmap.go index 86dc397c71..1fd522c0f2 100644 --- a/cmd/neofs-node/netmap.go +++ b/cmd/neofs-node/netmap.go @@ -286,6 +286,8 @@ func (c *cfg) netmapLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, error) { return nil, err } + c.netMap.Store(*nm) + nmNodes := nm.Nodes() for i := range nmNodes { if bytes.Equal(nmNodes[i].PublicKey(), c.binPublicKey) { diff --git a/go.mod b/go.mod index 1d0119e412..8357f6e74e 100644 --- a/go.mod +++ b/go.mod @@ -17,9 +17,9 @@ require ( github.com/nspcc-dev/hrw v1.0.9 github.com/nspcc-dev/neo-go v0.99.2 github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b // indirect - github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20220827080658-9e17cdfc7647 + github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20220919124434-cf868188ef9c github.com/nspcc-dev/neofs-contract v0.15.5 - github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.6.0.20220914073456-f75a5feba335 + github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.6.0.20220922065107-8e3173eacd23 github.com/nspcc-dev/tzhash v1.6.1 github.com/panjf2000/ants/v2 v2.4.0 github.com/paulmach/orb v0.2.2 diff --git a/go.sum b/go.sum index 54e5c031da5811818056f5420805fa4b93ed5880..f1475e838d0634c226c52900d2182e6dbcf9ca8c 100644 GIT binary patch delta 357 zcmZwBu};E3007V!2L~`}jBzj~4sHb6yDRP0O$x+=wh540%T}%}r4|ab2)OzI#N6g) zOh}B9AP#<>!sfsayuA5rZ$8^wg3po+WB>&L30dl45d(}}Po@_>xU!n#q+rRTY2R-6 zEtk_(KZ=WXk9d;=-}<$%p<0GpCguZXM;{pzQLQ|z!lcEX-_O|oGQ|$Rj;mX}f6=f4 zs!(W}c`Y`E*BvMcfX0|>H@P4XK_|R%p+5Drk)_4#_3e}`SE;A;>Lu|9-`@G$JA7>#CM2^Qo!V|HBJ?1(b zhxcN&C-}MEeFF(4It`SHW!N-t`b{6!ifRYhs$u9_i!xT${>0e!B#eDr=m)`nQ)C4i yJ@7+UF6d^AOVI2TUwS=>SNWE>jlyw+%z-TtHF=68aT|NLVCI#I9 delta 15 WcmeB^>y?|(z-T(LF=68)9XO6^SM~=@9yA+ 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 B9xVU> delta 10206 zcmbVSdt6m@w*RaH=Y4>~`v3w5P~MO8=Ak@PG!X^g?@>S@Qv(!AtyCPxZcjnh$Qs8c zu$i$eN3l~nHEG&(d)!L2$Mi4-Z{gK4#i?dYOYZvZ4JZel+uVO(@AX^1^;^I1Z>{fI zd+&4f*Q)Nbs-{|SZe3Zt_0-y}e=)mf!7Lxk9hLRw>dN}N%WKVb)#bHyOKa-Qt14IC zQ(0G^uB%^LTWKzlMyK};;@*NSfp-p_gexb9`Ff}xPJGW(ba~zoEpSz!#=p{2(>ivN zr>IOh!c%m)bSc&abbE?F|Aoam##;qe|K_exU0_8_r?c%ima6rJw@&IMeaSm3lw-DvJx{kg<#g$ad@a91W)^K!{F#{ zd^OCU8fJhBYXbj(e=_?CC3jYk!wb*Hi5dQA4AD8=};h5p@>tP3cBUybr3)yU>v4*FWYyZVvOpG>cIF2_Lfxr57O+ z3x>zJwF&-SxY$*R8puIo})b$aWPL6^+9U z+XL{LWovVuP&Z)I4i)~8mxOz4Yw(GDF;!MoC-`7?ngKJm>oKn~7oW%oa=&cft-#mD zR5j=N;-XA7o^qYTVTEV$*{l~8R*SnVd!!d;OjP2>6Uv{;1-|5=r-Ru1@9~XdBUWeo zqNPBOh6D|65!d-DcUS%w3jAkDB_1l$W5F0T=8XLU=S}IxSN>$g<;#+=v{;Yh$F0Ec zr~2K{3DUbykNaMM<&9N%xF`Vk%p8kbik?E6B_`_8T>P|`eVq>X7e%|z7yEkQ1M@4f z^$&$X%<#gbYB4d4qvkR;*9awlGEU?#!W&ihpTX6&FGDsq zRF6OrgB2?y82AlU*s2b|<7y>dt@}H!+ISXEspR|ImLxRwjXls(_4~$qy)bUG(D%XK zH9pwYI2JeP1Dk!7*mj>9ukR1V_Ws*)-1(reD|5epM$_#P&Qgu4dJdStC~HN zvi7woPf^o`rC9&S5F)u)H`Pduh*Q{D@ z=317n)5_%DPx2TuFEWA^cr3McRZV@3J=VOeuBJLCRugY?((7>JnpC#qjcT)ksz=wxct9_IZ;1UlDy|{q5#SIckQUcq$A1L@fTlg zeM!fAct?Q;k5#%`5BdP69v8JD5ceHWN-=rAbgh+1W)O8e$kEaCkxJsy1*N{&c_;uM*fS4%J~}H35q3=1qi{*oAu&+|sp;Kh z-1Vj?H9B|o5mJB)r*g3ME-})pg`mf4b%n^KNWO`Fox`uegqPm#8;yRw99-^=uRja; z!HED-mn22^+&8uAND?!a8n3HopG7RGk*RC6Z?kOG+O~ zL}gVFS~`?i^TJj9?8U|Sm*44e!hsoFw1iwf>?iJ&b@;F$3%9Oa(l`1e-$CA&T*%~c zk>6n-`{9ueDd@aKjH7XRtT6Qa`)d^lekM$z(_&0_P`s;BjJTxnOpCbAv`Z4P;2KwzBynJAcLrUE zg<|aKG^li1%Nm=Vjw&GsUpNzE5%*4c*3Ys=uckw~(pH(O)6$s;h$Eu{EYuJU2AZRX zbnLnujO||qkWtT)XOdtf)rNwGdK3_VZCwUxGJ_7Yzh-B?H}F1ar5BikDxAXAK^t}P zMpKf6cRy>FbixJUbUYSRWU=zfZ5bf%)t1)fBb|N2~3$J!1(yxLcMPaFuA=h=st3}?g zu}FgvHtD9KV$lADUse|xlQ=g0z8o%KI+_k?G&2}%G%*U2#8$HKs~_}u-&H*}o%chZ zGa+c{j>k_vOT)7l2K2e6$Cthe=^9Q&@^J*C`KL6DIu(MK z&T8p>JtUy{e`IqY1jXoNNNNcHZ@hTUhS?|MC?o<>``4wR%JB?m_P^mOl}0jMJpXmD*iy%((HL>r zh-KZrbiaYmAn$?({Z1yM`MilfH?XsKAqZIfkc`TMIE{PGG}+-}zE$DreiIZEp%=P2_#<-Vs&H-HZQ>xg)F*CE!5kK&wYCj0Z&Yw&| znh_&QV=(u6gmfw{2X6f;iDTM;hQEu=MzXVJT9(0+^t~b~FrqgSkM|~1p+CpL6b%RQ z`rZgIsDmrkbuXfZ;HDTPIKSx#py~0UZDB zsl4kNU?=l4*tU!?Fr*#VlvJ1uasQtzpsijY(tz5$;SRdw1=7wn-t0t6|30sX$NL zW5A!1VCrbYjJWt7-T_^ zw+NrvAhIP*xcZZxH}KLq?z+C?&@(X4o{wa5_~xn^%T604zU54{Vb_l;H1>q{tBoW7 zG|p*>Y=_HGOi{vIE`BP?jAMXbRYI|-dn%@vSZWL9=UB^?z8y&Q!DSQ0BN2~uvy*1d zZAM!qr7A%TOugy0A_fAeR1NtWjyh|W$cfgkA_fq*Nn#O(^std}XUK=sJ4T4oNN{mC zKu5wLLLiKgI{W6O%H4zqf5T$B+aE&d$w&^#{!_71R1}-_9>%+ijDv8&-Qrxr z2PoJ?o8s92QYRnI=TRItx6Af6vy9ZgPV^Xh)X1U3A*G_ASS~FY8a||VV<1@o=;se} zMMRZbMDWdtWv?EKV}SctkD|BzIg`JQ<-+z6QzkB(q(xIzu1Ya<}uETS*dA^I%4#2?wxL0ZJ4?-~o|BaMy+iRG=I zhI?CCg`VmY9Q`avBLtj!6>=AM{Ipi={zyDz(fR~P5I40cOe3`?lPNEOJBqGT3w@nd z21Pc`e{tWLjMSgi%Q~cKRx0y`c)8xccqW{*$zc4M9lz+&Q>2<_EvJ227%|w&h@a)f z;Ldj#ElK2R_4xUKzE)Gid&VP|gX!Hw4!&bbum}+P+dEoqffQ;@V&d3w!N9N#zg4#? zW}NWnp0+v}(zrWI9Do^j_B_H(oknnMB<)Lp{w7W=ORuItMt?^Y-u#u05>vTh=tzY$ zC7%;3Y)pj=G=5>^M#(Ii717KD3T7Ej>1i^DCGl9QREN>0CzmE!S)oUaz3#;k(*|Jb zcV;m{*BI>mk{j)7+1y|!(ZzIrkf^eOg`?QNZzO+PJ7);@OR-XmNBc5Bs}!M?O;36= z7E%^o$q+2B;6FWD5FJO04(yU&P)<9=!xGEWK%E z-t1&Q2}g--s6^Gu7;r6F?l=ai@bP$o6u6>Cr}9M3Yi2O1;9d^mP(G2!{flo`fMk9U zTe$@6{q!7n^TDbHh$m`*+oVwNbBL#jzK)j?ozi}3V;nPDKRd+G!z`8_$p*L}M>v@x z_MxIluE7kdqF=@F2}#ord+`wq^Xg1F-6Jzu;M=96*_jY8++EKChH4-G<6CU|WI8=# zVr~+>Dr!Fspm|xqW#-_@EVx^ta9F4-2TpptAEbs{2yybOR9lXDaZPpos+tw)^2@&d zuXNMoFL*j_qQ^%riYkDRVLa7-yQ#EqB%l8Mqqy#TK7pClYZPzXTEzYR@h}xl5qE}M z9-L6jEmP-cZj67!GRUO7Vor)PVtj`f-(Jk^Q(`U;Wm97@8(NkNR!Yy~z3RqtSii(W z3ahn+YduE)K}BA9+>jp5=p}SXyQ1q%5X=~d!;+9{T~Z61_QgV<5GOsl@*?pw@xTMIi&z#h$S zv3MERZI#+4LtL)sGV<4u!Rut+*2K;!VAt5Vi{OQ_C}R{SgZQ#acTMB7_9=qMeq6F| z8kE3En*?eOA)XRL&rIeFGZrzqas2sc`=PYTqt8wPJHyx?lYPb``bfYqpl-iOrF|l# zX!zBWI1z`CN73%d>=MrkADG}214SC{dxV-x1a`^5V5S`B?5kB_m4ZG*igL-!ib)VQ zped7#H2B;kNY>irNU(`ah@u}Sfump5CbEJ(DG^%yo{g8a*#r&AiNdCx1FH6Zxm7Fr zGok8`Q)uZlM!C8KLI-r6^1#(nNY%)PZgcgMn3^U};f=Gto+)hrTwCT1h0;<;(aL9N z%aSNAlG;kaq3b&cTXvuDno#6te0IjpIVHGI`mQRLaB`Y4R~B+}CG06&sdS={YxMOg zklF7jr~E)JFPzHG$|q!Z$l1(cFpN5;-Uu2ywdFHC?VbXuYWbAxbTOZ)f+27X7|j$s z8%5IY`F*i)PGVr0dM8a`v{uaFMN-S>FBgp zc@s{%yv~-{kgee*gf)jOGSBCwugvD&Ba2Grv7rfbV2r%25!5~h9Hg2*bZ^J!fhp$J z+@upBD6Mc~a|K!sB}vw|ukyJZb{q{t=CaVvxlpRH%BSn1vYEW|u36kgM9+itzLep& z4~$40t(nKv-8+xp7rJh2%7;z}O*vj&H+D8!BS)OeDQ}kd#w0c$G7K^Z^PR37my2o_ zFl=Y$LvX*?;mUFLiA@V2=q9m45}Rqx0x%2_I~g}&>)W@W zb}oeu+ED=$=}@lyHrQ>wj-U+au~fcvU{RD)4Q7^-1n%L+J2Nj1`i_%()_E-mAU(`s3>xEfB=nw9dEzxYx`kJPZ4 z)>SNO+{`J~Udy*{)ycOa&!y>a(B*n|rF0>GXyKnmwA8V|sC#7zAACK0K$BMw#p;R8 zJaEq%DE35mFK?(d@#~z;btgiIK@Xy)xq7H!5{ced})-&xw~Z#i)m6dKiV|>mD}n~@TO>| s)I)(1b6tsqmo* zO=K6FTqEW_*_u0RvVbJ(<_Rpb*wEDwZ<>I-$m9ot+~@{0@Y|pZO%%@Cti>J3O+7y! z6cbiQ^;}SDVQFe{iKc=EdO!euy}3s0EGxRJNHIe|-Wx-^tlef$88!_6E9g&0SE^`L zgD%vsk&Z4jPrE_`)lVA9B^5dfMX7~)7@oRs9JtwEy;BU`kOg*1=t2$l%A0T4>M{cW DDuV9c diff --git a/pkg/services/control/service_neofs.pb.go b/pkg/services/control/service_neofs.pb.go index e5aa50fea5ac28ed81e5d339b5d65bf5ca307e6d..70616a79801049d18ce3b127dc869ea3212ce2dc 100644 GIT binary patch delta 18 acmcaHn|bqRrVWjvljU^9Ht*4tSpoo0+Xt}# delta 351 zcmdn|nd!!C<_(Rae154VxrqhAd5HzZ8TloXCx~ipeqcM15mQ`b@`hTu$qHuE(4;o6 zV-{mV7i*k01zl|N1=+i3$|eiU%0m}A&v^`8D9}@MvcJ3NWPxmTHi&aK8?a2laAKh6 zg2^BBt)NOKf8?EsX3*w?X5#3s+MKg>D!SO@bBpewX`SpKl8-Lr*MDM?g1}^bY1YX- U;=Ggp1u9Rz!6mZ!w&;z;0E8fmssI20 diff --git a/pkg/services/control/service_test.go b/pkg/services/control/service_test.go index 8dbfffa4db..b64e67d7b7 100644 --- a/pkg/services/control/service_test.go +++ b/pkg/services/control/service_test.go @@ -33,30 +33,6 @@ func equalHealthCheckResponseBodies(b1, b2 *control.HealthCheckResponse_Body) bo b1.GetHealthStatus() == b2.GetHealthStatus() } -func TestNetmapSnapshotResponse_Body_StableMarshal(t *testing.T) { - testStableMarshal(t, - generateNetmapSnapshotResponseBody(), - new(control.NetmapSnapshotResponse_Body), - func(m1, m2 protoMessage) bool { - return equalNetmapSnapshotResponseBodies( - m1.(*control.NetmapSnapshotResponse_Body), - m2.(*control.NetmapSnapshotResponse_Body), - ) - }, - ) -} - -func generateNetmapSnapshotResponseBody() *control.NetmapSnapshotResponse_Body { - body := new(control.NetmapSnapshotResponse_Body) - body.SetNetmap(generateNetmap()) - - return body -} - -func equalNetmapSnapshotResponseBodies(b1, b2 *control.NetmapSnapshotResponse_Body) bool { - return equalNetmaps(b1.GetNetmap(), b2.GetNetmap()) -} - func TestSetNetmapStatusRequest_Body_StableMarshal(t *testing.T) { testStableMarshal(t, generateSetNetmapStatusRequestBody(), diff --git a/pkg/services/control/types.pb.go b/pkg/services/control/types.pb.go index b1962abce644bcca924c4c4abe6b1a204158c74a..4f95fa12ae37384f0212aa292d14c02e35e3ca28 100644 GIT binary patch delta 53 zcmaEInepjm#t8+CW)llN<%?3&a#E8^6qKM0B`(h5%DiL+B@n5^HE~Dv=3vH&82~j1 B6aWAK delta 24 gcmaEQneoYG#t8+CrV|T2C*H1{xKm+s2;;;I0F`YELjV8( diff --git a/pkg/services/netmap/executor.go b/pkg/services/netmap/executor.go index 797478090d..c4453327fc 100644 --- a/pkg/services/netmap/executor.go +++ b/pkg/services/netmap/executor.go @@ -26,6 +26,10 @@ type NodeState interface { // Must return current node state // in NeoFS API v2 NodeInfo structure. LocalNodeInfo() (*netmap.NodeInfo, error) + + // ProcessCurrentNetMap passes current local network map of the storage node + // into the given handler. + ProcessCurrentNetMap(func(netmapSDK.NetMap)) } // NetworkInfo encapsulates source of the @@ -123,3 +127,19 @@ func (s *executorSvc) NetworkInfo( return resp, nil } + +func (s *executorSvc) Snapshot(_ context.Context, req *netmap.SnapshotRequest) (*netmap.SnapshotResponse, error) { + var nmV2 netmap.NetMap + + s.state.ProcessCurrentNetMap(func(netMap netmapSDK.NetMap) { + netMap.WriteToV2(&nmV2) + }) + + body := new(netmap.SnapshotResponseBody) + body.SetNetMap(&nmV2) + + resp := new(netmap.SnapshotResponse) + resp.SetBody(body) + + return resp, nil +} diff --git a/pkg/services/netmap/response.go b/pkg/services/netmap/response.go index 81d9f52a30..c0e81b7c75 100644 --- a/pkg/services/netmap/response.go +++ b/pkg/services/netmap/response.go @@ -48,3 +48,16 @@ func (s *responseService) NetworkInfo(ctx context.Context, req *netmap.NetworkIn return resp.(*netmap.NetworkInfoResponse), nil } + +func (s *responseService) Snapshot(ctx context.Context, req *netmap.SnapshotRequest) (*netmap.SnapshotResponse, error) { + resp, err := s.respSvc.HandleUnaryRequest(ctx, req, + func(ctx context.Context, req interface{}) (util.ResponseMessage, error) { + return s.svc.Snapshot(ctx, req.(*netmap.SnapshotRequest)) + }, + ) + if err != nil { + return nil, err + } + + return resp.(*netmap.SnapshotResponse), nil +} diff --git a/pkg/services/netmap/server.go b/pkg/services/netmap/server.go index 359d2ac901..cbd668396a 100644 --- a/pkg/services/netmap/server.go +++ b/pkg/services/netmap/server.go @@ -10,4 +10,5 @@ import ( type Server interface { LocalNodeInfo(context.Context, *netmap.LocalNodeInfoRequest) (*netmap.LocalNodeInfoResponse, error) NetworkInfo(context.Context, *netmap.NetworkInfoRequest) (*netmap.NetworkInfoResponse, error) + Snapshot(context.Context, *netmap.SnapshotRequest) (*netmap.SnapshotResponse, error) } diff --git a/pkg/services/netmap/sign.go b/pkg/services/netmap/sign.go index 13473c4417..73df0528d2 100644 --- a/pkg/services/netmap/sign.go +++ b/pkg/services/netmap/sign.go @@ -54,3 +54,19 @@ func (s *signService) NetworkInfo(ctx context.Context, req *netmap.NetworkInfoRe return resp.(*netmap.NetworkInfoResponse), nil } + +func (s *signService) Snapshot(ctx context.Context, req *netmap.SnapshotRequest) (*netmap.SnapshotResponse, error) { + resp, err := s.sigSvc.HandleUnaryRequest(ctx, req, + func(ctx context.Context, req interface{}) (util.ResponseMessage, error) { + return s.svc.Snapshot(ctx, req.(*netmap.SnapshotRequest)) + }, + func() util.ResponseMessage { + return new(netmap.SnapshotResponse) + }, + ) + if err != nil { + return nil, err + } + + return resp.(*netmap.SnapshotResponse), nil +} diff --git a/pkg/services/tree/service.pb.go b/pkg/services/tree/service.pb.go index 3beaf2c9d1a27a9e6e7573fa8b95b5656cfe16b7..2d30dce79d333809016de7a60413f11948ff8500 100644 GIT binary patch delta 17 ZcmccB&33DsZNeNzv&Okw=Q7&10su!12WMlE6%6_04s