Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ generate: deps
mockgen --destination ./internal/mocks/locations_service.go --package=mocks --source ./vendor/github.com/serverscom/serverscom-go-client/pkg/locations.go
mockgen --destination ./internal/mocks/kubernetes_clusters_service.go --package=mocks --source ./vendor/github.com/serverscom/serverscom-go-client/pkg/kubernetes_clusters.go
mockgen --destination ./internal/mocks/l2_segment_service.go --package=mocks --source ./vendor/github.com/serverscom/serverscom-go-client/pkg/l2_segments.go
mockgen --destination ./internal/mocks/network_pool_service.go --package=mocks --source ./vendor/github.com/serverscom/serverscom-go-client/pkg/network_pools.go
sed -i '' 's|github.com/serverscom/srvctl/vendor/github.com/serverscom/serverscom-go-client/pkg|github.com/serverscom/serverscom-go-client/pkg|g' \
./internal/mocks/ssh_service.go \
./internal/mocks/hosts_service.go \
Expand All @@ -29,4 +30,5 @@ generate: deps
./internal/mocks/collection.go \
./internal/mocks/locations_service.go \
./internal/mocks/kubernetes_clusters_service.go \
./internal/mocks/l2_segment_service.go
./internal/mocks/l2_segment_service.go \
./internal/mocks/network_pool_service.go
29 changes: 29 additions & 0 deletions cmd/base/list_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -416,3 +416,32 @@ func (o *L2SegmentGroupTypeOption[T]) ApplyToCollection(collection serverscom.Co
collection.SetParam("group_type", o.group)
}
}

// network pool type option
type NetworkPoolTypeOption[T any] struct {
poolType string
}

func (o *NetworkPoolTypeOption[T]) AddFlags(cmd *cobra.Command) {
cmd.Flags().StringVar(&o.poolType, "type", "", "Filter network pools by type (public, private)")
}

func (o *NetworkPoolTypeOption[T]) ApplyToCollection(collection serverscom.Collection[T]) {
if o.poolType != "" {
collection.SetParam("type", o.poolType)
}
}

type AttachedSubnetworksOption[T any] struct {
attached bool
}

func (o *AttachedSubnetworksOption[T]) AddFlags(cmd *cobra.Command) {
cmd.Flags().BoolVar(&o.attached, "attached", false, "Filter only subnetworks that are attached to a dedicated server")
}

func (o *AttachedSubnetworksOption[T]) ApplyToCollection(collection serverscom.Collection[T]) {
if o.attached {
collection.SetParam("attached", "true")
}
}
59 changes: 59 additions & 0 deletions cmd/entities/network-pools/add.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package networkpools

import (
serverscom "github.com/serverscom/serverscom-go-client/pkg"
"github.com/serverscom/srvctl/cmd/base"
"github.com/spf13/cobra"
)

func newCreateSubnetCmd(cmdContext *base.CmdContext) *cobra.Command {
var title string
var cidr string
var mask int

cmd := &cobra.Command{
Use: "add-subnet <network_pool_id>",
Short: "Create a subnetwork",
Long: "Create a subnetwork for a network pool",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
manager := cmdContext.GetManager()

ctx, cancel := base.SetupContext(cmd, manager)
defer cancel()

base.SetupProxy(cmd, manager)

input := serverscom.SubnetworkCreateInput{}
if cmd.Flags().Changed("title") {
input.Title = &title
}
if cmd.Flags().Changed("cidr") {
input.CIDR = &cidr
}
if cmd.Flags().Changed("mask") {
input.Mask = &mask
}

scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()

networkPoolID := args[0]
sshKey, err := scClient.NetworkPools.CreateSubnetwork(ctx, networkPoolID, input)
if err != nil {
return err
}

if sshKey != nil {
formatter := cmdContext.GetOrCreateFormatter(cmd)
return formatter.Format(sshKey)
}
return nil
},
}

cmd.Flags().StringVar(&title, "title", "", "Subnetwork name")
cmd.Flags().StringVar(&cidr, "cidr", "", "If this parameter is filled in, a subnetwork will be created according to the specified Classless Inter-Domain Routing pattern: x.x.x.x/x")
cmd.Flags().IntVar(&mask, "mask", 0, "Alternative parameter to CIDR. If it's specified, a subnetwork will be allocated from a pool by the mask")

return cmd
}
35 changes: 35 additions & 0 deletions cmd/entities/network-pools/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package networkpools

import (
"github.com/serverscom/srvctl/cmd/base"
"github.com/spf13/cobra"
)

func newDeleteSubnetCmd(cmdContext *base.CmdContext) *cobra.Command {
var subnetID string

cmd := &cobra.Command{
Use: "delete <network_pool_id>",
Short: "Delete a subnetwork for a network pool",
Long: "Delete a subnetwork for a network pool by id",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
manager := cmdContext.GetManager()

ctx, cancel := base.SetupContext(cmd, manager)
defer cancel()

base.SetupProxy(cmd, manager)

scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()

networkPoolID := args[0]
return scClient.NetworkPools.DeleteSubnetwork(ctx, networkPoolID, subnetID)
},
}

