146 lines
2.8 KiB
Go
146 lines
2.8 KiB
Go
|
package models
|
||
|
|
||
|
import "strconv"
|
||
|
|
||
|
const (
|
||
|
Iface2dot5G = "2.5gbase-t"
|
||
|
Iface1G = "1000base-t"
|
||
|
Iface100M = "100base-tx"
|
||
|
)
|
||
|
|
||
|
var speedAssociation map[string]int = map[string]int{
|
||
|
"2.5gbase-t": 2500,
|
||
|
"1000base-t": 1000,
|
||
|
"100base-tx": 100,
|
||
|
}
|
||
|
|
||
|
type DeviceRole struct {
|
||
|
ID int `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
Slug string `json:"slug"`
|
||
|
}
|
||
|
|
||
|
type Device struct {
|
||
|
ID int `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
Role DeviceRole `json:"role"`
|
||
|
}
|
||
|
|
||
|
func (d Device) UniqueID() string {
|
||
|
return "device-" + strconv.FormatInt(int64(d.ID), 10)
|
||
|
}
|
||
|
|
||
|
func (d Device) Element() Element {
|
||
|
return Element{
|
||
|
Data: ElementData{
|
||
|
ID: d.UniqueID(),
|
||
|
Label: d.Name,
|
||
|
},
|
||
|
Classes: nil,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type InterfaceType struct {
|
||
|
Value string `json:"value"`
|
||
|
Label string `json:"label"`
|
||
|
}
|
||
|
|
||
|
type Interface struct {
|
||
|
ID int `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
Device Device `json:"device"`
|
||
|
MacAddress string `json:"mac_address"`
|
||
|
Type InterfaceType `json:"type"`
|
||
|
}
|
||
|
|
||
|
func (i Interface) MaxSpeed() int {
|
||
|
speed, ok := speedAssociation[i.Type.Value]
|
||
|
if !ok {
|
||
|
return 0
|
||
|
}
|
||
|
return speed
|
||
|
}
|
||
|
|
||
|
type Object struct {
|
||
|
Device Device `json:"device"`
|
||
|
Interface Interface
|
||
|
}
|
||
|
|
||
|
type CableTermination struct {
|
||
|
ObjectID int `json:"object_id"`
|
||
|
Object Object `json:"object"`
|
||
|
}
|
||
|
|
||
|
type Cable struct {
|
||
|
ID int `json:"id"`
|
||
|
ATerminations []CableTermination `json:"a_terminations"`
|
||
|
BTerminations []CableTermination `json:"b_terminations"`
|
||
|
}
|
||
|
|
||
|
func (c Cable) UniqueID() string {
|
||
|
return "link-" + strconv.FormatInt(int64(c.ID), 10)
|
||
|
}
|
||
|
|
||
|
func (c Cable) MaxSpeed() int {
|
||
|
speedA := c.ATerminations[0].Object.Interface.MaxSpeed()
|
||
|
speedB := c.BTerminations[0].Object.Interface.MaxSpeed()
|
||
|
|
||
|
if speedA > speedB {
|
||
|
return speedB
|
||
|
}
|
||
|
return speedA
|
||
|
}
|
||
|
|
||
|
func (c Cable) Element() Element {
|
||
|
|
||
|
var linkClass string
|
||
|
switch c.MaxSpeed() {
|
||
|
case 2500:
|
||
|
linkClass = "link-fast"
|
||
|
case 1000:
|
||
|
linkClass = "link-normal"
|
||
|
case 100:
|
||
|
linkClass = "link-slow"
|
||
|
default:
|
||
|
linkClass = "link-speed-unknown"
|
||
|
}
|
||
|
|
||
|
return Element{
|
||
|
Data: ElementData{
|
||
|
ID: c.UniqueID(),
|
||
|
Source: c.ATerminations[0].Object.Device.UniqueID(),
|
||
|
Target: c.BTerminations[0].Object.Device.UniqueID(),
|
||
|
},
|
||
|
Classes: []string{"link", linkClass},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type VM struct {
|
||
|
ID int `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
Device Device `json:"device"`
|
||
|
}
|
||
|
|
||
|
func (v VM) UniqueID() string {
|
||
|
return "vm-" + strconv.FormatInt(int64(v.ID), 10)
|
||
|
}
|
||
|
|
||
|
func (v VM) Elements() []Element {
|
||
|
return []Element{
|
||
|
{
|
||
|
Data: ElementData{
|
||
|
ID: v.UniqueID(),
|
||
|
Label: v.Name,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Data: ElementData{
|
||
|
ID: "vm-cable" + strconv.FormatInt(int64(v.ID), 10),
|
||
|
Source: v.UniqueID(),
|
||
|
Target: v.Device.UniqueID(),
|
||
|
},
|
||
|
Classes: []string{"link", "link-virtual"},
|
||
|
},
|
||
|
}
|
||
|
}
|