NET-1962: add gateway subcommand. (#3339)

* feat(go): add deprecation warning.

* feat(go): add support for gateway commands.

* feat(go): mention the server version in which the commands were deprecated.
This commit is contained in:
Vishal Dalwadi
2025-02-23 21:50:10 -08:00
committed by GitHub
parent 48535f7ef1
commit 9a7c13b8a6
9 changed files with 142 additions and 18 deletions

55
cli/cmd/gateway/create.go Normal file
View File

@@ -0,0 +1,55 @@
package gateway
import (
"github.com/gravitl/netmaker/cli/functions"
"github.com/gravitl/netmaker/models"
"github.com/spf13/cobra"
"strings"
)
var externalClientDNS string
var isInternetGateway bool
var metadata string
var persistentKeepAlive uint
var mtu uint
var gatewayCreateCmd = &cobra.Command{
Use: "create [NETWORK NAME] [NODE ID] [RELAYED NODES ID (comma separated)]",
Args: cobra.ExactArgs(3),
Short: "Create a new Gateway on a Netmaker network.",
Long: `
Configures a node as a gateway in a specified network, allowing it to relay traffic for other nodes. The gateway can also function as an internet gateway if specified.
Arguments:
NETWORK NAME: The name of the network where the gateway will be created.
NODE ID: The ID of the node to be configured as a gateway.
RELAYED NODES ID: A comma-separated list of node IDs that will be relayed through this gateway.
`,
Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(
functions.CreateGateway(
models.IngressRequest{
ExtclientDNS: externalClientDNS,
IsInternetGateway: isInternetGateway,
Metadata: metadata,
PersistentKeepalive: int32(persistentKeepAlive),
MTU: int32(mtu),
},
models.RelayRequest{
NodeID: args[0],
NetID: args[1],
RelayedNodes: strings.Split(args[2], ","),
},
),
)
},
}
func init() {
gatewayCreateCmd.Flags().StringVarP(&externalClientDNS, "dns", "d", "", "the IP address of the DNS server to be used by external clients")
gatewayCreateCmd.Flags().BoolVarP(&isInternetGateway, "internet", "i", false, "if set, the gateway will route traffic to the internet")
gatewayCreateCmd.Flags().StringVarP(&metadata, "note", "n", "", "description or metadata to be associated with the gateway")
gatewayCreateCmd.Flags().UintVarP(&persistentKeepAlive, "keep-alive", "k", 20, "the keep-alive interval (in seconds) for maintaining persistent connections")
gatewayCreateCmd.Flags().UintVarP(&mtu, "mtu", "m", 1420, "the maximum transmission unit (MTU) size in bytes")
rootCmd.AddCommand(gatewayCreateCmd)
}

27
cli/cmd/gateway/delete.go Normal file
View File

@@ -0,0 +1,27 @@
package gateway
import (
"github.com/gravitl/netmaker/cli/functions"
"github.com/spf13/cobra"
)
var gatewayDeleteCmd = &cobra.Command{
Use: "delete [NETWORK NAME] [NODE ID]",
Args: cobra.ExactArgs(2),
Short: "Delete a Gateway.",
Long: `
Removes the gateway configuration from a node in a specified network. The node itself remains, but it will no longer function as a gateway.
Arguments:
NETWORK NAME: The name of the network from which the gateway configuration should be removed.
NODE ID: The ID of the node that is currently acting as a gateway.
`,
Aliases: []string{"rm"},
Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(functions.DeleteGateway(args[0], args[1]))
},
}
func init() {
rootCmd.AddCommand(gatewayDeleteCmd)
}

18
cli/cmd/gateway/root.go Normal file
View File

@@ -0,0 +1,18 @@
package gateway
import (
"github.com/spf13/cobra"
)
// rootCmd represents the base command when called without any subcommands.
var rootCmd = &cobra.Command{
Use: "gateway",
Short: "Manage Gateways.",
Long: `Manage Gateways.`,
Aliases: []string{"gw"},
}
// GetRoot returns the root subcommand.
func GetRoot() *cobra.Command {
return rootCmd
}

View File

@@ -6,11 +6,12 @@ import (
) )
var nodeCreateIngressCmd = &cobra.Command{ var nodeCreateIngressCmd = &cobra.Command{
Use: "create_remote_access_gateway [NETWORK NAME] [NODE ID]", Use: "create_remote_access_gateway [NETWORK NAME] [NODE ID]",
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
Short: "Turn a Node into a Remote Access Gateway (Ingress)", Short: "Turn a Node into a Remote Access Gateway (Ingress)",
Long: `Turn a Node into a Remote Access Gateway (Ingress) for a Network.`, Long: `Turn a Node into a Remote Access Gateway (Ingress) for a Network.`,
Aliases: []string{"create_rag"}, Deprecated: "in favour of the `gateway` subcommand, in Netmaker v0.90.0.",
Aliases: []string{"create_rag"},
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(functions.CreateIngress(args[0], args[1], failover)) functions.PrettyPrint(functions.CreateIngress(args[0], args[1], failover))
}, },

