From 3b081cd60e73346a46f93e6a3e8310c8252e0a9e Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:20:04 +0800 Subject: [PATCH 01/13] feat: Batch block accounts. --- internal/cacctmgr/CmdArgParser.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/internal/cacctmgr/CmdArgParser.go b/internal/cacctmgr/CmdArgParser.go index 50626fa9..0ef86666 100644 --- a/internal/cacctmgr/CmdArgParser.go +++ b/internal/cacctmgr/CmdArgParser.go @@ -396,10 +396,16 @@ var ( Use: "account [flags] name", Short: "Block an account", Long: "", - Args: cobra.ExactArgs(1), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - if err := BlockAccountOrUser(args[0], protos.EntityType_Account, ""); err != util.ErrorSuccess { - os.Exit(err) + if len(args) == 0 { + if err := BlockAccountOrUser("", protos.EntityType_Account, ""); err != util.ErrorSuccess { + os.Exit(err) + } + } else { + if err := BlockAccountOrUser(args[0], protos.EntityType_Account, ""); err != util.ErrorSuccess { + os.Exit(err) + } } }, } @@ -425,10 +431,16 @@ var ( Use: "account [flags] name", Short: "Unblock an account", Long: "", - Args: cobra.ExactArgs(1), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - if err := UnblockAccountOrUser(args[0], protos.EntityType_Account, ""); err != util.ErrorSuccess { - os.Exit(err) + if len(args) == 0 { + if err := UnblockAccountOrUser("", protos.EntityType_Account, ""); err != util.ErrorSuccess { + os.Exit(err) + } + } else { + if err := UnblockAccountOrUser(args[0], protos.EntityType_Account, ""); err != util.ErrorSuccess { + os.Exit(err) + } } }, } From cb72c922cf065fd1bbb6c83c904cb6c274b04d93 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:57:22 +0800 Subject: [PATCH 02/13] feat: Batch block user in account --- internal/cacctmgr/CmdArgParser.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/internal/cacctmgr/CmdArgParser.go b/internal/cacctmgr/CmdArgParser.go index 0ef86666..5a5fa336 100644 --- a/internal/cacctmgr/CmdArgParser.go +++ b/internal/cacctmgr/CmdArgParser.go @@ -413,10 +413,16 @@ var ( Use: "user [flags] name", Short: "Block a user under an account", Long: "", - Args: cobra.ExactArgs(1), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - if err := BlockAccountOrUser(args[0], protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { - os.Exit(err) + if len(args) == 0 { + if err := BlockAccountOrUser("", protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { + os.Exit(err) + } + } else { + if err := BlockAccountOrUser(args[0], protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { + os.Exit(err) + } } }, } @@ -448,10 +454,16 @@ var ( Use: "user [flags] name", Short: "Unblock a user under an account", Long: "", - Args: cobra.ExactArgs(1), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - if err := UnblockAccountOrUser(args[0], protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { - os.Exit(err) + if len(args) == 0 { + if err := UnblockAccountOrUser("", protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { + os.Exit(err) + } + } else { + if err := UnblockAccountOrUser(args[0], protos.EntityType_User, FlagUser.Account); err != util.ErrorSuccess { + os.Exit(err) + } } }, } From 1eb0c790fbcce487971ebdeb89221f8d32724579 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:28:29 +0800 Subject: [PATCH 03/13] feat: Batch add user/account partition --- internal/cacctmgr/CmdArgParser.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cacctmgr/CmdArgParser.go b/internal/cacctmgr/CmdArgParser.go index 5a5fa336..110569b8 100644 --- a/internal/cacctmgr/CmdArgParser.go +++ b/internal/cacctmgr/CmdArgParser.go @@ -570,7 +570,7 @@ func init() { modifyAccountCmd.Flags().StringVarP(&FlagAccount.DefaultQos, "default-qos", "Q", "", "Set default QoS of the account") modifyAccountCmd.Flags().StringSliceVar(&FlagAccount.AllowedPartitions, "set-allowed-partition", nil, "Overwrite allowed partitions of the account (comma seperated list)") - modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add a single partition to allowed partition list") + modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add partition to allowed partition list") modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition from allowed partition list") modifyAccountCmd.Flags().StringSliceVar(&FlagAccount.AllowedQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") @@ -603,7 +603,7 @@ func init() { modifyUserCmd.Flags().StringVarP(&FlagSetDefaultAccount, "default-account", "D", "", "Modify default account of the user") modifyUserCmd.Flags().StringSliceVar(&FlagUserPartitions, "set-allowed-partition", nil, "Overwrite allowed partitions of the user (comma seperated list)") - modifyUserCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add a single partition to allowed partition list") + modifyUserCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add partition to allowed partition list") modifyUserCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition to allowed partition list") modifyUserCmd.Flags().StringSliceVar(&FlagUserQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") From 278dc9eaa240686c38bd9dc3219243c14c4bc521 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:45:41 +0800 Subject: [PATCH 04/13] feat: Batch add user/account qos --- internal/cacctmgr/CmdArgParser.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cacctmgr/CmdArgParser.go b/internal/cacctmgr/CmdArgParser.go index 110569b8..07d2a4f5 100644 --- a/internal/cacctmgr/CmdArgParser.go +++ b/internal/cacctmgr/CmdArgParser.go @@ -574,7 +574,7 @@ func init() { modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition from allowed partition list") modifyAccountCmd.Flags().StringSliceVar(&FlagAccount.AllowedQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") - modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add a single QoS to allowed QoS list") + modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add QoS to allowed QoS list") modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete a single QoS from allowed QoS list") // Other flags @@ -607,7 +607,7 @@ func init() { modifyUserCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition to allowed partition list") modifyUserCmd.Flags().StringSliceVar(&FlagUserQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") - modifyUserCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add a single QoS to allowed QoS list") + modifyUserCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add QoS to allowed QoS list") modifyUserCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete a single QoS from allowed QoS list") // Other flags From 1791f3869386097764df45f31db41cf6e5e47300 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 25 Nov 2024 16:10:05 +0800 Subject: [PATCH 05/13] feat: Batch delete user/account partition/qos --- internal/cacctmgr/CmdArgParser.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/cacctmgr/CmdArgParser.go b/internal/cacctmgr/CmdArgParser.go index 07d2a4f5..7d1ca28c 100644 --- a/internal/cacctmgr/CmdArgParser.go +++ b/internal/cacctmgr/CmdArgParser.go @@ -571,11 +571,11 @@ func init() { modifyAccountCmd.Flags().StringSliceVar(&FlagAccount.AllowedPartitions, "set-allowed-partition", nil, "Overwrite allowed partitions of the account (comma seperated list)") modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add partition to allowed partition list") - modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition from allowed partition list") + modifyAccountCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete partition from allowed partition list") modifyAccountCmd.Flags().StringSliceVar(&FlagAccount.AllowedQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add QoS to allowed QoS list") - modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete a single QoS from allowed QoS list") + modifyAccountCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete QoS from allowed QoS list") // Other flags modifyAccountCmd.Flags().BoolVarP(&FlagForce, "force", "F", false, "Forced to operate") @@ -604,11 +604,11 @@ func init() { modifyUserCmd.Flags().StringSliceVar(&FlagUserPartitions, "set-allowed-partition", nil, "Overwrite allowed partitions of the user (comma seperated list)") modifyUserCmd.Flags().StringVar(&FlagSetPartition, "add-allowed-partition", "", "Add partition to allowed partition list") - modifyUserCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete a single partition to allowed partition list") + modifyUserCmd.Flags().StringVar(&FlagSetPartition, "delete-allowed-partition", "", "Delete partition to allowed partition list") modifyUserCmd.Flags().StringSliceVar(&FlagUserQosList, "set-allowed-qos-list", nil, "Overwrite allowed QoS list of the user (comma seperated list)") modifyUserCmd.Flags().StringVar(&FlagQos.Name, "add-allowed-qos-list", "", "Add QoS to allowed QoS list") - modifyUserCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete a single QoS from allowed QoS list") + modifyUserCmd.Flags().StringVar(&FlagQos.Name, "delete-allowed-qos-list", "", "Delete QoS from allowed QoS list") // Other flags modifyUserCmd.Flags().BoolVarP(&FlagForce, "force", "F", false, "Forced operation") From 5b302765cb49ed39226de476b0f694f027c8eb87 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:35:18 +0800 Subject: [PATCH 06/13] feat: Add input validation --- internal/cacctmgr/cacctmgr.go | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 122b77de..bae9cea5 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -536,6 +536,22 @@ func ModifyAccount(modify_field protos.ModifyField, new_value string, name strin Force: FlagForce, } + if modify_field == protos.ModifyField_Qos { + _, err := util.ParseStringParamList(new_value, ",") + if err != nil { + log.Errorf("Invalid qos list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + + if modify_field == protos.ModifyField_Partition { + _, err := util.ParseStringParamList(new_value, ",") + if err != nil { + log.Errorf("Invalid partition list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + reply, err := stub.ModifyAccount(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Modify information") @@ -567,6 +583,22 @@ func ModifyUser(modify_field protos.ModifyField, new_value string, name string, } } + if modify_field == protos.ModifyField_Qos { + _, err := util.ParseStringParamList(new_value, ",") + if err != nil { + log.Errorf("Invalid qos list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + + if modify_field == protos.ModifyField_Partition { + _, err := util.ParseStringParamList(new_value, ",") + if err != nil { + log.Errorf("Invalid partition list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.ModifyUserRequest{ Uid: userUid, ModifyField: modify_field, @@ -658,6 +690,15 @@ func ShowAccounts() util.CraneCmdError { } func ShowUser(name string, account string) util.CraneCmdError { + + if name != "" { + _, err := util.ParseStringParamList(name, ",") + if err != nil { + log.Errorf("Invalid user list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.QueryUserInfoRequest{Uid: userUid, Name: name, Account: account} reply, err := stub.QueryUserInfo(context.Background(), &req) if err != nil { @@ -712,6 +753,15 @@ func ShowQos(name string) util.CraneCmdError { } func FindAccount(name string) util.CraneCmdError { + + if name != "" { + _, err := util.ParseStringParamList(name, ",") + if err != nil { + log.Errorf("Invalid account list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.QueryAccountInfoRequest{Uid: userUid, Name: name} reply, err := stub.QueryAccountInfo(context.Background(), &req) if err != nil { @@ -737,6 +787,15 @@ func FindAccount(name string) util.CraneCmdError { } func BlockAccountOrUser(name string, entityType protos.EntityType, account string) util.CraneCmdError { + + if name != "" { + _, err := util.ParseStringParamList(name, ",") + if err != nil { + log.Errorf("Invalid account/user list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: true, EntityType: entityType, Name: name, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { @@ -762,6 +821,15 @@ func BlockAccountOrUser(name string, entityType protos.EntityType, account strin } func UnblockAccountOrUser(name string, entityType protos.EntityType, account string) util.CraneCmdError { + + if name != "" { + _, err := util.ParseStringParamList(name, ",") + if err != nil { + log.Errorf("Invalid account/user list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: false, EntityType: entityType, Name: name, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { From 1963f92bfceed139e4476cbc7227cdc2b0a94e1e Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:20:36 +0800 Subject: [PATCH 07/13] feat: Refactor to split the list on the frontend. --- internal/cacctmgr/cacctmgr.go | 78 ++++++++++++++++++++++------------- protos/Crane.proto | 10 ++--- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index bae9cea5..3fcd8e71 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -448,12 +448,19 @@ func AddQos(qos *protos.QosInfo) util.CraneCmdError { } } -func DeleteAccount(name string) util.CraneCmdError { - req := protos.DeleteAccountRequest{Uid: userUid, Name: name} +func DeleteAccount(value string) util.CraneCmdError { + + account_list, err := util.ParseStringParamList(value, ",") + if err != nil { + log.Errorf("Invalid user list specified: %v.\n", err) + return util.ErrorCmdArg + } + + req := protos.DeleteAccountRequest{Uid: userUid, AccountList: account_list} reply, err := stub.DeleteAccount(context.Background(), &req) if err != nil { - util.GrpcErrorPrintf(err, "Failed to delete account %s", name) + util.GrpcErrorPrintf(err, "Failed to delete account %s", value) return util.ErrorNetwork } @@ -466,20 +473,26 @@ func DeleteAccount(name string) util.CraneCmdError { } } if reply.GetOk() { - fmt.Printf("Delete account %s succeeded.\n", name) + fmt.Printf("Delete account %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Delete account %s failed: %s.\n", name, util.ErrMsg(reply.GetReason())) + fmt.Printf("Delete account %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) return util.ErrorBackend } } -func DeleteUser(name string, account string) util.CraneCmdError { - req := protos.DeleteUserRequest{Uid: userUid, Name: name, Account: account} +func DeleteUser(value string, account string) util.CraneCmdError { + + user_list, err := util.ParseStringParamList(value, ",") + if err != nil { + log.Errorf("Invalid user list specified: %v.\n", err) + return util.ErrorCmdArg + } + req := protos.DeleteUserRequest{Uid: userUid, UserList: user_list, Account: account} reply, err := stub.DeleteUser(context.Background(), &req) if err != nil { - util.GrpcErrorPrintf(err, "Failed to remove user %s", name) + util.GrpcErrorPrintf(err, "Failed to remove user %s", value) return util.ErrorNetwork } @@ -492,10 +505,10 @@ func DeleteUser(name string, account string) util.CraneCmdError { } } if reply.GetOk() { - fmt.Printf("Remove user %s succeeded.\n", name) + fmt.Printf("Remove user %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Remove user %s failed: %s.\n", name, util.ErrMsg(reply.GetReason())) + fmt.Printf("Remove user %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) return util.ErrorBackend } } @@ -689,17 +702,19 @@ func ShowAccounts() util.CraneCmdError { } } -func ShowUser(name string, account string) util.CraneCmdError { +func ShowUser(value string, account string) util.CraneCmdError { - if name != "" { - _, err := util.ParseStringParamList(name, ",") + var user_list []string + if value != "" { + var err error + user_list, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.QueryUserInfoRequest{Uid: userUid, Name: name, Account: account} + req := protos.QueryUserInfoRequest{Uid: userUid, UserList: user_list, Account: account} reply, err := stub.QueryUserInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to show the user") @@ -752,17 +767,18 @@ func ShowQos(name string) util.CraneCmdError { } } -func FindAccount(name string) util.CraneCmdError { - - if name != "" { - _, err := util.ParseStringParamList(name, ",") +func FindAccount(value string) util.CraneCmdError { + var account_list []string + if value != "" { + var err error + account_list, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.QueryAccountInfoRequest{Uid: userUid, Name: name} + req := protos.QueryAccountInfoRequest{Uid: userUid, AccountList: account_list} reply, err := stub.QueryAccountInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to find the account") @@ -786,17 +802,19 @@ func FindAccount(name string) util.CraneCmdError { } } -func BlockAccountOrUser(name string, entityType protos.EntityType, account string) util.CraneCmdError { +func BlockAccountOrUser(value string, entityType protos.EntityType, account string) util.CraneCmdError { - if name != "" { - _, err := util.ParseStringParamList(name, ",") + var entity_list []string + if value != "" { + var err error + entity_list, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account/user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: true, EntityType: entityType, Name: name, Account: account} + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: true, EntityType: entityType, EntityList: entity_list, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to block the entity") @@ -812,7 +830,7 @@ func BlockAccountOrUser(name string, entityType protos.EntityType, account strin } } if reply.GetOk() { - fmt.Printf("Block %s succeeded.\n", name) + fmt.Printf("Block %s succeeded.\n", value) return util.ErrorSuccess } else { fmt.Println(util.ErrMsg(reply.Reason)) @@ -820,17 +838,19 @@ func BlockAccountOrUser(name string, entityType protos.EntityType, account strin } } -func UnblockAccountOrUser(name string, entityType protos.EntityType, account string) util.CraneCmdError { +func UnblockAccountOrUser(value string, entityType protos.EntityType, account string) util.CraneCmdError { - if name != "" { - _, err := util.ParseStringParamList(name, ",") + var entity_list []string + if value != "" { + var err error + entity_list, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account/user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: false, EntityType: entityType, Name: name, Account: account} + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: false, EntityType: entityType, EntityList: entity_list, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to unblock the entity") @@ -846,7 +866,7 @@ func UnblockAccountOrUser(name string, entityType protos.EntityType, account str } } if reply.GetOk() { - fmt.Printf("Unblock %s succeeded.\n", name) + fmt.Printf("Unblock %s succeeded.\n", value) return util.ErrorSuccess } else { fmt.Println(util.ErrMsg(reply.Reason)) diff --git a/protos/Crane.proto b/protos/Crane.proto index 86dd58b5..a60b9fff 100644 --- a/protos/Crane.proto +++ b/protos/Crane.proto @@ -268,7 +268,7 @@ message AddQosReply { message DeleteAccountRequest { uint32 uid = 1; - string name = 2; + repeated string account_list = 2; } message DeleteAccountReply { @@ -278,7 +278,7 @@ message DeleteAccountReply { message DeleteUserRequest { uint32 uid = 1; - string name = 2; + repeated string user_list = 2; string account = 3; } @@ -341,7 +341,7 @@ message ModifyQosReply { message QueryAccountInfoRequest { uint32 uid = 1; - string name = 2; + repeated string account_list = 2; } message QueryAccountInfoReply { @@ -352,7 +352,7 @@ message QueryAccountInfoReply { message QueryUserInfoRequest { uint32 uid = 1; - string name = 2; + repeated string user_list = 2; string account = 3; } @@ -377,7 +377,7 @@ message BlockAccountOrUserRequest { uint32 uid = 1; bool block = 2; EntityType entity_type = 3; - string name = 4; + repeated string entity_list = 4; string account = 5; } From 520192cc43c973913e7479728dfeba4cf18da835 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:37:51 +0800 Subject: [PATCH 08/13] feat: batch delete qos, query qos --- internal/cacctmgr/cacctmgr.go | 33 ++++++++++++++++++++++++--------- protos/Crane.proto | 4 ++-- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 3fcd8e71..1f43714d 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -513,12 +513,18 @@ func DeleteUser(value string, account string) util.CraneCmdError { } } -func DeleteQos(name string) util.CraneCmdError { - req := protos.DeleteQosRequest{Uid: userUid, Name: name} +func DeleteQos(value string) util.CraneCmdError { + + qos_list, err := util.ParseStringParamList(value, ",") + if err != nil { + log.Errorf("Invalid user list specified: %v.\n", err) + return util.ErrorCmdArg + } + req := protos.DeleteQosRequest{Uid: userUid, QosList: qos_list} reply, err := stub.DeleteQos(context.Background(), &req) if err != nil { - util.GrpcErrorPrintf(err, "Failed to delete QoS %s", name) + util.GrpcErrorPrintf(err, "Failed to delete QoS %s", value) return util.ErrorNetwork } @@ -531,10 +537,10 @@ func DeleteQos(name string) util.CraneCmdError { } } if reply.GetOk() { - fmt.Printf("Delete QoS %s succeeded.\n", name) + fmt.Printf("Delete QoS %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Delete QoS %s failed: %s.\n", name, util.ErrMsg(reply.GetReason())) + fmt.Printf("Delete QoS %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) return util.ErrorBackend } } @@ -738,8 +744,17 @@ func ShowUser(value string, account string) util.CraneCmdError { } } -func ShowQos(name string) util.CraneCmdError { - req := protos.QueryQosInfoRequest{Uid: userUid, Name: name} +func ShowQos(value string) util.CraneCmdError { + var qos_list []string + if value != "" { + var err error + qos_list, err = util.ParseStringParamList(value, ",") + if err != nil { + log.Errorf("Invalid user list specified: %v.\n", err) + return util.ErrorCmdArg + } + } + req := protos.QueryQosInfoRequest{Uid: userUid, QosList: qos_list} reply, err := stub.QueryQosInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to show the QoS") @@ -758,10 +773,10 @@ func ShowQos(name string) util.CraneCmdError { PrintAllQos(reply.QosList) return util.ErrorSuccess } else { - if name == "" { + if value == "" { fmt.Printf("Can't find any QoS. %s.\n", util.ErrMsg(reply.GetReason())) } else { - fmt.Printf("Can't find QoS %s.\n", name) + fmt.Printf("Can't find QoS %s.\n", value) } return util.ErrorBackend } diff --git a/protos/Crane.proto b/protos/Crane.proto index a60b9fff..b1639c3b 100644 --- a/protos/Crane.proto +++ b/protos/Crane.proto @@ -289,7 +289,7 @@ message DeleteUserReply { message DeleteQosRequest { uint32 uid = 1; - string name = 2; + repeated string qos_list = 2; } message DeleteQosReply { @@ -364,7 +364,7 @@ message QueryUserInfoReply { message QueryQosInfoRequest { uint32 uid = 1; - string name = 2; + repeated string qos_list = 2; } message QueryQosInfoReply { From b097328b5acd7ac4608711b650a0db2114f65d22 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:14:29 +0800 Subject: [PATCH 09/13] refactor --- internal/cacctmgr/cacctmgr.go | 80 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 1f43714d..89998e69 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -450,13 +450,13 @@ func AddQos(qos *protos.QosInfo) util.CraneCmdError { func DeleteAccount(value string) util.CraneCmdError { - account_list, err := util.ParseStringParamList(value, ",") + accountList, err := util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } - req := protos.DeleteAccountRequest{Uid: userUid, AccountList: account_list} + req := protos.DeleteAccountRequest{Uid: userUid, AccountList: accountList} reply, err := stub.DeleteAccount(context.Background(), &req) if err != nil { @@ -483,12 +483,12 @@ func DeleteAccount(value string) util.CraneCmdError { func DeleteUser(value string, account string) util.CraneCmdError { - user_list, err := util.ParseStringParamList(value, ",") + userList, err := util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } - req := protos.DeleteUserRequest{Uid: userUid, UserList: user_list, Account: account} + req := protos.DeleteUserRequest{Uid: userUid, UserList: userList, Account: account} reply, err := stub.DeleteUser(context.Background(), &req) if err != nil { @@ -515,12 +515,12 @@ func DeleteUser(value string, account string) util.CraneCmdError { func DeleteQos(value string) util.CraneCmdError { - qos_list, err := util.ParseStringParamList(value, ",") + qosList, err := util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } - req := protos.DeleteQosRequest{Uid: userUid, QosList: qos_list} + req := protos.DeleteQosRequest{Uid: userUid, QosList: qosList} reply, err := stub.DeleteQos(context.Background(), &req) if err != nil { @@ -545,26 +545,26 @@ func DeleteQos(value string) util.CraneCmdError { } } -func ModifyAccount(modify_field protos.ModifyField, new_value string, name string, requestType protos.OperationType) util.CraneCmdError { +func ModifyAccount(modifyField protos.ModifyField, newValue string, name string, requestType protos.OperationType) util.CraneCmdError { req := protos.ModifyAccountRequest{ Uid: userUid, - ModifyField: modify_field, - Value: new_value, + ModifyField: modifyField, + Value: newValue, Name: name, Type: requestType, Force: FlagForce, } - if modify_field == protos.ModifyField_Qos { - _, err := util.ParseStringParamList(new_value, ",") + if modifyField == protos.ModifyField_Qos { + _, err := util.ParseStringParamList(newValue, ",") if err != nil { log.Errorf("Invalid qos list specified: %v.\n", err) return util.ErrorCmdArg } } - if modify_field == protos.ModifyField_Partition { - _, err := util.ParseStringParamList(new_value, ",") + if modifyField == protos.ModifyField_Partition { + _, err := util.ParseStringParamList(newValue, ",") if err != nil { log.Errorf("Invalid partition list specified: %v.\n", err) return util.ErrorCmdArg @@ -594,24 +594,24 @@ func ModifyAccount(modify_field protos.ModifyField, new_value string, name strin } } -func ModifyUser(modify_field protos.ModifyField, new_value string, name string, account string, partition string, requestType protos.OperationType) util.CraneCmdError { - if modify_field == protos.ModifyField_AdminLevel { - if new_value != "none" && new_value != "operator" && new_value != "admin" { +func ModifyUser(modifyField protos.ModifyField, newValue string, name string, account string, partition string, requestType protos.OperationType) util.CraneCmdError { + if modifyField == protos.ModifyField_AdminLevel { + if newValue != "none" && newValue != "operator" && newValue != "admin" { log.Errorf("Unknown admin level, valid values: none, operator, admin.") return util.ErrorCmdArg } } - if modify_field == protos.ModifyField_Qos { - _, err := util.ParseStringParamList(new_value, ",") + if modifyField == protos.ModifyField_Qos { + _, err := util.ParseStringParamList(newValue, ",") if err != nil { log.Errorf("Invalid qos list specified: %v.\n", err) return util.ErrorCmdArg } } - if modify_field == protos.ModifyField_Partition { - _, err := util.ParseStringParamList(new_value, ",") + if modifyField == protos.ModifyField_Partition { + _, err := util.ParseStringParamList(newValue, ",") if err != nil { log.Errorf("Invalid partition list specified: %v.\n", err) return util.ErrorCmdArg @@ -620,8 +620,8 @@ func ModifyUser(modify_field protos.ModifyField, new_value string, name string, req := protos.ModifyUserRequest{ Uid: userUid, - ModifyField: modify_field, - Value: new_value, + ModifyField: modifyField, + Value: newValue, Name: name, Partition: partition, Type: requestType, @@ -652,11 +652,11 @@ func ModifyUser(modify_field protos.ModifyField, new_value string, name string, } } -func ModifyQos(modify_field protos.ModifyField, new_value string, name string) util.CraneCmdError { +func ModifyQos(modifyField protos.ModifyField, newVlaue string, name string) util.CraneCmdError { req := protos.ModifyQosRequest{ Uid: userUid, - ModifyField: modify_field, - Value: new_value, + ModifyField: modifyField, + Value: newVlaue, Name: name, } @@ -710,17 +710,17 @@ func ShowAccounts() util.CraneCmdError { func ShowUser(value string, account string) util.CraneCmdError { - var user_list []string + var userList []string if value != "" { var err error - user_list, err = util.ParseStringParamList(value, ",") + userList, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.QueryUserInfoRequest{Uid: userUid, UserList: user_list, Account: account} + req := protos.QueryUserInfoRequest{Uid: userUid, UserList: userList, Account: account} reply, err := stub.QueryUserInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to show the user") @@ -745,16 +745,16 @@ func ShowUser(value string, account string) util.CraneCmdError { } func ShowQos(value string) util.CraneCmdError { - var qos_list []string + var qosList []string if value != "" { var err error - qos_list, err = util.ParseStringParamList(value, ",") + qosList, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.QueryQosInfoRequest{Uid: userUid, QosList: qos_list} + req := protos.QueryQosInfoRequest{Uid: userUid, QosList: qosList} reply, err := stub.QueryQosInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to show the QoS") @@ -783,17 +783,17 @@ func ShowQos(value string) util.CraneCmdError { } func FindAccount(value string) util.CraneCmdError { - var account_list []string + var accountList []string if value != "" { var err error - account_list, err = util.ParseStringParamList(value, ",") + accountList, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.QueryAccountInfoRequest{Uid: userUid, AccountList: account_list} + req := protos.QueryAccountInfoRequest{Uid: userUid, AccountList: accountList} reply, err := stub.QueryAccountInfo(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to find the account") @@ -819,17 +819,17 @@ func FindAccount(value string) util.CraneCmdError { func BlockAccountOrUser(value string, entityType protos.EntityType, account string) util.CraneCmdError { - var entity_list []string + var entityList []string if value != "" { var err error - entity_list, err = util.ParseStringParamList(value, ",") + entityList, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account/user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: true, EntityType: entityType, EntityList: entity_list, Account: account} + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: true, EntityType: entityType, EntityList: entityList, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to block the entity") @@ -855,17 +855,17 @@ func BlockAccountOrUser(value string, entityType protos.EntityType, account stri func UnblockAccountOrUser(value string, entityType protos.EntityType, account string) util.CraneCmdError { - var entity_list []string + var entityList []string if value != "" { var err error - entity_list, err = util.ParseStringParamList(value, ",") + entityList, err = util.ParseStringParamList(value, ",") if err != nil { log.Errorf("Invalid account/user list specified: %v.\n", err) return util.ErrorCmdArg } } - req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: false, EntityType: entityType, EntityList: entity_list, Account: account} + req := protos.BlockAccountOrUserRequest{Uid: userUid, Block: false, EntityType: entityType, EntityList: entityList, Account: account} reply, err := stub.BlockAccountOrUser(context.Background(), &req) if err != nil { util.GrpcErrorPrintf(err, "Failed to unblock the entity") From bff553b0f99c206bd2ec590140a69454a6482437 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:33:57 +0800 Subject: [PATCH 10/13] refactor --- internal/cacctmgr/cacctmgr.go | 36 ++++++++++++++++++----------------- protos/Crane.proto | 4 ++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 89998e69..b6b12cb7 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -546,10 +546,19 @@ func DeleteQos(value string) util.CraneCmdError { } func ModifyAccount(modifyField protos.ModifyField, newValue string, name string, requestType protos.OperationType) util.CraneCmdError { + var valueList []string + var err error + + valueList, err = util.ParseStringParamList(newValue, ",") + if err != nil { + log.Errorf("Invalid value list specified: %v.\n", err) + return util.ErrorCmdArg + } + req := protos.ModifyAccountRequest{ Uid: userUid, ModifyField: modifyField, - Value: newValue, + ValueList: valueList, Name: name, Type: requestType, Force: FlagForce, @@ -602,26 +611,19 @@ func ModifyUser(modifyField protos.ModifyField, newValue string, name string, ac } } - if modifyField == protos.ModifyField_Qos { - _, err := util.ParseStringParamList(newValue, ",") - if err != nil { - log.Errorf("Invalid qos list specified: %v.\n", err) - return util.ErrorCmdArg - } - } + var valueList []string + var err error - if modifyField == protos.ModifyField_Partition { - _, err := util.ParseStringParamList(newValue, ",") - if err != nil { - log.Errorf("Invalid partition list specified: %v.\n", err) - return util.ErrorCmdArg - } + valueList, err = util.ParseStringParamList(newValue, ",") + if err != nil { + log.Errorf("Invalid value list specified: %v.\n", err) + return util.ErrorCmdArg } req := protos.ModifyUserRequest{ Uid: userUid, ModifyField: modifyField, - Value: newValue, + ValueList: valueList, Name: name, Partition: partition, Type: requestType, @@ -652,11 +654,11 @@ func ModifyUser(modifyField protos.ModifyField, newValue string, name string, ac } } -func ModifyQos(modifyField protos.ModifyField, newVlaue string, name string) util.CraneCmdError { +func ModifyQos(modifyField protos.ModifyField, newValue string, name string) util.CraneCmdError { req := protos.ModifyQosRequest{ Uid: userUid, ModifyField: modifyField, - Value: newVlaue, + Value: newValue, Name: name, } diff --git a/protos/Crane.proto b/protos/Crane.proto index b1639c3b..d693ee26 100644 --- a/protos/Crane.proto +++ b/protos/Crane.proto @@ -300,7 +300,7 @@ message DeleteQosReply { message ModifyAccountRequest { uint32 uid = 1; ModifyField modify_field = 2; //modify item field - string value = 3; //new value + repeated string value_list = 3; //new value string name = 4; OperationType type = 5; bool force = 6; @@ -314,7 +314,7 @@ message ModifyAccountReply { message ModifyUserRequest { uint32 uid = 1; ModifyField modify_field = 2; //modify item field - string value = 3; //new value + repeated string value_list = 3; //new value string name = 4; string partition = 5; OperationType type = 6; From 472208d6169700e4f58fd3bea5fbfbb17b73f02a Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:30:36 +0800 Subject: [PATCH 11/13] fix --- internal/cacctmgr/cacctmgr.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index b6b12cb7..67535e12 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -555,6 +555,13 @@ func ModifyAccount(modifyField protos.ModifyField, newValue string, name string, return util.ErrorCmdArg } + if modifyField == protos.ModifyField_DefaultQos || modifyField == protos.ModifyField_Description { + if len(valueList) != 1 { + log.Errorf("Invalid value specified! Modify Description and DefaultQos, please provide only one value.") + return util.ErrorCmdArg + } + } + req := protos.ModifyAccountRequest{ Uid: userUid, ModifyField: modifyField, @@ -620,6 +627,13 @@ func ModifyUser(modifyField protos.ModifyField, newValue string, name string, ac return util.ErrorCmdArg } + if modifyField == protos.ModifyField_AdminLevel || modifyField == protos.ModifyField_DefaultQos || modifyField == protos.ModifyField_DefaultAccount { + if len(valueList) != 1 { + log.Errorf("Invalid value specified! Modify AdminLevel, DefaultAccount and DefaultQos, please provide only one value.") + return util.ErrorCmdArg + } + } + req := protos.ModifyUserRequest{ Uid: userUid, ModifyField: modifyField, From 0326ade7c4058f0f7184c09c16f811bce1dcfab5 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Fri, 24 Jan 2025 10:23:26 +0800 Subject: [PATCH 12/13] feat: Multiple errcodes returned. --- internal/cacctmgr/cacctmgr.go | 33 ++++++++++++++++++++++++++------- protos/Crane.proto | 8 +++++++- protos/PublicDefs.proto | 7 ++++++- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 67535e12..8595112b 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -476,7 +476,10 @@ func DeleteAccount(value string) util.CraneCmdError { fmt.Printf("Delete account %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Delete account %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) + fmt.Printf("Delete account failed: \n") + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -508,7 +511,10 @@ func DeleteUser(value string, account string) util.CraneCmdError { fmt.Printf("Remove user %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Remove user %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) + fmt.Printf("Remove user failed: \n") + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -540,7 +546,10 @@ func DeleteQos(value string) util.CraneCmdError { fmt.Printf("Delete QoS %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Printf("Delete QoS %s failed: %s.\n", value, util.ErrMsg(reply.GetReason())) + fmt.Printf("Delete QoS failed: \n") + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -605,7 +614,10 @@ func ModifyAccount(modifyField protos.ModifyField, newValue string, name string, fmt.Println("Modify information succeeded.") return util.ErrorSuccess } else { - fmt.Printf("Modify information failed: %s.\n", util.ErrMsg(reply.GetReason())) + fmt.Printf("Modify information failed:\n") + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -663,7 +675,10 @@ func ModifyUser(modifyField protos.ModifyField, newValue string, name string, ac fmt.Println("Modify information succeeded.") return util.ErrorSuccess } else { - fmt.Printf("Modify information failed: %s.\n", util.ErrMsg(reply.GetReason())) + fmt.Printf("Modify information failed: \n") + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -864,7 +879,9 @@ func BlockAccountOrUser(value string, entityType protos.EntityType, account stri fmt.Printf("Block %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Println(util.ErrMsg(reply.Reason)) + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } @@ -900,7 +917,9 @@ func UnblockAccountOrUser(value string, entityType protos.EntityType, account st fmt.Printf("Unblock %s succeeded.\n", value) return util.ErrorSuccess } else { - fmt.Println(util.ErrMsg(reply.Reason)) + for _, errRecode := range reply.ErrRecodeList { + fmt.Printf("%s: %s \n", errRecode.ErrValue, util.ErrMsg(errRecode.ErrCode)) + } return util.ErrorBackend } } diff --git a/protos/Crane.proto b/protos/Crane.proto index d693ee26..d156911d 100644 --- a/protos/Crane.proto +++ b/protos/Crane.proto @@ -274,6 +274,7 @@ message DeleteAccountRequest { message DeleteAccountReply { bool ok = 1; ErrCode reason = 2; + repeated ErrorRecord err_recode_list = 3; } message DeleteUserRequest { @@ -285,6 +286,7 @@ message DeleteUserRequest { message DeleteUserReply { bool ok = 1; ErrCode reason = 2; + repeated ErrorRecord err_recode_list = 3; } message DeleteQosRequest { @@ -295,6 +297,7 @@ message DeleteQosRequest { message DeleteQosReply { bool ok = 1; ErrCode reason = 2; + repeated ErrorRecord err_recode_list = 3; } message ModifyAccountRequest { @@ -309,6 +312,7 @@ message ModifyAccountRequest { message ModifyAccountReply { bool ok = 1; ErrCode reason = 2; + repeated ErrorRecord err_recode_list = 3; } message ModifyUserRequest { @@ -325,6 +329,7 @@ message ModifyUserRequest { message ModifyUserReply { bool ok = 1; ErrCode reason = 2; +repeated ErrorRecord err_recode_list = 3; } message ModifyQosRequest { @@ -384,6 +389,7 @@ message BlockAccountOrUserRequest { message BlockAccountOrUserReply { bool ok = 1; ErrCode reason = 2; + repeated ErrorRecord err_recode_list = 3; } message MigrateSshProcToCgroupRequest { @@ -831,4 +837,4 @@ service CraneForeD { rpc CrunStream(stream StreamCrunRequest) returns(stream StreamCrunReply); rpc TaskIOStream(stream StreamTaskIORequest) returns(stream StreamTaskIOReply); rpc QueryTaskIdFromPort(QueryTaskIdFromPortRequest) returns (QueryTaskIdFromPortReply); -} +} \ No newline at end of file diff --git a/protos/PublicDefs.proto b/protos/PublicDefs.proto index 9367c909..15095460 100644 --- a/protos/PublicDefs.proto +++ b/protos/PublicDefs.proto @@ -329,6 +329,11 @@ message TrimmedPartitionInfo { repeated TrimmedCranedInfo craned_lists = 3; } +message ErrorRecord { + string err_value = 1; + ErrCode err_code = 2; +} + enum ErrCode { SUCCESS = 0; // Success @@ -491,4 +496,4 @@ message CranedRemoteMeta { string craned_version = 3; google.protobuf.Timestamp craned_start_time = 4; google.protobuf.Timestamp system_boot_time = 5; -} +} \ No newline at end of file From 1cc195b11772947d8228579ce6b4e4e7555ffd14 Mon Sep 17 00:00:00 2001 From: huerni <47264950+huerni@users.noreply.github.com> Date: Mon, 10 Feb 2025 14:34:57 +0800 Subject: [PATCH 13/13] refactor: query account/user/qos --- internal/cacctmgr/cacctmgr.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/internal/cacctmgr/cacctmgr.go b/internal/cacctmgr/cacctmgr.go index 8595112b..b207bcdf 100644 --- a/internal/cacctmgr/cacctmgr.go +++ b/internal/cacctmgr/cacctmgr.go @@ -44,9 +44,9 @@ type ServerAddr struct { CraneCtldListenPort string `yaml:"CraneCtldListenPort"` } -func PrintAllUsers(userList []*protos.UserInfo) { +func PrintUserList(userList []*protos.UserInfo) { if len(userList) == 0 { - fmt.Println("There is no user in crane.") + fmt.Println("Can't find any User.") return } @@ -115,9 +115,9 @@ func PrintAllUsers(userList []*protos.UserInfo) { table.Render() } -func PrintAllQos(qosList []*protos.QosInfo) { +func PrintQosList(qosList []*protos.QosInfo) { if len(qosList) == 0 { - fmt.Println("There is no QoS in crane") + fmt.Println("Can't find any QoS.") return } @@ -166,9 +166,9 @@ func PrintAllQos(qosList []*protos.QosInfo) { table.Render() } -func PrintAllAccount(accountList []*protos.AccountInfo) { +func PrintAccountList(accountList []*protos.AccountInfo) { if len(accountList) == 0 { - fmt.Println("There is no account in crane") + fmt.Println("Can't find any Account.") return } @@ -731,7 +731,7 @@ func ShowAccounts() util.CraneCmdError { } } if reply.GetOk() { - PrintAllAccount(reply.AccountList) + PrintAccountList(reply.AccountList) return util.ErrorSuccess } else { fmt.Println(util.ErrMsg(reply.Reason)) @@ -767,7 +767,7 @@ func ShowUser(value string, account string) util.CraneCmdError { } } if reply.GetOk() { - PrintAllUsers(reply.UserList) + PrintUserList(reply.UserList) return util.ErrorSuccess } else { fmt.Println(util.ErrMsg(reply.Reason)) @@ -801,14 +801,10 @@ func ShowQos(value string) util.CraneCmdError { } } if reply.GetOk() { - PrintAllQos(reply.QosList) + PrintQosList(reply.QosList) return util.ErrorSuccess } else { - if value == "" { - fmt.Printf("Can't find any QoS. %s.\n", util.ErrMsg(reply.GetReason())) - } else { - fmt.Printf("Can't find QoS %s.\n", value) - } + fmt.Println(util.ErrMsg(reply.Reason)) return util.ErrorBackend } }