[#1614] adm/frostfsid: Add 'set-kv'
All checks were successful
DCO action / DCO (pull_request) Successful in 41s
Vulncheck / Vulncheck (pull_request) Successful in 59s
Build / Build Components (pull_request) Successful in 2m0s
Pre-commit hooks / Pre-commit (pull_request) Successful in 2m0s
Tests and linters / gopls check (pull_request) Successful in 2m42s
Tests and linters / Run gofumpt (pull_request) Successful in 2m42s
Tests and linters / Staticcheck (pull_request) Successful in 3m21s
Tests and linters / Tests (pull_request) Successful in 3m24s
Tests and linters / Lint (pull_request) Successful in 3m26s
Tests and linters / Tests with -race (pull_request) Successful in 4m11s

Signed-off-by: Alexander Chuprov <a.chuprov@yadro.com>
This commit is contained in:
Alexander Chuprov 2025-02-04 16:04:55 +03:00
parent 4de5fca547
commit 626a7ae344
Signed by: achuprov
GPG key ID: 2D916FFD803B0EDD
2 changed files with 73 additions and 0 deletions

View file

@ -1,11 +1,13 @@
package frostfsid
import (
"errors"
"fmt"
"math/big"
"sort"
frostfsidclient "git.frostfs.info/TrueCloudLab/frostfs-contract/frostfsid/client"
"git.frostfs.info/TrueCloudLab/frostfs-contract/nns"
frostfsidrpclient "git.frostfs.info/TrueCloudLab/frostfs-contract/rpcclient/frostfsid"
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/commonflags"
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/constants"
@ -38,6 +40,13 @@ const (
groupIDFlag = "group-id"
rootNamespacePlaceholder = "<root>"
disableFlag = "disable"
disableDescFlag = "Remove the specified key from the subject's KV storage"
keyFlag = "key"
keyDescFlag = "Key for storing a value in the subject's KV storage"
valueFlag = "value"
valueDescFlag = "Key for storing a value in the subject's KV storage"
)
var (
@ -151,6 +160,15 @@ var (
},
Run: frostfsidListGroupSubjects,
}
frostfsidSetKVCmd = &cobra.Command{
Use: "set-kv",
Short: "Store a key-value pair in the subject's KV storage",
PreRun: func(cmd *cobra.Command, _ []string) {
_ = viper.BindPFlag(commonflags.EndpointFlag, cmd.Flags().Lookup(commonflags.EndpointFlag))
},
Run: frostfsidSetKV,
}
)
func initFrostfsIDCreateNamespaceCmd() {
@ -236,6 +254,18 @@ func initFrostfsIDListGroupSubjectsCmd() {
frostfsidListGroupSubjectsCmd.Flags().Bool(includeNamesFlag, false, "Whether include subject name (require additional requests)")
}
func initFrostfsIDSetKVCmd() {
Cmd.AddCommand(frostfsidSetKVCmd)
frostfsidSetKVCmd.Flags().StringP(commonflags.EndpointFlag, commonflags.EndpointFlagShort, "", commonflags.EndpointFlagDesc)
frostfsidSetKVCmd.Flags().String(subjectAddressFlag, "", "Subject address")
frostfsidSetKVCmd.Flags().String(keyFlag, "", keyDescFlag)
frostfsidSetKVCmd.Flags().String(valueFlag, "", valueDescFlag)
frostfsidSetKVCmd.Flags().Bool(disableFlag, false, disableDescFlag)
for k, v := range wellKnownFlags {
frostfsidSetKVCmd.Flags().Bool(k, false, v.description)
}
}
func frostfsidCreateNamespace(cmd *cobra.Command, _ []string) {
ns := getFrostfsIDNamespace(cmd)
@ -403,6 +433,48 @@ func frostfsidRemoveSubjectFromGroup(cmd *cobra.Command, _ []string) {
commonCmd.ExitOnErr(cmd, "remove subject from group error: %w", err)
}
const disable = "disable"
type wellKnownFlagDescription struct {
description string
value string
}
var wellKnownFlags = map[string]wellKnownFlagDescription{
nns.FrostfsIDNNSTLDPermissionKey: {"Allow subject to create TLD domains", nns.FrostfsIDTLDRegistrationAllowed},
}
func frostfsidSetKV(cmd *cobra.Command, _ []string) {
subjectAddress := getFrostfsIDSubjectAddress(cmd)
key, _ := cmd.Flags().GetString(keyFlag)
value, _ := cmd.Flags().GetString(valueFlag)
for wellKnownKey, flagInfo := range wellKnownFlags {
if ok, _ := cmd.Flags().GetBool(wellKnownKey); ok {
key = wellKnownKey
value = flagInfo.value
break
}
}
if key == "" {
commonCmd.ExitOnErr(cmd, "", errors.New("key can`t be empty"))
}
ffsid, err := newFrostfsIDClient(cmd)
commonCmd.ExitOnErr(cmd, "init contract client: %w", err)
method, args := ffsid.roCli.SetSubjectKVCall(subjectAddress, key, value)
if ok, _ := cmd.Flags().GetBool(disable); ok {
method, args = ffsid.roCli.DeleteSubjectKVCall(subjectAddress, key)
}
ffsid.addCall(method, args)
err = ffsid.sendWait()
commonCmd.ExitOnErr(cmd, "failed to perform operation: %w", err)
}
func frostfsidListGroupSubjects(cmd *cobra.Command, _ []string) {
ns := getFrostfsIDNamespace(cmd)
groupID := getFrostfsIDGroupID(cmd)

View file

@ -12,6 +12,7 @@ func init() {
initFrostfsIDAddSubjectToGroupCmd()
initFrostfsIDRemoveSubjectFromGroupCmd()
initFrostfsIDListGroupSubjectsCmd()
initFrostfsIDSetKVCmd()
initFrostfsIDAddSubjectKeyCmd()
initFrostfsIDRemoveSubjectKeyCmd()
}