View File

@@ -8,10 +8,11 @@ import (
) )
var hostCreateRelayCmd = &cobra.Command{ var hostCreateRelayCmd = &cobra.Command{
Use: "create_relay [NETWORK][NODE ID] [RELAYED NODE IDS (comma separated)]", Use: "create_relay [NETWORK][NODE ID] [RELAYED NODE IDS (comma separated)]",
Args: cobra.ExactArgs(3), Args: cobra.ExactArgs(3),
Short: "Turn a Node into a Relay", Short: "Turn a Node into a Relay",
Long: `Turn a Node into a Relay`, Long: `Turn a Node into a Relay`,
Deprecated: "in favour of the `gateway` subcommand, in Netmaker v0.90.0.",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(functions.CreateRelay(args[0], args[1], strings.Split(args[2], ","))) functions.PrettyPrint(functions.CreateRelay(args[0], args[1], strings.Split(args[2], ",")))
}, },

View File

@@ -6,11 +6,12 @@ import (
) )
var nodeDeleteIngressCmd = &cobra.Command{ var nodeDeleteIngressCmd = &cobra.Command{
Use: "delete_remote_access_gateway [NETWORK NAME] [NODE ID]", Use: "delete_remote_access_gateway [NETWORK NAME] [NODE ID]",
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
Short: "Delete Remote Access Gateway role from a Node", Short: "Delete Remote Access Gateway role from a Node",
Long: `Delete Remote Access Gateway role from a Node`, Long: `Delete Remote Access Gateway role from a Node`,
Aliases: []string{"delete_rag"}, Deprecated: "in favour of the `gateway` subcommand, in Netmaker v0.90.0.",
Aliases: []string{"delete_rag"},
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(functions.DeleteIngress(args[0], args[1])) functions.PrettyPrint(functions.DeleteIngress(args[0], args[1]))
}, },

View File

@@ -6,10 +6,11 @@ import (
) )
var hostDeleteRelayCmd = &cobra.Command{ var hostDeleteRelayCmd = &cobra.Command{
Use: "delete_relay [NETWORK] [NODE ID]", Use: "delete_relay [NETWORK] [NODE ID]",
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
Short: "Delete Relay from a node", Short: "Delete Relay from a node",
Long: `Delete Relay from a node`, Long: `Delete Relay from a node`,
Deprecated: "in favour of the `gateway` subcommand, in Netmaker v0.90.0.",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
functions.PrettyPrint(functions.DeleteRelay(args[0], args[1])) functions.PrettyPrint(functions.DeleteRelay(args[0], args[1]))
}, },

View File

@@ -1,6 +1,7 @@
package cmd package cmd
import ( import (
"github.com/gravitl/netmaker/cli/cmd/gateway"
"os" "os"
"github.com/gravitl/netmaker/cli/cmd/acl" "github.com/gravitl/netmaker/cli/cmd/acl"
@@ -55,4 +56,5 @@ func init() {
rootCmd.AddCommand(host.GetRoot()) rootCmd.AddCommand(host.GetRoot())
rootCmd.AddCommand(enrollment_key.GetRoot()) rootCmd.AddCommand(enrollment_key.GetRoot())
rootCmd.AddCommand(failover.GetRoot()) rootCmd.AddCommand(failover.GetRoot())
rootCmd.AddCommand(gateway.GetRoot())
} }

18
cli/functions/gateway.go Normal file
View File

@@ -0,0 +1,18 @@
package functions
import (
"fmt"
"github.com/gravitl/netmaker/models"
"net/http"
)
func CreateGateway(ingressRequest models.IngressRequest, relayRequest models.RelayRequest) *models.ApiNode {
return request[models.ApiNode](http.MethodPost, fmt.Sprintf("/api/nodes/%s/%s/gateway", relayRequest.NetID, relayRequest.NodeID), &models.CreateGwReq{
IngressRequest: ingressRequest,
RelayRequest: relayRequest,
})
}
func DeleteGateway(networkID, nodeID string) *models.ApiNode {
return request[models.ApiNode](http.MethodDelete, fmt.Sprintf("/api/nodes/%s/%s/gateway", networkID, nodeID), nil)
}