-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Generate template for edgeos
- Loading branch information
Showing
6 changed files
with
648 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
package edgeos | ||
|
||
import "github.com/ffddorf/confgen/netbox/models" | ||
|
||
type InterfaceType string | ||
|
||
const ( | ||
InterfaceTypeBonding InterfaceType = "bonding" // Bonding interface name | ||
InterfaceTypeBridge InterfaceType = "bridge" // Bridge interface name | ||
InterfaceTypeEthernet InterfaceType = "ethernet" // Ethernet interface name | ||
InterfaceTypeInput InterfaceType = "input" // Input functional block (IFB) interface name | ||
InterfaceTypeIpv6Tunnel InterfaceType = "ipv6-tunnel" // IPv6 Tunnel interface | ||
InterfaceTypeL2tpClient InterfaceType = "l2tp-client" // L2TP client interface name | ||
InterfaceTypeL2tpv3 InterfaceType = "l2tpv3" // L2TPv3 interface | ||
InterfaceTypeLoopback InterfaceType = "loopback" // Loopback interface name | ||
InterfaceTypeOpenvpn InterfaceType = "openvpn" // OpenVPN tunnel interface name | ||
InterfaceTypePptpClient InterfaceType = "pptp-client" // PPTP client interface name | ||
InterfaceTypePseudoEthernet InterfaceType = "pseudo-ethernet" // Pseudo Ethernet device name | ||
InterfaceTypeSwitch InterfaceType = "switch" // Switch interface name | ||
InterfaceTypeTunnel InterfaceType = "tunnel" // Tunnel interface | ||
InterfaceTypeVti InterfaceType = "vti" // Virtual Tunnel interface | ||
InterfaceTypeWirelessmodem InterfaceType = "wirelessmodem" // Wireless modem interface name | ||
) | ||
|
||
func InterfaceTypeFromNetbox(netboxType models.DcimInterfaceTypeChoices) (edgeosType InterfaceType, ok bool) { | ||
ok = true | ||
switch netboxType { | ||
case models.DcimInterfaceTypeChoicesA100baseTx, | ||
models.DcimInterfaceTypeChoicesA1000baseT, | ||
models.DcimInterfaceTypeChoicesA25gbaseT, | ||
models.DcimInterfaceTypeChoicesA5gbaseT, | ||
models.DcimInterfaceTypeChoicesA10gbaseT, | ||
models.DcimInterfaceTypeChoicesA10gbaseCx4, | ||
models.DcimInterfaceTypeChoicesA1000baseXGbic, | ||
models.DcimInterfaceTypeChoicesA1000baseXSfp, | ||
models.DcimInterfaceTypeChoicesA10gbaseXSfpp, | ||
models.DcimInterfaceTypeChoicesA10gbaseXXfp, | ||
models.DcimInterfaceTypeChoicesA10gbaseXXenpak, | ||
models.DcimInterfaceTypeChoicesA10gbaseXX2, | ||
models.DcimInterfaceTypeChoicesA25gbaseXSfp28, | ||
models.DcimInterfaceTypeChoicesA50gbaseXSfp56, | ||
models.DcimInterfaceTypeChoicesA40gbaseXQsfpp, | ||
models.DcimInterfaceTypeChoicesA50gbaseXSfp28, | ||
models.DcimInterfaceTypeChoicesA100gbaseXCfp, | ||
models.DcimInterfaceTypeChoicesA100gbaseXCfp2, | ||
models.DcimInterfaceTypeChoicesA200gbaseXCfp2, | ||
models.DcimInterfaceTypeChoicesA100gbaseXCfp4, | ||
models.DcimInterfaceTypeChoicesA100gbaseXCpak, | ||
models.DcimInterfaceTypeChoicesA100gbaseXQsfp28, | ||
models.DcimInterfaceTypeChoicesA200gbaseXQsfp56, | ||
models.DcimInterfaceTypeChoicesA400gbaseXQsfpdd, | ||
models.DcimInterfaceTypeChoicesA400gbaseXOsfp, | ||
models.DcimInterfaceTypeChoicesA1gfcSfp, | ||
models.DcimInterfaceTypeChoicesA2gfcSfp, | ||
models.DcimInterfaceTypeChoicesA4gfcSfp, | ||
models.DcimInterfaceTypeChoicesA8gfcSfpp, | ||
models.DcimInterfaceTypeChoicesA16gfcSfpp, | ||
models.DcimInterfaceTypeChoicesA32gfcSfp28, | ||
models.DcimInterfaceTypeChoicesA64gfcQsfpp, | ||
models.DcimInterfaceTypeChoicesA128gfcQsfp28: | ||
edgeosType = InterfaceTypeEthernet | ||
case models.DcimInterfaceTypeChoicesBridge: | ||
edgeosType = InterfaceTypeBridge | ||
case models.DcimInterfaceTypeChoicesLag: | ||
edgeosType = InterfaceTypeBonding | ||
case models.DcimInterfaceTypeChoicesVirtual: | ||
edgeosType = InterfaceTypeLoopback | ||
default: | ||
ok = false | ||
} | ||
return | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package templates | ||
|
||
import ( | ||
"strings" | ||
|
||
"github.com/ffddorf/confgen/interop/edgeos" | ||
"github.com/ffddorf/confgen/netbox" | ||
"github.com/ffddorf/confgen/netbox/models" | ||
) | ||
|
||
func edgeosConfigFromMap(in map[string]interface{}) string { | ||
out := new(strings.Builder) | ||
if err := edgeos.ConfigFromMap(out, in, 0); err != nil { | ||
panic(err) | ||
} | ||
return out.String() | ||
} | ||
|
||
type ChildInterface = models.DeviceDeviceDeviceTypeInterfacesInterfaceTypeChild_interfacesInterfaceType | ||
|
||
type edgeosInterfaceDef struct { | ||
netbox.Interface | ||
VIFs []ChildInterface | ||
} | ||
|
||
// Structures interfaces coming from netbox | ||
// to be more compatible with the config | ||
// structure of EdgeOS. | ||
func edgeosPrepareInterfaces(interfaces []netbox.Interface) map[edgeos.InterfaceType][]edgeosInterfaceDef { | ||
groups := make(map[edgeos.InterfaceType][]edgeosInterfaceDef) | ||
for _, iface := range interfaces { | ||
// find interface type, skip if not known | ||
ifType, ok := edgeos.InterfaceTypeFromNetbox(iface.Type) | ||
if !ok { | ||
continue | ||
} | ||
|
||
// skip interfaces that are children | ||
if iface.Parent.Id != "" { | ||
continue | ||
} | ||
|
||
outIface := edgeosInterfaceDef{Interface: iface} | ||
|
||
// add child interfaces | ||
if len(iface.Child_interfaces) > 0 { | ||
outIface.VIFs = iface.Child_interfaces | ||
} | ||
|
||
// add to list in map | ||
if _, ok := groups[ifType]; !ok { | ||
groups[ifType] = make([]edgeosInterfaceDef, 0, 1) | ||
} | ||
groups[ifType] = append(groups[ifType], outIface) | ||
} | ||
|
||
return groups | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
interfaces { | ||
{{- $ifGroups := edgeosPrepareInterfaces .Device.Interfaces }} | ||
{{- range $ifType, $ifs := $ifGroups }} | ||
{{- range $ifs }} | ||
{{ $ifType }} {{ .Name }} { | ||
{{- if .Description }} | ||
description {{ .Description | maybeQuote }} | ||
{{- end }} | ||
{{- range .Ip_addresses }} | ||
address {{ .Address }} | ||
{{- end }} | ||
{{- if not .Enabled }} | ||
disable | ||
{{- end }} | ||
{{- if .Speed }} | ||
speed {{ .Speed }} | ||
{{- end }} | ||
{{- if .Duplex }} | ||
duplex {{ .Duplex }} | ||
{{- end }} | ||
{{- /* edgeosConfigFromMap .ConfigContext */}} | ||
{{- range .VIFs }} | ||
vif {{ .Untagged_vlan.Vid }} { | ||
{{- if .Description }} | ||
description {{ .Description | maybeQuote }} | ||
{{- end }} | ||
{{- range .Ip_addresses }} | ||
address {{ .Address }} | ||
{{- end }} | ||
{{- if not .Enabled }} | ||
disable | ||
{{- end }} | ||
{{- /* edgeosConfigFromMap .ConfigContext */}} | ||
} | ||
{{- end }} | ||
} | ||
{{- end }} | ||
{{- end }} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
package templates | ||
|
||
import ( | ||
_ "embed" | ||
"errors" | ||
"io" | ||
"text/template" | ||
|
||
"github.com/ffddorf/confgen/netbox" | ||
) | ||
|
||
var ( | ||
// all known templates by name | ||
templates = map[string]*template.Template{} | ||
|
||
// common template functions | ||
funcs = template.FuncMap{ | ||
"maybeQuote": maybeQuote, | ||
"edgeosConfigFromMap": edgeosConfigFromMap, | ||
"edgeosPrepareInterfaces": edgeosPrepareInterfaces, | ||
} | ||
) | ||
|
||
// template bodies embedded via `go:embed` | ||
var ( | ||
//go:embed edgeos.tpl | ||
edgeosRaw string | ||
// ... load your template file here! | ||
) | ||
|
||
func init() { | ||
initTemplate("edgeos", edgeosRaw) | ||
// ... initialize your template instance here! | ||
} | ||
|
||
// used to initialize a template globally using its name and body | ||
func initTemplate(name string, tpl string) { | ||
templates[name] = template.Must( | ||
template.New(name). | ||
Funcs(funcs). | ||
Parse(tpl), | ||
) | ||
} | ||
|
||
// TemplateData is the data needed to execute a template | ||
type TemplateData struct { | ||
Device *netbox.Device | ||
} | ||
|
||
var ErrTemplateNotFound = errors.New("template not found") | ||
|
||
// Render executes the template by the given name and | ||
// writes the result into `out`. | ||
func Render(out io.Writer, name string, data TemplateData) error { | ||
templ, ok := templates[name] | ||
if !ok { | ||
return ErrTemplateNotFound | ||
} | ||
return templ.Execute(out, data) | ||
} |
Oops, something went wrong.