[#1612] neofs-cli: Unify expiration flags

Use `expire-at` everywhere expiration epoch is expected.

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2022-07-19 15:45:58 +03:00 committed by fyrchik
parent 175e9da3a7
commit a52e7c2c99
7 changed files with 33 additions and 30 deletions

View file

@ -0,0 +1,9 @@
package commonflags
const (
// ExpireAt is a flag for setting last epoch of an object or a token.
ExpireAt = "expire-at"
// Lifetime is a flag for setting the lifetime of an object or a token,
// starting from the current epoch.
Lifetime = "lifetime"
)

View file

@ -20,7 +20,6 @@ const (
eaclFlag = "eacl" eaclFlag = "eacl"
issuedAtFlag = "issued-at" issuedAtFlag = "issued-at"
notValidBeforeFlag = "not-valid-before" notValidBeforeFlag = "not-valid-before"
expireAtFlag = "expire-at"
ownerFlag = "owner" ownerFlag = "owner"
outFlag = "out" outFlag = "out"
jsonFlag = commonflags.JSON jsonFlag = commonflags.JSON
@ -42,7 +41,7 @@ func init() {
createCmd.Flags().StringP(eaclFlag, "e", "", "path to the extended ACL table") createCmd.Flags().StringP(eaclFlag, "e", "", "path to the extended ACL table")
createCmd.Flags().StringP(issuedAtFlag, "i", "", "epoch to issue token at") createCmd.Flags().StringP(issuedAtFlag, "i", "", "epoch to issue token at")
createCmd.Flags().StringP(notValidBeforeFlag, "n", "", "not valid before epoch") createCmd.Flags().StringP(notValidBeforeFlag, "n", "", "not valid before epoch")
createCmd.Flags().StringP(expireAtFlag, "x", "", "expiration epoch") createCmd.Flags().StringP(commonflags.ExpireAt, "x", "", "expiration epoch")
createCmd.Flags().StringP(ownerFlag, "o", "", "token owner") createCmd.Flags().StringP(ownerFlag, "o", "", "token owner")
createCmd.Flags().String(outFlag, "", "file to write token to") createCmd.Flags().String(outFlag, "", "file to write token to")
createCmd.Flags().Bool(jsonFlag, false, "output token in JSON") createCmd.Flags().Bool(jsonFlag, false, "output token in JSON")
@ -52,7 +51,7 @@ func init() {
_ = cobra.MarkFlagRequired(createCmd.Flags(), issuedAtFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), issuedAtFlag)
_ = cobra.MarkFlagRequired(createCmd.Flags(), notValidBeforeFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), notValidBeforeFlag)
_ = cobra.MarkFlagRequired(createCmd.Flags(), expireAtFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.ExpireAt)
_ = cobra.MarkFlagRequired(createCmd.Flags(), ownerFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), ownerFlag)
_ = cobra.MarkFlagRequired(createCmd.Flags(), outFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), outFlag)
} }
@ -62,7 +61,7 @@ func createToken(cmd *cobra.Command, _ []string) error {
if err != nil { if err != nil {
return err return err
} }
exp, expRelative, err := common.ParseEpoch(cmd, expireAtFlag) exp, expRelative, err := common.ParseEpoch(cmd, commonflags.ExpireAt)
if err != nil { if err != nil {
return err return err
} }

View file

@ -2,6 +2,7 @@ package object
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strconv" "strconv"
"time" "time"
@ -19,8 +20,6 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
const lockExpiresOnFlag = "expires-on"
// object lock command. // object lock command.
var objectLockCmd = &cobra.Command{ var objectLockCmd = &cobra.Command{
Use: "lock CONTAINER OBJECT...", Use: "lock CONTAINER OBJECT...",
@ -50,10 +49,13 @@ var objectLockCmd = &cobra.Command{
var lock objectSDK.Lock var lock objectSDK.Lock
lock.WriteMembers(lockList) lock.WriteMembers(lockList)
exp, relative, err := common.ParseEpoch(cmd, lockExpiresOnFlag) exp, _ := cmd.Flags().GetUint64(commonflags.ExpireAt)
common.ExitOnErr(cmd, "Parsing expiration epoch: %w", err) lifetime, _ := cmd.Flags().GetUint64(commonflags.Lifetime)
if exp == 0 && lifetime == 0 { // mutual exclusion is ensured by cobra
common.ExitOnErr(cmd, "", errors.New("either expiration epoch of a lifetime is required"))
}
if relative { if lifetime != 0 {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
defer cancel() defer cancel()
@ -94,6 +96,7 @@ func initCommandObjectLock() {
commonflags.Init(objectLockCmd) commonflags.Init(objectLockCmd)
commonflags.InitSession(objectLockCmd) commonflags.InitSession(objectLockCmd)
objectLockCmd.Flags().StringP(lockExpiresOnFlag, "e", "", "Lock expiration epoch") objectLockCmd.Flags().Uint64P(commonflags.ExpireAt, "e", 0, "Lock expiration epoch")
_ = objectLockCmd.MarkFlagRequired(lockExpiresOnFlag) objectLockCmd.Flags().Uint64(commonflags.Lifetime, 0, "Lock lifetime")
objectLockCmd.MarkFlagsMutuallyExclusive(commonflags.ExpireAt, commonflags.Lifetime)
} }

View file

@ -22,7 +22,6 @@ import (
) )
const ( const (
putExpiresOnFlag = "expires-on"
noProgressFlag = "no-progress" noProgressFlag = "no-progress"
notificationFlag = "notify" notificationFlag = "notify"
) )
@ -52,7 +51,7 @@ func initObjectPutCmd() {
flags.String("attributes", "", "User attributes in form of Key1=Value1,Key2=Value2") flags.String("attributes", "", "User attributes in form of Key1=Value1,Key2=Value2")
flags.Bool("disable-filename", false, "Do not set well-known filename attribute") flags.Bool("disable-filename", false, "Do not set well-known filename attribute")
flags.Bool("disable-timestamp", false, "Do not set well-known timestamp attribute") flags.Bool("disable-timestamp", false, "Do not set well-known timestamp attribute")
flags.Uint64VarP(&putExpiredOn, putExpiresOnFlag, "e", 0, "Last epoch in the life of the object") flags.Uint64VarP(&putExpiredOn, commonflags.ExpireAt, "e", 0, "Last epoch in the life of the object")
flags.Bool(noProgressFlag, false, "Do not show progress bar") flags.Bool(noProgressFlag, false, "Do not show progress bar")
flags.String(notificationFlag, "", "Object notification in the form of *epoch*:*topic*; '-' topic means using default") flags.String(notificationFlag, "", "Object notification in the form of *epoch*:*topic*; '-' topic means using default")
@ -76,7 +75,7 @@ func putObject(cmd *cobra.Command, _ []string) {
attrs, err := parseObjectAttrs(cmd) attrs, err := parseObjectAttrs(cmd)
common.ExitOnErr(cmd, "can't parse object attributes: %w", err) common.ExitOnErr(cmd, "can't parse object attributes: %w", err)
expiresOn, _ := cmd.Flags().GetUint64(putExpiresOnFlag) expiresOn, _ := cmd.Flags().GetUint64(commonflags.ExpireAt)
if expiresOn > 0 { if expiresOn > 0 {
var expAttrFound bool var expAttrFound bool
expAttrValue := strconv.FormatUint(expiresOn, 10) expAttrValue := strconv.FormatUint(expiresOn, 10)

View file

@ -17,9 +17,8 @@ import (
) )
const ( const (
lifetimeFlag = "lifetime" outFlag = "out"
outFlag = "out" jsonFlag = commonflags.JSON
jsonFlag = commonflags.JSON
) )
const defaultLifetime = 10 const defaultLifetime = 10
@ -35,14 +34,14 @@ var createCmd = &cobra.Command{
} }
func init() { func init() {
createCmd.Flags().Uint64P(lifetimeFlag, "l", defaultLifetime, "number of epochs for token to stay valid") createCmd.Flags().Uint64P(commonflags.Lifetime, "l", defaultLifetime, "number of epochs for token to stay valid")
createCmd.Flags().StringP(commonflags.WalletPath, commonflags.WalletPathShorthand, commonflags.WalletPathDefault, commonflags.WalletPathUsage) createCmd.Flags().StringP(commonflags.WalletPath, commonflags.WalletPathShorthand, commonflags.WalletPathDefault, commonflags.WalletPathUsage)
createCmd.Flags().StringP(commonflags.Account, commonflags.AccountShorthand, commonflags.AccountDefault, commonflags.AccountUsage) createCmd.Flags().StringP(commonflags.Account, commonflags.AccountShorthand, commonflags.AccountDefault, commonflags.AccountUsage)
createCmd.Flags().String(outFlag, "", "file to write session token to") createCmd.Flags().String(outFlag, "", "file to write session token to")
createCmd.Flags().Bool(jsonFlag, false, "output token in JSON") createCmd.Flags().Bool(jsonFlag, false, "output token in JSON")
createCmd.Flags().StringP(commonflags.RPC, commonflags.RPCShorthand, commonflags.RPCDefault, commonflags.RPCUsage) createCmd.Flags().StringP(commonflags.RPC, commonflags.RPCShorthand, commonflags.RPCDefault, commonflags.RPCUsage)
_ = cobra.MarkFlagRequired(createCmd.Flags(), lifetimeFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.Lifetime)
_ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.WalletPath) _ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.WalletPath)
_ = cobra.MarkFlagRequired(createCmd.Flags(), outFlag) _ = cobra.MarkFlagRequired(createCmd.Flags(), outFlag)
_ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.RPC) _ = cobra.MarkFlagRequired(createCmd.Flags(), commonflags.RPC)
@ -63,7 +62,7 @@ func createSession(cmd *cobra.Command, _ []string) error {
} }
lifetime := uint64(defaultLifetime) lifetime := uint64(defaultLifetime)
if lfArg, _ := cmd.Flags().GetUint64(lifetimeFlag); lfArg != 0 { if lfArg, _ := cmd.Flags().GetUint64(commonflags.Lifetime); lfArg != 0 {
lifetime = lfArg lifetime = lfArg
} }

View file

@ -5,7 +5,6 @@ import (
"crypto/ecdsa" "crypto/ecdsa"
"errors" "errors"
"fmt" "fmt"
"strconv"
internalclient "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/client" 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/common"
@ -45,8 +44,8 @@ func initSGPutCmd() {
flags.StringSliceVarP(&sgMembers, sgMembersFlag, "m", nil, "ID list of storage group members") flags.StringSliceVarP(&sgMembers, sgMembersFlag, "m", nil, "ID list of storage group members")
_ = sgPutCmd.MarkFlagRequired(sgMembersFlag) _ = sgPutCmd.MarkFlagRequired(sgMembersFlag)
flags.Uint64(sgLifetimeFlag, 0, "Storage group lifetime in epochs") flags.Uint64(commonflags.Lifetime, 0, "Storage group lifetime in epochs")
_ = sgPutCmd.MarkFlagRequired(sgLifetimeFlag) _ = sgPutCmd.MarkFlagRequired(commonflags.Lifetime)
} }
func putSG(cmd *cobra.Command, _ []string) { func putSG(cmd *cobra.Command, _ []string) {
@ -58,15 +57,11 @@ func putSG(cmd *cobra.Command, _ []string) {
var cnr cid.ID var cnr cid.ID
readCID(cmd, &cnr) readCID(cmd, &cnr)
lifetimeStr := cmd.Flag(sgLifetimeFlag).Value.String()
lifetime, err := strconv.ParseUint(lifetimeStr, 10, 64)
common.ExitOnErr(cmd, "could not parse lifetime: %w", err)
members := make([]oid.ID, len(sgMembers)) members := make([]oid.ID, len(sgMembers))
uniqueFilter := make(map[oid.ID]struct{}, len(sgMembers)) uniqueFilter := make(map[oid.ID]struct{}, len(sgMembers))
for i := range sgMembers { for i := range sgMembers {
err = members[i].DecodeString(sgMembers[i]) err := members[i].DecodeString(sgMembers[i])
common.ExitOnErr(cmd, "could not parse object ID: %w", err) common.ExitOnErr(cmd, "could not parse object ID: %w", err)
if _, alreadyExists := uniqueFilter[members[i]]; alreadyExists { if _, alreadyExists := uniqueFilter[members[i]]; alreadyExists {
@ -108,6 +103,7 @@ func putSG(cmd *cobra.Command, _ []string) {
ni, err := internalclient.NetworkInfo(netInfoPrm) ni, err := internalclient.NetworkInfo(netInfoPrm)
common.ExitOnErr(cmd, "can't fetch network info: %w", err) common.ExitOnErr(cmd, "can't fetch network info: %w", err)
lifetime, _ := cmd.Flags().GetUint64(commonflags.Lifetime)
sg.SetExpirationEpoch(ni.NetworkInfo().CurrentEpoch() + lifetime) sg.SetExpirationEpoch(ni.NetworkInfo().CurrentEpoch() + lifetime)
obj := object.New() obj := object.New()

View file

@ -25,8 +25,6 @@ const (
cidFlag = "cid" cidFlag = "cid"
) )
const sgLifetimeFlag = "lifetime"
func init() { func init() {
storageGroupChildCommands := []*cobra.Command{ storageGroupChildCommands := []*cobra.Command{
sgPutCmd, sgPutCmd,