Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: equinix/metal-cli
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3c467f6364472d28ba85f1fcb6b9bc42187ea674
Choose a base ref
..
head repository: equinix/metal-cli
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: cb0fd5c1cd1acfe58c0b454622a1598e97f87704
Choose a head ref
Showing with 93 additions and 12 deletions.
  1. +93 −12 internal/gateway/retrieve.go
105 changes: 93 additions & 12 deletions internal/gateway/retrieve.go
Original file line number Diff line number Diff line change
@@ -24,12 +24,78 @@ import (
"context"
"fmt"
"strconv"
"time"

metal "github.com/equinix/equinix-sdk-go/services/metalv1"

"github.com/spf13/cobra"
)

type ipreservationIsh interface {
GetAddress() string
GetCidr() int32
}

var (
_ ipreservationIsh = (*metal.VrfIpReservation)(nil)
_ ipreservationIsh = (*metal.IPReservation)(nil)
)

type gatewayIsh interface {
GetId() string
GetCreatedAt() time.Time
GetState() metal.MetalGatewayState
GetVirtualNetwork() metal.VirtualNetwork
GetIpReservation() ipreservationIsh
GetVrfName() string
}

var (
_ gatewayIsh = (*metalGatewayWrapper)(nil)
_ gatewayIsh = (*vrfMetalGatewayWrapper)(nil)
)

type metalGatewayWrapper struct {
*metal.MetalGateway
}

func (m metalGatewayWrapper) GetIpReservation() ipreservationIsh {
if m.MetalGateway.IpReservation == nil {
return nil
}
return m.MetalGateway.IpReservation
}

func (m metalGatewayWrapper) GetVrfName() string {
return ""
}

type vrfMetalGatewayWrapper struct {
*metal.VrfMetalGateway
}

func newGatewayish(gwaysInner metal.MetalGatewayListMetalGatewaysInner) gatewayIsh {
if gwaysInner.MetalGateway != nil {
return metalGatewayWrapper{gwaysInner.MetalGateway}
}
if gwaysInner.VrfMetalGateway != nil {
return vrfMetalGatewayWrapper{gwaysInner.VrfMetalGateway}
}
return nil // Return nil if neither type is present
}

func (v vrfMetalGatewayWrapper) GetIpReservation() ipreservationIsh {
if v.VrfMetalGateway.IpReservation == nil {
return nil
}
return v.VrfMetalGateway.IpReservation
}

func (v vrfMetalGatewayWrapper) GetVrfName() string {
vrf := v.GetVrf()
return vrf.GetName()
}

func (c *Client) Retrieve() *cobra.Command {
var projectID string

@@ -45,7 +111,7 @@ func (c *Client) Retrieve() *cobra.Command {

RunE: func(cmd *cobra.Command, args []string) error {
cmd.SilenceUsage = true
includes := []string{"virtual_network", "ip_reservation"}
includes := []string{"virtual_network", "ip_reservation", "vrf"}

gwayList, _, err := c.Service.
FindMetalGatewaysByProject(context.Background(), projectID).
@@ -58,26 +124,41 @@ func (c *Client) Retrieve() *cobra.Command {

gways := gwayList.GetMetalGateways()

data := make([][]string, len(gways))
metalGways := make([]*metal.MetalGateway, len(gways))
data := make([][]string, 0, len(gways))
var gateways []gatewayIsh

for i, n := range gways {
gway := n.MetalGateway
metalGways = append(metalGways, gway)
for _, gwaysInner := range gways {
gway := newGatewayish(gwaysInner)
if gway == nil {
continue
}

address := ""
gateways = append(gateways, gway)

ipReservation := gway.IpReservation
address := ""
ipReservation := gway.GetIpReservation()
if ipReservation != nil {
address = ipReservation.GetAddress() + "/" + strconv.Itoa(int(ipReservation.GetCidr()))
}

data[i] = []string{gway.GetId(), gway.VirtualNetwork.GetMetroCode(), strconv.Itoa(int(gway.VirtualNetwork.GetVxlan())),
address, string(gway.GetState()), gway.GetCreatedAt().String()}
vnet := gway.GetVirtualNetwork()
metroCode := vnet.GetMetroCode()
vxlan := strconv.Itoa(int(vnet.GetVxlan()))

data = append(data, []string{
gway.GetId(),
metroCode,
vxlan,
address,
string(gway.GetState()),
gway.GetCreatedAt().String(),
gway.GetVrfName(),
})
}
header := []string{"ID", "Metro", "VXLAN", "Addresses", "State", "Created"}

return c.Out.Output(metalGways, header, &data)
header := []string{"ID", "Metro", "VXLAN", "Addresses", "State", "Created", "VRF"}

return c.Out.Output(gateways, header, &data)
},
}