forked from TrueCloudLab/frostfs-node
[#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:
parent
175e9da3a7
commit
a52e7c2c99
7 changed files with 33 additions and 30 deletions
9
cmd/neofs-cli/internal/commonflags/expiration.go
Normal file
9
cmd/neofs-cli/internal/commonflags/expiration.go
Normal 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"
|
||||||
|
)
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -17,7 +17,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
lifetimeFlag = "lifetime"
|
|
||||||
outFlag = "out"
|
outFlag = "out"
|
||||||
jsonFlag = commonflags.JSON
|
jsonFlag = commonflags.JSON
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -25,8 +25,6 @@ const (
|
||||||
cidFlag = "cid"
|
cidFlag = "cid"
|
||||||
)
|
)
|
||||||
|
|
||||||
const sgLifetimeFlag = "lifetime"
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
storageGroupChildCommands := []*cobra.Command{
|
storageGroupChildCommands := []*cobra.Command{
|
||||||
sgPutCmd,
|
sgPutCmd,
|
||||||
|
|
Loading…
Reference in a new issue