@@ -5,6 +5,7 @@ package nxos
55
66import (
77 "context"
8+ "encoding/json"
89 "errors"
910 "fmt"
1011 "slices"
@@ -62,7 +63,7 @@ const (
6263// PhysIf represents a physical (ethernet) interface on a NX-OS device.
6364type PhysIf struct {
6465 AccessVlan string `json:"accessVlan"`
65- AdminSt AdminSt2 `json:"adminSt"`
66+ AdminSt AdminSt2 `json:"adminSt,omitempty "`
6667 Descr string `json:"descr"`
6768 ID string `json:"id"`
6869 Layer Layer `json:"layer"`
@@ -71,7 +72,7 @@ type PhysIf struct {
7172 Mode SwitchportMode `json:"mode"`
7273 NativeVlan string `json:"nativeVlan"`
7374 TrunkVlans string `json:"trunkVlans"`
74- UserCfgdFlags string `json:"userCfgdFlags"`
75+ UserCfgdFlags UserFlags `json:"userCfgdFlags"`
7576 RtvrfMbrItems * VrfMember `json:"rtvrfMbr-items,omitempty"`
7677}
7778
@@ -90,14 +91,12 @@ func (p *PhysIf) Validate() error {
9091
9192func (p * PhysIf ) Default () {
9293 p .AccessVlan = DefaultVLAN
93- p .AdminSt = AdminStDown
9494 p .Layer = Layer2
9595 p .MTU = DefaultMTU
9696 p .Medium = MediumBroadcast
9797 p .Mode = SwitchportModeAccess
9898 p .NativeVlan = DefaultVLAN
9999 p .TrunkVlans = DefaultVLANRange
100- p .UserCfgdFlags = "admin_state"
101100}
102101
103102type PhysIfOperItems struct {
@@ -157,7 +156,7 @@ type PortChannel struct {
157156 PcMode PortChannelMode `json:"pcMode"`
158157 NativeVlan string `json:"nativeVlan"`
159158 TrunkVlans string `json:"trunkVlans"`
160- UserCfgdFlags string `json:"userCfgdFlags"`
159+ UserCfgdFlags UserFlags `json:"userCfgdFlags"`
161160 RsmbrIfsItems struct {
162161 RsMbrIfsList gnmiext.List [string , * PortChannelMember ] `json:"RsMbrIfs-list,omitzero"`
163162 } `json:"rsmbrIfs-items,omitzero"`
@@ -478,3 +477,83 @@ const (
478477 PortChannelModeActive PortChannelMode = "active"
479478 PortChannelModePassive PortChannelMode = "passive"
480479)
480+
481+ // UserFlags represents the user configured flags for an interface.
482+ // It supports a combination of the following flags:
483+ // 1 - admin_state
484+ // 2 - admin_layer
485+ // 4 - admin_router_mac
486+ // 8 - admin_dce_mode
487+ // 16 - admin_mtu
488+ type UserFlags uint8
489+
490+ const (
491+ UserFlagAdminState UserFlags = 1 << iota
492+ UserFlagAdminLayer
493+ UserFlagAdminRouterMac
494+ UserFlagAdminDceMode
495+ UserFlagAdminMTU
496+ )
497+
498+ var (
499+ _ fmt.Stringer = UserFlags (0 )
500+ _ json.Marshaler = UserFlags (0 )
501+ _ json.Unmarshaler = (* UserFlags )(nil )
502+ )
503+
504+ // UnmarshalJSON implements json.Unmarshaler.
505+ func (f * UserFlags ) UnmarshalJSON ([]byte ) error {
506+ var s string
507+ if err := json .Unmarshal ([]byte (s ), & s ); err != nil {
508+ return err
509+ }
510+
511+ var flags UserFlags
512+ for flag := range strings .SplitSeq (s , "," ) {
513+ switch strings .TrimSpace (flag ) {
514+ case "admin_state" :
515+ flags |= UserFlagAdminState
516+ case "admin_layer" :
517+ flags |= UserFlagAdminLayer
518+ case "admin_router_mac" :
519+ flags |= UserFlagAdminRouterMac
520+ case "admin_dce_mode" :
521+ flags |= UserFlagAdminDceMode
522+ case "admin_mtu" :
523+ flags |= UserFlagAdminMTU
524+ case "" :
525+ // ignore empty flag
526+ default :
527+ return fmt .Errorf ("interface: unknown user flag %q" , flag )
528+ }
529+ }
530+ * f = flags
531+ return nil
532+ }
533+
534+ // MarshalJSON implements json.Marshaler.
535+ func (f UserFlags ) MarshalJSON () ([]byte , error ) {
536+ return json .Marshal (f .String ())
537+ }
538+
539+ // String implements fmt.Stringer.
540+ func (f UserFlags ) String () string {
541+ var flags []string
542+ if f & UserFlagAdminState != 0 {
543+ flags = append (flags , "admin_state" )
544+ }
545+ if f & UserFlagAdminLayer != 0 {
546+ flags = append (flags , "admin_layer" )
547+ }
548+ if f & UserFlagAdminRouterMac != 0 {
549+ flags = append (flags , "admin_router_mac" )
550+ }
551+ if f & UserFlagAdminDceMode != 0 {
552+ flags = append (flags , "admin_dce_mode" )
553+ }
554+ if f & UserFlagAdminMTU != 0 {
555+ flags = append (flags , "admin_mtu" )
556+ }
557+ slices .Sort (flags )
558+ return strings .Join (flags , "," )
559+ }
0 commit comments