cmd.Flags().StringVar(&subnetID, "network-id", "", "Subnetwork id (string, required)")
_ = cmd.MarkFlagRequired("network-id")

return cmd
}
77 changes: 77 additions & 0 deletions cmd/entities/network-pools/get.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package networkpools

import (
"github.com/serverscom/srvctl/cmd/base"
"github.com/spf13/cobra"
)

func newGetCmd(cmdContext *base.CmdContext) *cobra.Command {
cmd := &cobra.Command{
Use: "get <id>",
Short: "Get a network pool",
Long: "Get a network pool by id",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
manager := cmdContext.GetManager()

ctx, cancel := base.SetupContext(cmd, manager)
defer cancel()

base.SetupProxy(cmd, manager)

scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()

networkPoolID := args[0]
model, err := scClient.NetworkPools.Get(ctx, networkPoolID)
if err != nil {
return err
}

if model != nil {
formatter := cmdContext.GetOrCreateFormatter(cmd)
return formatter.Format(model)
}
return nil
},
}

return cmd
}

func newGetSubnetCmd(cmdContext *base.CmdContext) *cobra.Command {
var subnetID string

cmd := &cobra.Command{
Use: "get-subnet <id>",
Short: "Get a subnetwork",
Long: "Get a subnetwork for a network pool",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
manager := cmdContext.GetManager()

ctx, cancel := base.SetupContext(cmd, manager)
defer cancel()

base.SetupProxy(cmd, manager)

scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()

networkPoolID := args[0]
model, err := scClient.NetworkPools.GetSubnetwork(ctx, networkPoolID, subnetID)
if err != nil {
return err
}

if model != nil {
formatter := cmdContext.GetOrCreateFormatter(cmd)
return formatter.Format(model)
}
return nil
},
}

cmd.Flags().StringVar(&subnetID, "network-id", "", "Subnetwork id (string, required)")
_ = cmd.MarkFlagRequired("network-id")

return cmd
}
39 changes: 39 additions & 0 deletions cmd/entities/network-pools/list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package networkpools

import (
serverscom "github.com/serverscom/serverscom-go-client/pkg"
"github.com/serverscom/srvctl/cmd/base"
"github.com/spf13/cobra"
)

func newListCmd(cmdContext *base.CmdContext) *cobra.Command {
factory := func(verbose bool, args ...string) serverscom.Collection[serverscom.NetworkPool] {
scClient := cmdContext.GetClient().SetVerbose(verbose).GetScClient()
return scClient.NetworkPools.Collection()
}

opts := base.NewListOptions(
&base.BaseListOptions[serverscom.NetworkPool]{},
&base.SearchPatternOption[serverscom.NetworkPool]{},
&base.LabelSelectorOption[serverscom.NetworkPool]{},
&base.LocationIDOption[serverscom.NetworkPool]{},
&base.NetworkPoolTypeOption[serverscom.NetworkPool]{},
)

return base.NewListCmd("list", "network pools", factory, cmdContext, opts...)
}

func newListSubnetsCmd(cmdContext *base.CmdContext) *cobra.Command {
factory := func(verbose bool, args ...string) serverscom.Collection[serverscom.Subnetwork] {
scClient := cmdContext.GetClient().SetVerbose(verbose).GetScClient()
return scClient.NetworkPools.Subnetworks(args[0])
}

opts := base.NewListOptions(
&base.BaseListOptions[serverscom.Subnetwork]{},
&base.SearchPatternOption[serverscom.Subnetwork]{},
&base.AttachedSubnetworksOption[serverscom.Subnetwork]{},
)

return base.NewListCmd("list-subnets", "subnets for a network pool", factory, cmdContext, opts...)
}
44 changes: 44 additions & 0 deletions cmd/entities/network-pools/network_pools.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package networkpools

import (
"log"

serverscom "github.com/serverscom/serverscom-go-client/pkg"
"github.com/serverscom/srvctl/cmd/base"
"github.com/serverscom/srvctl/internal/output/entities"
"github.com/spf13/cobra"
)

func NewCmd(cmdContext *base.CmdContext) *cobra.Command {
networkPoolEntity, err := entities.Registry.GetEntityFromValue(serverscom.NetworkPool{})
if err != nil {
log.Fatal(err)
}
entitiesMap := make(map[string]entities.EntityInterface)
entitiesMap["network-pools"] = networkPoolEntity
cmd := &cobra.Command{
Use: "network-pools",
Short: "Manage network pools",
PersistentPreRunE: base.CombinePreRunE(
base.CheckFormatterFlags(cmdContext, entitiesMap),
base.CheckEmptyContexts(cmdContext),
),
Args: base.NoArgs,
Run: base.UsageRun,
}

cmd.AddCommand(
newListCmd(cmdContext),
newListSubnetsCmd(cmdContext),
newGetCmd(cmdContext),
newGetSubnetCmd(cmdContext),
newCreateSubnetCmd(cmdContext),
newUpdateCmd(cmdContext),
newUpdateSubnetCmd(cmdContext),
newDeleteSubnetCmd(cmdContext),
)

base.AddFormatFlags(cmd)

return cmd
}
Loading
Loading