diff --git a/cmd/common/common.go b/cmd/common/common.go index b2bdbdd..1f2dcaf 100644 --- a/cmd/common/common.go +++ b/cmd/common/common.go @@ -21,5 +21,7 @@ const TLSFiles = "tlsfiles" // PrintResponse prints only response string into stdout without any // additional information func PrintResponse(response string) { - fmt.Fprintln(os.Stdout, response) + if _, err := fmt.Fprintln(os.Stdout, response); err != nil { + fmt.Fprintf(os.Stderr, "Failed to write to stdout: %v\n", err) + } } diff --git a/cmd/network/evpn-utils.go b/cmd/network/evpn-utils.go index c7c30aa..3a07975 100644 --- a/cmd/network/evpn-utils.go +++ b/cmd/network/evpn-utils.go @@ -10,6 +10,7 @@ import ( "fmt" "log" "net" + "strings" "github.com/PraserX/ipconv" pb "github.com/opiproject/opi-api/network/evpn-gw/v1alpha1/gen/go" @@ -36,9 +37,17 @@ func ComposeGwIps(comp []*pc.IPPrefix) string { return status } +// ExtractShortName takes a full name and returns the short name. +func ExtractShortName(fullName string) string { + parts := strings.Split(fullName, "/") + return parts[len(parts)-1] // Return the last part of the split name. +} + // PrintLB prints the logical bridge fields in human readable format func PrintLB(lb *pb.LogicalBridge) { - log.Println("name:", lb.GetName()) + shortName := ExtractShortName(lb.GetName()) + log.Println("name:", shortName) + log.Println("status:", lb.GetStatus().GetOperStatus().String()) log.Println("vlan:", lb.GetSpec().GetVlanId()) if lb.GetSpec().GetVni() != 0 { @@ -55,25 +64,45 @@ func PrintLB(lb *pb.LogicalBridge) { // PrintBP prints the bridge Port fields in human readable format func PrintBP(bp *pb.BridgePort) { - log.Println("name:", bp.GetName()) + shortName := ExtractShortName(bp.GetName()) + log.Println("name:", shortName) + log.Println("status:", bp.GetStatus().GetOperStatus().String()) log.Println("ptype:", bp.GetSpec().GetPtype()) log.Println("MacAddress:", net.HardwareAddr(bp.GetSpec().GetMacAddress()).String()) - log.Println("bridges:", bp.GetSpec().GetLogicalBridges()) + + // Extract short names for the logical bridges + bridges := bp.GetSpec().GetLogicalBridges() + shortBridgeNames := make([]string, len(bridges)) + for i, bridge := range bridges { + shortBridgeNames[i] = ExtractShortName(bridge) + } + log.Println("bridges:", shortBridgeNames) + log.Println("Component Status:") log.Println(ComposeComponentsInfo(bp.GetStatus().GetComponents())) } // PrintSvi prints the svi fields in human readable format func PrintSvi(svi *pb.Svi) { - log.Println("name:", svi.GetName()) + shortName := ExtractShortName(svi.GetName()) + log.Println("name:", shortName) + log.Println("status:", svi.GetStatus().GetOperStatus().String()) - log.Println("Vrf:", svi.GetSpec().GetVrf()) - log.Println("LogicalBridge:", svi.GetSpec().GetLogicalBridge()) + + shortName = ExtractShortName(svi.GetSpec().GetVrf()) + log.Println("Vrf:", shortName) + + shortName = ExtractShortName(svi.GetSpec().GetLogicalBridge()) + log.Println("LogicalBridge:", shortName) log.Println("MacAddress:", net.HardwareAddr(svi.GetSpec().GetMacAddress()).String()) - log.Println("EnableBgp:", svi.GetSpec().GetEnableBgp()) log.Println("GwIPs:", ComposeGwIps(svi.GetSpec().GetGwIpPrefix())) - log.Println("remoteAS:", svi.GetSpec().GetRemoteAs()) + if svi.GetSpec().GetRemoteAs() != 0 { + log.Println("remoteAS:", svi.GetSpec().GetRemoteAs()) + } + if svi.GetSpec().GetEnableBgp() { + log.Println("EnableBgp:", svi.GetSpec().GetEnableBgp()) + } log.Println("Component Status:") log.Println(ComposeComponentsInfo(svi.GetStatus().GetComponents())) } @@ -81,7 +110,10 @@ func PrintSvi(svi *pb.Svi) { // PrintVrf prints the vrf fields in human readable format func PrintVrf(vrf *pb.Vrf) { Loopback := fmt.Sprintf("%+v/%+v", ipconv.IntToIPv4(vrf.GetSpec().GetLoopbackIpPrefix().GetAddr().GetV4Addr()), vrf.GetSpec().GetLoopbackIpPrefix().GetLen()) - log.Println("name:", vrf.GetName()) + + shortName := ExtractShortName(vrf.GetName()) + log.Println("name:", shortName) + log.Println("operation status:", vrf.GetStatus().GetOperStatus().String()) if vrf.GetSpec().GetVni() != 0 { diff --git a/network/bridge_port.go b/network/bridge_port.go index 6202396..4679609 100644 --- a/network/bridge_port.go +++ b/network/bridge_port.go @@ -20,21 +20,32 @@ import ( // CreateBridgePort creates an Bridge Port an OPI server func (c evpnClientImpl) CreateBridgePort(ctx context.Context, name string, mac string, bridgePortType string, logicalBridges []string) (*pb.BridgePort, error) { var typeOfPort pb.BridgePortType + conn, closer, err := c.NewConn() if err != nil { log.Printf("error creating connection: %s\n", err) return nil, err } defer closer() + if mac == "" || bridgePortType == "" { return nil, errors.New("required parameter [mac, bridgePortType] wasn't passed ") } + + var lBridges = make([]string, 0) + for _, lb := range logicalBridges { + str := resourceIDToFullName("bridges", lb) + lBridges = append(lBridges, str) + } + client := c.getEvpnBridgePortClient(conn) + macBytes, err := net.ParseMAC(mac) if err != nil { fmt.Println("Error parsing MAC address:", err) return nil, err } + switch bridgePortType { case "access": typeOfPort = pb.BridgePortType_BRIDGE_PORT_TYPE_ACCESS @@ -49,7 +60,7 @@ func (c evpnClientImpl) CreateBridgePort(ctx context.Context, name string, mac s Spec: &pb.BridgePortSpec{ MacAddress: macBytes, Ptype: typeOfPort, - LogicalBridges: logicalBridges, + LogicalBridges: lBridges, }, }, }) diff --git a/network/bridge_port_test.go b/network/bridge_port_test.go index a6dd797..c96a8d5 100644 --- a/network/bridge_port_test.go +++ b/network/bridge_port_test.go @@ -28,7 +28,7 @@ func TestCreateBridgePort(t *testing.T) { Spec: &pb.BridgePortSpec{ MacAddress: macBytes, Ptype: pb.BridgePortType_BRIDGE_PORT_TYPE_ACCESS, - LogicalBridges: []string{"lb1", "lb2"}, + LogicalBridges: []string{"//network.opiproject.org/bridges/lb1", "//network.opiproject.org/bridges/lb2"}, }, } diff --git a/network/svi.go b/network/svi.go index 0cb4013..a2fcbed 100644 --- a/network/svi.go +++ b/network/svi.go @@ -31,6 +31,9 @@ func (c evpnClientImpl) CreateSvi(ctx context.Context, name string, vrf string, if vrf == "" || mac == "" || len(gwIPs) == 0 { return nil, errors.New("one of the required together parameter [vrf, mac, gwIPs] wasn't passed ") } + vrfName := resourceIDToFullName("vrfs", vrf) + + lBridge := resourceIDToFullName("bridges", logicalBridge) gwPrefixes, err := parseIPPrefixes(gwIPs) if err != nil { @@ -46,8 +49,8 @@ func (c evpnClientImpl) CreateSvi(ctx context.Context, name string, vrf string, SviId: name, Svi: &pb.Svi{ Spec: &pb.SviSpec{ - Vrf: vrf, - LogicalBridge: logicalBridge, + Vrf: vrfName, + LogicalBridge: lBridge, MacAddress: macBytes, GwIpPrefix: gwPrefixes, EnableBgp: ebgp, diff --git a/network/svi_test.go b/network/svi_test.go index 9e40707..2a5bd39 100644 --- a/network/svi_test.go +++ b/network/svi_test.go @@ -38,8 +38,8 @@ func TestCreateSvi(t *testing.T) { testSvi := &pb.Svi{ Spec: &pb.SviSpec{ - Vrf: "vrf1", - LogicalBridge: "logical1", + Vrf: "//network.opiproject.org/vrfs/vrf1", + LogicalBridge: "//network.opiproject.org/bridges/logical1", MacAddress: macBytes, GwIpPrefix: wantGWPrefixes, EnableBgp: true,