diff --git a/module/macaddress.go b/module/macaddress.go new file mode 100644 index 0000000..6d2a239 --- /dev/null +++ b/module/macaddress.go @@ -0,0 +1,76 @@ +// +// Copyright (c) 2015-2016, Arista Networks, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of Arista Networks nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +package module + +type ShowMACAddressTable struct { + MulticastTable struct { + TableEntries []MACAddressTableEntry `json:"tableEntries"` + } `json:"multicastTable"` + UnicastTable struct { + TableEntries []MACAddressTableEntry `json:"tableEntries"` + } `json:"unicastTable"` +} + +type MACAddressTableEntry struct { + MACAddress string + LastMove float64 + Interface string + Moves int + EntryType string + VlanID int +} + +func (a *ShowMACAddressTable) GetCmd() string { + return "show mac address-table" +} + +func (s *ShowEntity) ShowMACAddressTable() (ShowMACAddressTable, error) { + var showmacaddresstable ShowMACAddressTable + + handle, err := s.node.GetHandle("json") + if err != nil { + return showmacaddresstable, err + } + + err = handle.AddCommand(&showmacaddresstable) + if err != nil { + return showmacaddresstable, err + } + + if err := handle.Call(); err != nil { + return showmacaddresstable, err + } + + handle.Close() + return showmacaddresstable, nil +} diff --git a/module/macaddress_test.go b/module/macaddress_test.go new file mode 100644 index 0000000..49222ea --- /dev/null +++ b/module/macaddress_test.go @@ -0,0 +1,69 @@ +package module + +import ( + "errors" + "testing" + + "github.com/aristanetworks/goeapi" +) + +func TestShowMACAddressTable_UnitTest(t *testing.T) { + var dummyNode *goeapi.Node + var dummyConnection *DummyConnection + + dummyConnection = &DummyConnection{} + + dummyNode = &goeapi.Node{} + dummyNode.SetConnection(dummyConnection) + + show := Show(dummyNode) + showMACAddressTable, err := show.ShowMACAddressTable() + if err != nil { + t.Errorf("Error during Show MAC Address Table, %s", err) + } + + var scenarios = []struct { + MACAddress string + Interface string + VlanID int + }{ + { + MACAddress: "ab:cd:ef:12:34:56", + Interface: "Ethernet1", + VlanID: 123, + }, + { + MACAddress: "ab:cd:ef:78:90:12", + Interface: "Ethernet2", + VlanID: 456, + }, + } + + unicastTableEntries := showMACAddressTable.UnicastTable.TableEntries + + for i, tt := range scenarios { + if tt.MACAddress != unicastTableEntries[i].MACAddress { + t.Errorf("MACAddress does not match expected %s, got %s", tt.MACAddress, unicastTableEntries[i].MACAddress) + } + + if tt.Interface != unicastTableEntries[i].Interface { + t.Errorf("Interface does not match expected %s, got %s", tt.Interface, unicastTableEntries[i].Interface) + } + + if tt.VlanID != unicastTableEntries[i].VlanID { + t.Errorf("VlanID does not match expected %d, got %d", tt.VlanID, unicastTableEntries[i].VlanID) + } + } +} + +func TestShowMACAddressTableErrorDuringCall_UnitTest(t *testing.T) { + dummyConnection := &DummyConnection{err: errors.New("error during connection")} + dummyNode := &goeapi.Node{} + dummyNode.SetConnection(dummyConnection) + + show := Show(dummyNode) + _, err := show.ShowMACAddressTable() + if err == nil { + t.Errorf("Error expected during show mac address-table") + } +} diff --git a/testdata/fixtures/show_mac_address-table.json b/testdata/fixtures/show_mac_address-table.json new file mode 100644 index 0000000..35a750b --- /dev/null +++ b/testdata/fixtures/show_mac_address-table.json @@ -0,0 +1,31 @@ +{ + "jsonrpc": "2.0", + "id": "1", + "result": [ + {}, + { + "multicastTable": { + "tableEntries": [] + }, + "unicastTable": { + "tableEntries": [{ + "macAddress": "ab:cd:ef:12:34:56", + "lastMove": 1576852145.519468, + "interface": "Ethernet1", + "moves": 1, + "entryType": "dynamic", + "vlanId": 123 + }, + { + "macAddress": "ab:cd:ef:78:90:12", + "lastMove": 1576850000.519468, + "interface": "Ethernet2", + "moves": 5, + "entryType": "dynamic", + "vlanId": 456 + } + ] + } + } + ] +}