From a98a116bf7572da20da099de6e6d1f1d73d90ccd Mon Sep 17 00:00:00 2001 From: Anish Mukherjee Date: Tue, 29 Nov 2022 19:23:39 +0530 Subject: [PATCH] add network users subcommand --- cli/cmd/network_user/create.go | 43 ++++++++++++++++++++++++++++++++++ cli/cmd/network_user/delete.go | 23 ++++++++++++++++++ cli/cmd/network_user/flags.go | 10 ++++++++ cli/cmd/network_user/get.go | 27 +++++++++++++++++++++ cli/cmd/network_user/list.go | 27 +++++++++++++++++++++ cli/cmd/network_user/root.go | 38 ++++++++++++++++++++++++++++++ cli/cmd/network_user/update.go | 43 ++++++++++++++++++++++++++++++++++ cli/cmd/root.go | 3 +++ cli/functions/metrics.go | 3 +++ cli/functions/network_user.go | 7 ++++++ cli/functions/usergroups.go | 3 +++ 11 files changed, 227 insertions(+) create mode 100644 cli/cmd/network_user/create.go create mode 100644 cli/cmd/network_user/delete.go create mode 100644 cli/cmd/network_user/flags.go create mode 100644 cli/cmd/network_user/get.go create mode 100644 cli/cmd/network_user/list.go create mode 100644 cli/cmd/network_user/root.go create mode 100644 cli/cmd/network_user/update.go diff --git a/cli/cmd/network_user/create.go b/cli/cmd/network_user/create.go new file mode 100644 index 00000000..433f0a1a --- /dev/null +++ b/cli/cmd/network_user/create.go @@ -0,0 +1,43 @@ +package network_user + +import ( + "fmt" + "strings" + + "github.com/gravitl/netmaker/cli/functions" + "github.com/gravitl/netmaker/models/promodels" + "github.com/spf13/cobra" +) + +var networkuserCreateCmd = &cobra.Command{ + Use: "create [NETWORK NAME]", + Args: cobra.ExactArgs(1), + Short: "Create a network user", + Long: `Create a network user`, + Run: func(cmd *cobra.Command, args []string) { + user := &promodels.NetworkUser{ + AccessLevel: accessLevel, + ClientLimit: clientLimit, + NodeLimit: nodeLimit, ID: promodels.NetworkUserID(id), + } + if clients != "" { + user.Clients = strings.Split(clients, ",") + } + if nodes != "" { + user.Nodes = strings.Split(nodes, ",") + } + functions.CreateNetworkUser(args[0], user) + fmt.Println("Success") + }, +} + +func init() { + networkuserCreateCmd.Flags().IntVar(&accessLevel, "access_level", 0, "Custom access level") + networkuserCreateCmd.Flags().IntVar(&clientLimit, "client_limit", 0, "Maximum number of external clients that can be created") + networkuserCreateCmd.Flags().IntVar(&nodeLimit, "node_limit", 999999999, "Maximum number of nodes that can be attached to a network") + networkuserCreateCmd.Flags().StringVar(&clients, "clients", "", "Access to list of external clients (comma separated)") + networkuserCreateCmd.Flags().StringVar(&nodes, "nodes", "", "Access to list of nodes (comma separated)") + networkuserCreateCmd.Flags().StringVar(&id, "id", "", "ID of the network user") + networkuserCreateCmd.MarkFlagRequired("id") + rootCmd.AddCommand(networkuserCreateCmd) +} diff --git a/cli/cmd/network_user/delete.go b/cli/cmd/network_user/delete.go new file mode 100644 index 00000000..31a3c7e5 --- /dev/null +++ b/cli/cmd/network_user/delete.go @@ -0,0 +1,23 @@ +package network_user + +import ( + "fmt" + + "github.com/gravitl/netmaker/cli/functions" + "github.com/spf13/cobra" +) + +var networkuserDeleteCmd = &cobra.Command{ + Use: "delete [NETWORK NAME] [NETWORK USER NAME]", + Args: cobra.ExactArgs(2), + Short: "Delete a network user", + Long: `Delete a network user`, + Run: func(cmd *cobra.Command, args []string) { + functions.DeleteNetworkUser(args[0], args[1]) + fmt.Println("Success") + }, +} + +func init() { + rootCmd.AddCommand(networkuserDeleteCmd) +} diff --git a/cli/cmd/network_user/flags.go b/cli/cmd/network_user/flags.go new file mode 100644 index 00000000..b328ca2c --- /dev/null +++ b/cli/cmd/network_user/flags.go @@ -0,0 +1,10 @@ +package network_user + +var ( + accessLevel int + clientLimit int + nodeLimit int + clients string + nodes string + id string +) diff --git a/cli/cmd/network_user/get.go b/cli/cmd/network_user/get.go new file mode 100644 index 00000000..46e3025c --- /dev/null +++ b/cli/cmd/network_user/get.go @@ -0,0 +1,27 @@ +package network_user + +import ( + "github.com/gravitl/netmaker/cli/functions" + "github.com/spf13/cobra" +) + +var data bool + +var networkuserGetCmd = &cobra.Command{ + Use: "get [NETWORK NAME] [NETWORK USER NAME]", + Args: cobra.ExactArgs(2), + Short: "Fetch a network user", + Long: `Fetch a network user`, + Run: func(cmd *cobra.Command, args []string) { + if data { + functions.PrettyPrint(functions.GetNetworkUserData(args[1])) + } else { + functions.PrettyPrint(functions.GetNetworkUser(args[0], args[1])) + } + }, +} + +func init() { + networkuserGetCmd.Flags().BoolVar(&data, "data", false, "Fetch entire data of a network user") + rootCmd.AddCommand(networkuserGetCmd) +} diff --git a/cli/cmd/network_user/list.go b/cli/cmd/network_user/list.go new file mode 100644 index 00000000..c539cf2a --- /dev/null +++ b/cli/cmd/network_user/list.go @@ -0,0 +1,27 @@ +package network_user + +import ( + "github.com/gravitl/netmaker/cli/functions" + "github.com/spf13/cobra" +) + +var networkName string + +var networkuserListCmd = &cobra.Command{ + Use: "list", + Args: cobra.NoArgs, + Short: "List network users", + Long: `List network users`, + Run: func(cmd *cobra.Command, args []string) { + if networkName != "" { + functions.PrettyPrint(functions.GetNetworkUsers(networkName)) + } else { + functions.PrettyPrint(functions.GetAllNetworkUsers()) + } + }, +} + +func init() { + networkuserListCmd.Flags().StringVar(&networkName, "network", "", "Name of the network") + rootCmd.AddCommand(networkuserListCmd) +} diff --git a/cli/cmd/network_user/root.go b/cli/cmd/network_user/root.go new file mode 100644 index 00000000..12ae264a --- /dev/null +++ b/cli/cmd/network_user/root.go @@ -0,0 +1,38 @@ +package network_user + +import ( + "os" + + "github.com/spf13/cobra" +) + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "network_user", + Short: "Manage Network Users", + Long: `Manage Network Users`, + // Run: func(cmd *cobra.Command, args []string) { }, +} + +// GetRoot returns the root subcommand +func GetRoot() *cobra.Command { + return rootCmd +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + +func init() { + // Here you will define your flags and configuration settings. + // Cobra supports persistent flags, which, if defined here, + // will be global for your application. + // Cobra also supports local flags, which will only run + // when this action is called directly. + rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cli/cmd/network_user/update.go b/cli/cmd/network_user/update.go new file mode 100644 index 00000000..c7ece7fc --- /dev/null +++ b/cli/cmd/network_user/update.go @@ -0,0 +1,43 @@ +package network_user + +import ( + "fmt" + "strings" + + "github.com/gravitl/netmaker/cli/functions" + "github.com/gravitl/netmaker/models/promodels" + "github.com/spf13/cobra" +) + +var networkuserUpdateCmd = &cobra.Command{ + Use: "update [NETWORK NAME]", + Args: cobra.ExactArgs(1), + Short: "Update a network user", + Long: `Update a network user`, + Run: func(cmd *cobra.Command, args []string) { + user := &promodels.NetworkUser{ + AccessLevel: accessLevel, + ClientLimit: clientLimit, + NodeLimit: nodeLimit, ID: promodels.NetworkUserID(id), + } + if clients != "" { + user.Clients = strings.Split(clients, ",") + } + if nodes != "" { + user.Nodes = strings.Split(nodes, ",") + } + functions.UpdateNetworkUser(args[0], user) + fmt.Println("Success") + }, +} + +func init() { + networkuserUpdateCmd.Flags().IntVar(&accessLevel, "access_level", 0, "Custom access level") + networkuserUpdateCmd.Flags().IntVar(&clientLimit, "client_limit", 0, "Maximum number of external clients that can be created") + networkuserUpdateCmd.Flags().IntVar(&nodeLimit, "node_limit", 999999999, "Maximum number of nodes that can be attached to a network") + networkuserUpdateCmd.Flags().StringVar(&clients, "clients", "", "Access to list of external clients (comma separated)") + networkuserUpdateCmd.Flags().StringVar(&nodes, "nodes", "", "Access to list of nodes (comma separated)") + networkuserUpdateCmd.Flags().StringVar(&id, "id", "", "ID of the network user") + networkuserUpdateCmd.MarkFlagRequired("id") + rootCmd.AddCommand(networkuserUpdateCmd) +} diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 8492f8c8..e9669356 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -10,6 +10,7 @@ import ( "github.com/gravitl/netmaker/cli/cmd/keys" "github.com/gravitl/netmaker/cli/cmd/metrics" "github.com/gravitl/netmaker/cli/cmd/network" + "github.com/gravitl/netmaker/cli/cmd/network_user" "github.com/gravitl/netmaker/cli/cmd/node" "github.com/gravitl/netmaker/cli/cmd/server" "github.com/gravitl/netmaker/cli/cmd/user" @@ -27,6 +28,7 @@ var rootCmd = &cobra.Command{ // Run: func(cmd *cobra.Command, args []string) { }, } +// GetRoot returns the root of all subcommands func GetRoot() *cobra.Command { return rootCmd } @@ -63,4 +65,5 @@ func init() { rootCmd.AddCommand(user.GetRoot()) rootCmd.AddCommand(usergroup.GetRoot()) rootCmd.AddCommand(metrics.GetRoot()) + rootCmd.AddCommand(network_user.GetRoot()) } diff --git a/cli/functions/metrics.go b/cli/functions/metrics.go index b4a42f1d..aea0ed25 100644 --- a/cli/functions/metrics.go +++ b/cli/functions/metrics.go @@ -12,14 +12,17 @@ func GetNodeMetrics(networkName, nodeID string) *models.Metrics { return request[models.Metrics](http.MethodGet, fmt.Sprintf("/api/metrics/%s/%s", networkName, nodeID), nil) } +// GetNetworkNodeMetrics - fetch an entire network's metrics func GetNetworkNodeMetrics(networkName string) *models.NetworkMetrics { return request[models.NetworkMetrics](http.MethodGet, "/api/metrics/"+networkName, nil) } +// GetAllMetrics - fetch all metrics func GetAllMetrics() *models.NetworkMetrics { return request[models.NetworkMetrics](http.MethodGet, "/api/metrics", nil) } +// GetNetworkExtMetrics - fetch external client metrics belonging to a network func GetNetworkExtMetrics(networkName string) *map[string]models.Metric { return request[map[string]models.Metric](http.MethodGet, "/api/metrics-ext/"+networkName, nil) } diff --git a/cli/functions/network_user.go b/cli/functions/network_user.go index b8bd2dae..f412fdee 100644 --- a/cli/functions/network_user.go +++ b/cli/functions/network_user.go @@ -8,30 +8,37 @@ import ( "github.com/gravitl/netmaker/models/promodels" ) +// GetAllNetworkUsers - fetch all network users func GetAllNetworkUsers() *map[string][]promodels.NetworkUser { return request[map[string][]promodels.NetworkUser](http.MethodGet, "/api/networkusers", nil) } +// GetNetworkUsers - fetch network users belonging to a particular network func GetNetworkUsers(networkName string) *promodels.NetworkUserMap { return request[promodels.NetworkUserMap](http.MethodGet, "/api/networkusers/"+networkName, nil) } +// GetNetworkUser - fetch a single network user func GetNetworkUser(networkName, networkUserName string) *promodels.NetworkUser { return request[promodels.NetworkUser](http.MethodGet, fmt.Sprintf("/api/networkusers/%s/%s", networkName, networkUserName), nil) } +// CreateNetworkUser - create a network user func CreateNetworkUser(networkName string, payload *promodels.NetworkUser) { request[any](http.MethodPost, "/api/networkusers/"+networkName, payload) } +// UpdateNetworkUser - update a network user func UpdateNetworkUser(networkName string, payload *promodels.NetworkUser) { request[any](http.MethodPut, "/api/networkusers/"+networkName, payload) } +// GetNetworkUserData - fetch a network user's complete data func GetNetworkUserData(networkUserName string) *ee_controllers.NetworkUserDataMap { return request[ee_controllers.NetworkUserDataMap](http.MethodGet, fmt.Sprintf("/api/networkusers/data/%s/me", networkUserName), nil) } +// DeleteNetworkUser - delete a network user func DeleteNetworkUser(networkName, networkUserName string) { request[any](http.MethodDelete, fmt.Sprintf("/api/networkusers/%s/%s", networkName, networkUserName), nil) } diff --git a/cli/functions/usergroups.go b/cli/functions/usergroups.go index 5095a0b7..98b90d69 100644 --- a/cli/functions/usergroups.go +++ b/cli/functions/usergroups.go @@ -6,14 +6,17 @@ import ( "github.com/gravitl/netmaker/models/promodels" ) +// GetUsergroups - fetch all usergroups func GetUsergroups() *promodels.UserGroups { return request[promodels.UserGroups](http.MethodGet, "/api/usergroups", nil) } +// CreateUsergroup - create a usergroup func CreateUsergroup(usergroupName string) { request[any](http.MethodPost, "/api/usergroups/"+usergroupName, nil) } +// DeleteUsergroup - delete a usergroup func DeleteUsergroup(usergroupName string) { request[any](http.MethodDelete, "/api/usergroups/"+usergroupName, nil) }