diff --git a/examples/example01/handlers/interfaces/interfacesHandler.go b/examples/example01/handlers/interfaces/interfacesHandler.go index a1353d34acd7e2daa134689d7454b766225aa8d9..cb77aa2a29e987b8234162f8f8af627fd853df55 100644 --- a/examples/example01/handlers/interfaces/interfacesHandler.go +++ b/examples/example01/handlers/interfaces/interfacesHandler.go @@ -101,6 +101,7 @@ func (yh *InterfacesHandler) Update(c ygot.ValidatedGoStruct, updates []*gnmi.Up osInterface.Name = config.Name osInterface.Type = config.Type osInterface.MTU = config.Mtu + osInterface.Enabled = config.Enabled } if *osInterface.Name != "lo" && *osInterface.Name != "wlan0" { @@ -174,6 +175,7 @@ func (yh *InterfacesHandler) updateOrCreateInterface(localInterface *additions.I config.Type = localInterface.Type config.Mtu = localInterface.MTU config.Name = localInterface.Name + config.Enabled = localInterface.Enabled state.OperStatus = localInterface.OperState state.AdminStatus = localInterface.AdminStatus diff --git a/examples/example01/osclient/additions/additions.go b/examples/example01/osclient/additions/additions.go index a5eba4db320c567267a7e6fb0c05f9ff4fa3c07b..fb11bbd31d8ff9dbfa0c685d4599fbe33cc29adb 100644 --- a/examples/example01/osclient/additions/additions.go +++ b/examples/example01/osclient/additions/additions.go @@ -25,6 +25,7 @@ type Interface struct { Name *string Type gnmitargetygot.E_IETFInterfaces_InterfaceType MTU *uint16 + Enabled *bool OperState gnmitargetygot.E_OpenconfigInterfaces_Interfaces_Interface_State_OperStatus AdminStatus gnmitargetygot.E_OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus LoopbackMode *bool diff --git a/examples/example01/osclient/additions/interfaces_linux.go b/examples/example01/osclient/additions/interfaces_linux.go index 797e7ad6908da1b7b51f7d619901a21308dba751..ef86c80d1ec54fdfe0f5000add833cafbe16a190 100644 --- a/examples/example01/osclient/additions/interfaces_linux.go +++ b/examples/example01/osclient/additions/interfaces_linux.go @@ -49,6 +49,12 @@ func (oc *interfaces) SetInterface(interfaceToSet *Interface) error { log.Debug("Current Interface-Name: ", link.Attrs().Name) + if *interfaceToSet.Enabled { + netlink.LinkSetUp(link) + } else { + netlink.LinkSetDown(link) + } + //TODO: add more set options for interface if err := netlink.LinkSetMTU(link, int(*interfaceToSet.MTU)); err != nil { log.Debugf("Failed to set MTU: %d ; err: %v", *interfaceToSet.MTU, err) @@ -148,6 +154,7 @@ func interfaceFromLink(localIface netlink.Link) (*Interface, error) { AdminStatus: adminStatus, LoopbackMode: loopbackMode, OperState: setOperState(attributes.OperState), + Enabled: ygot.Bool(setConfigEnabled(attributes.OperState)), Ipv4Addresses: IPv4Addresses, Ipv6Addresses: IPv6Addresses, }, nil @@ -173,3 +180,14 @@ func setOperState(state netlink.LinkOperState) gnmitargetygot.E_OpenconfigInterf return gnmitargetygot.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_UNKNOWN } } + +// setOperState helper function that allows to return the correct OperStatus +// type for openconfig interfaces based on a netlink LinkOperState +func setConfigEnabled(state netlink.LinkOperState) bool { + switch state { + case netlink.OperUp: + return true + default: + return false + } +}