Skip to content

Commit 7403b8b

Browse files
authored
Vlan subinterfaces (#20)
1 parent 91c7abd commit 7403b8b

File tree

6 files changed

+101
-28
lines changed

6 files changed

+101
-28
lines changed

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,32 @@ Result:
532532
}
533533
```
534534

535+
### vlan_subinterfaces
536+
537+
Example:
538+
539+
```yaml
540+
vlan_subinterfaces:
541+
- cidr: 1.2.3.0/24
542+
port: Ethernet0
543+
vlan: 1000
544+
vrf: Vrf45
545+
```
546+
547+
Result:
548+
549+
```json
550+
{
551+
"VLAN_SUB_INTERFACE": {
552+
"Ethernet0.1000": {
553+
"admin_status": "up",
554+
"vrf_name": "Vrf45"
555+
},
556+
"Ethernet0.1000|1.2.3.0/24": {}
557+
}
558+
}
559+
```
560+
535561
### vlans
536562

537563
Example:

configdb/configdb.go

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,35 @@ import (
1212
)
1313

1414
type ConfigDB struct {
15-
ACLRules map[string]ACLRule `json:"ACL_RULE,omitempty"`
16-
ACLTables map[string]ACLTable `json:"ACL_TABLE,omitempty"`
17-
Breakouts map[string]BreakoutConfig `json:"BREAKOUT_CFG,omitempty"`
18-
DeviceMetadata DeviceMetadata `json:"DEVICE_METADATA"`
19-
DNSNameservers map[string]DNSNameserver `json:"DNS_NAMESERVER,omitempty"`
20-
Features map[string]Feature `json:"FEATURE,omitempty"`
21-
Interfaces map[string]Interface `json:"INTERFACE,omitempty"`
22-
LLDP *LLDP `json:"LLDP,omitempty"`
23-
LoopbackInterface map[string]struct{} `json:"LOOPBACK_INTERFACE,omitempty"`
24-
MCLAGDomains map[string]MCLAGDomain `json:"MCLAG_DOMAIN,omitempty"`
25-
MCLAGInterfaces map[string]MCLAGInterface `json:"MCLAG_INTERFACE,omitempty"`
26-
MCLAGUniqueIPs map[string]MCLAGUniqueIP `json:"MCLAG_UNIQUE_IP,omitempty"`
27-
MgmtInterfaces map[string]MgmtInterface `json:"MGMT_INTERFACE,omitempty"`
28-
MgmtPorts map[string]MgmtPort `json:"MGMT_PORT,omitempty"`
29-
MgmtVRFConfig MgmtVRFConfig `json:"MGMT_VRF_CONFIG"`
30-
NTP NTP `json:"NTP"`
31-
NTPServers map[string]struct{} `json:"NTP_SERVER,omitempty"`
32-
Ports map[string]Port `json:"PORT,omitempty"`
33-
PortChannels map[string]PortChannel `json:"PORTCHANNEL,omitempty"`
34-
PortChannelMembers map[string]struct{} `json:"PORTCHANNEL_MEMBER,omitempty"`
35-
SAG *SAG `json:"SAG,omitempty"`
36-
VLANs map[string]VLAN `json:"VLAN,omitempty"`
37-
VLANInterfaces map[string]VLANInterface `json:"VLAN_INTERFACE,omitempty"`
38-
VLANMembers map[string]VLANMember `json:"VLAN_MEMBER,omitempty"`
39-
VRFs map[string]VRF `json:"VRF,omitempty"`
40-
VXLANEVPN *VXLANEVPN `json:"VXLAN_EVPN_NVO,omitempty"`
41-
VXLANTunnels map[string]VXLANTunnel `json:"VXLAN_TUNNEL,omitempty"`
42-
VXLANTunnelMap VXLANTunnelMap `json:"VXLAN_TUNNEL_MAP,omitempty"`
15+
ACLRules map[string]ACLRule `json:"ACL_RULE,omitempty"`
16+
ACLTables map[string]ACLTable `json:"ACL_TABLE,omitempty"`
17+
Breakouts map[string]BreakoutConfig `json:"BREAKOUT_CFG,omitempty"`
18+
DeviceMetadata DeviceMetadata `json:"DEVICE_METADATA"`
19+
DNSNameservers map[string]DNSNameserver `json:"DNS_NAMESERVER,omitempty"`
20+
Features map[string]Feature `json:"FEATURE,omitempty"`
21+
Interfaces map[string]Interface `json:"INTERFACE,omitempty"`
22+
LLDP *LLDP `json:"LLDP,omitempty"`
23+
LoopbackInterface map[string]struct{} `json:"LOOPBACK_INTERFACE,omitempty"`
24+
MCLAGDomains map[string]MCLAGDomain `json:"MCLAG_DOMAIN,omitempty"`
25+
MCLAGInterfaces map[string]MCLAGInterface `json:"MCLAG_INTERFACE,omitempty"`
26+
MCLAGUniqueIPs map[string]MCLAGUniqueIP `json:"MCLAG_UNIQUE_IP,omitempty"`
27+
MgmtInterfaces map[string]MgmtInterface `json:"MGMT_INTERFACE,omitempty"`
28+
MgmtPorts map[string]MgmtPort `json:"MGMT_PORT,omitempty"`
29+
MgmtVRFConfig MgmtVRFConfig `json:"MGMT_VRF_CONFIG"`
30+
NTP NTP `json:"NTP"`
31+
NTPServers map[string]struct{} `json:"NTP_SERVER,omitempty"`
32+
Ports map[string]Port `json:"PORT,omitempty"`
33+
PortChannels map[string]PortChannel `json:"PORTCHANNEL,omitempty"`
34+
PortChannelMembers map[string]struct{} `json:"PORTCHANNEL_MEMBER,omitempty"`
35+
SAG *SAG `json:"SAG,omitempty"`
36+
VLANs map[string]VLAN `json:"VLAN,omitempty"`
37+
VLANInterfaces map[string]VLANInterface `json:"VLAN_INTERFACE,omitempty"`
38+
VLANMembers map[string]VLANMember `json:"VLAN_MEMBER,omitempty"`
39+
VLANSubinterfaces map[string]VLANSubinterface `json:"VLAN_SUB_INTERFACE,omitempty"`
40+
VRFs map[string]VRF `json:"VRF,omitempty"`
41+
VXLANEVPN *VXLANEVPN `json:"VXLAN_EVPN_NVO,omitempty"`
42+
VXLANTunnels map[string]VXLANTunnel `json:"VXLAN_TUNNEL,omitempty"`
43+
VXLANTunnelMap VXLANTunnelMap `json:"VXLAN_TUNNEL_MAP,omitempty"`
4344
}
4445

4546
func GenerateConfigDB(input *values.Values, platform *p.Platform, currentDeviceMetadata DeviceMetadata) (*ConfigDB, error) {
@@ -99,6 +100,7 @@ func GenerateConfigDB(input *values.Values, platform *p.Platform, currentDeviceM
99100
VLANs: getVLANs(input.VLANs),
100101
VLANInterfaces: getVLANInterfaces(input.VLANs),
101102
VLANMembers: getVLANMembers(input.VLANs),
103+
VLANSubinterfaces: getVLANSubinterfaces(input.VLANSubinterfaces),
102104
VRFs: getVRFs(input.Interconnects, input.Ports, input.VLANs),
103105
VXLANEVPN: vxlanevpn,
104106
VXLANTunnels: vxlanTunnel,
@@ -530,6 +532,25 @@ func getVLANMembers(vlans []values.VLAN) map[string]VLANMember {
530532
return vlanMembers
531533
}
532534

535+
func getVLANSubinterfaces(subinterfaces []values.VLANSubinterface) map[string]VLANSubinterface {
536+
vlanSubinterfaces := make(map[string]VLANSubinterface)
537+
538+
for _, sub := range subinterfaces {
539+
newSubinterface := VLANSubinterface{
540+
AdminStatus: AdminStatusUp,
541+
}
542+
543+
if sub.VRF != "" {
544+
newSubinterface.VRFName = sub.VRF
545+
}
546+
547+
vlanSubinterfaces[fmt.Sprintf("%s.%s", sub.Port, sub.VLAN)] = newSubinterface
548+
vlanSubinterfaces[fmt.Sprintf("%s.%s|%s", sub.Port, sub.VLAN, sub.CIDR)] = VLANSubinterface{}
549+
}
550+
551+
return vlanSubinterfaces
552+
}
553+
533554
func getVRFs(interconnects map[string]values.Interconnect, ports values.Ports, vlans []values.VLAN) map[string]VRF {
534555
vrfs := make(map[string]VRF)
535556

configdb/fields.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ type VLANMember struct {
211211
TaggingMode TaggingMode `json:"tagging_mode,omitempty"`
212212
}
213213

214+
type VLANSubinterface struct {
215+
AdminStatus AdminStatus `json:"admin_status,omitempty"`
216+
VRFName string `json:"vrf_name,omitempty"`
217+
}
218+
214219
type VRF struct {
215220
VNI string `json:"vni,omitempty"`
216221
}

tests/4/expected.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,5 +704,12 @@
704704
"VLAN_INTERFACE": {
705705
"Vlan4000": {},
706706
"Vlan4000|10.255.1.1/24": {}
707+
},
708+
"VLAN_SUB_INTERFACE": {
709+
"Ethernet0.1000": {
710+
"admin_status": "up",
711+
"vrf_name": "Vrf45"
712+
},
713+
"Ethernet0.1000|1.2.3.0/24": {}
707714
}
708715
}

tests/4/sonic-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ ntp:
1515
- 162.159.200.1
1616
- 162.159.200.123
1717

18+
vlan_subinterfaces:
19+
- cidr: 1.2.3.0/24
20+
port: Ethernet0
21+
vlan: 1000
22+
vrf: Vrf45
23+
1824
vlans:
1925
- id: 4000
2026
ip: 10.255.1.1/24

values/values.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,17 @@ type Values struct {
109109
SAG SAG `yaml:"sag"`
110110
SSHSourceranges []string `yaml:"ssh_sourceranges"`
111111
VLANs []VLAN `yaml:"vlans"`
112+
VLANSubinterfaces []VLANSubinterface `yaml:"vlan_subinterfaces"`
112113
VTEP VTEP `yaml:"vtep"`
113114
}
114115

116+
type VLANSubinterface struct {
117+
CIDR string `yaml:"cidr"`
118+
Port string `yaml:"port"`
119+
VLAN string `yaml:"vlan"`
120+
VRF string `yaml:"vrf"`
121+
}
122+
115123
type VLAN struct {
116124
DHCPServers []string `yaml:"dhcp_servers"`
117125
ID string `yaml:"id"`

0 commit comments

Comments
 (0)