Skip to content

Commit 54ad4b1

Browse files
committed
only configure ports and breakouts if explicitly passed
1 parent 30e03d1 commit 54ad4b1

File tree

6 files changed

+72
-668
lines changed

6 files changed

+72
-668
lines changed

cmd/generate.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ var generateCmd = &cobra.Command{
2121
deviceDir, _ := cmd.Flags().GetString("device-dir")
2222
sonicEnvFile, _ := cmd.Flags().GetString("env-file")
2323
sonicVersionFile, _ := cmd.Flags().GetString("version-file")
24-
platformFile, _ := cmd.Flags().GetString("platform-file")
2524

2625
env, err := p.GetEnvironment(sonicEnvFile)
2726
if err != nil {
@@ -38,19 +37,6 @@ var generateCmd = &cobra.Command{
3837
return fmt.Errorf("failed to parse input file: %w", err)
3938
}
4039

41-
if platformFile == "" {
42-
platformFile = fmt.Sprintf("%s/%s/platform.json", deviceDir, env.Platform)
43-
}
44-
platformBytes, err := os.ReadFile(platformFile)
45-
if err != nil {
46-
return fmt.Errorf("failed to read platform.json file: %w", err)
47-
}
48-
49-
platform, err := p.UnmarshalPlatformJSON(platformBytes)
50-
if err != nil {
51-
return fmt.Errorf("failed to parse platform.json: %w", err)
52-
}
53-
5440
versionBytes, err := os.ReadFile(sonicVersionFile)
5541
if err != nil {
5642
return fmt.Errorf("failed to read version file: %w", err)
@@ -61,7 +47,8 @@ var generateCmd = &cobra.Command{
6147
return fmt.Errorf("failed to parse version file: %w", err)
6248
}
6349

64-
configDB, err := configdb.GenerateConfigDB(values, platform, env, version)
50+
platformFile := fmt.Sprintf("%s/%s/platform.json", deviceDir, env.Platform)
51+
configDB, err := configdb.GenerateConfigDB(values, platformFile, env, version)
6552
if err != nil {
6653
return fmt.Errorf("failed to generate config: %w", err)
6754
}
@@ -87,6 +74,5 @@ func init() {
8774
generateCmd.Flags().StringP("output-file", "o", "config_db.json", "path to output file")
8875
generateCmd.Flags().String("device-dir", "/usr/share/sonic/device", "directory which holds all device-specific files")
8976
generateCmd.Flags().StringP("env-file", "e", "/etc/sonic/sonic-environment", "sonic-environment file holding platform information")
90-
generateCmd.Flags().StringP("platform-file", "p", "", "path to platform.json")
9177
generateCmd.Flags().StringP("version-file", "v", "/etc/sonic/sonic_version.yml", "sonic version file")
9278
}

configdb/configdb.go

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"maps"
7+
"os"
78
"slices"
89
"strconv"
910

@@ -45,17 +46,32 @@ type ConfigDB struct {
4546
VXLANTunnelMap VXLANTunnelMap `json:"VXLAN_TUNNEL_MAP,omitempty"`
4647
}
4748

48-
func GenerateConfigDB(input *values.Values, platform *p.Platform, environment *p.Environment, version *v.Version) (*ConfigDB, error) {
49+
func GenerateConfigDB(input *values.Values, platformFile string, environment *p.Environment, version *v.Version) (*ConfigDB, error) {
4950
if input == nil {
5051
return nil, fmt.Errorf("no input values provided")
5152
}
52-
if platform == nil {
53-
return nil, fmt.Errorf("no platform information provided")
54-
}
5553

56-
ports, breakouts, err := getPortsAndBreakouts(input.Ports, input.Breakouts, platform)
57-
if err != nil {
58-
return nil, err
54+
var (
55+
ports map[string]Port
56+
breakouts map[string]BreakoutConfig
57+
err error
58+
)
59+
60+
if input.Ports != nil || input.Breakouts != nil {
61+
platformBytes, err := os.ReadFile(platformFile)
62+
if err != nil {
63+
return nil, fmt.Errorf("failed to read platform.json file: %w", err)
64+
}
65+
66+
platform, err := p.UnmarshalPlatformJSON(platformBytes)
67+
if err != nil {
68+
return nil, fmt.Errorf("failed to parse platform.json: %w", err)
69+
}
70+
71+
ports, breakouts, err = getPortsAndBreakouts(input.Ports, input.Breakouts, platform)
72+
if err != nil {
73+
return nil, err
74+
}
5975
}
6076

6177
deviceMetadata, err := getDeviceMetadata(input, environment)
@@ -242,7 +258,7 @@ func getFeatures(features map[string]values.Feature) map[string]Feature {
242258
return configFeatures
243259
}
244260

245-
func getInterfaces(ports values.Ports, bgpPorts []string, interconnects map[string]values.Interconnect) map[string]Interface {
261+
func getInterfaces(ports *values.Ports, bgpPorts []string, interconnects map[string]values.Interconnect) map[string]Interface {
246262
interfaces := make(map[string]Interface)
247263

248264
for _, port := range bgpPorts {
@@ -252,6 +268,19 @@ func getInterfaces(ports values.Ports, bgpPorts []string, interconnects map[stri
252268
interfaces[port] = intf
253269
}
254270

271+
for _, interconnect := range interconnects {
272+
for _, intf := range interconnect.UnnumberedInterfaces {
273+
interfaces[intf] = Interface{
274+
IPv6UseLinkLocalOnly: IPv6UseLinkLocalOnlyModeEnable,
275+
VRFName: interconnect.VRF,
276+
}
277+
}
278+
}
279+
280+
if ports == nil {
281+
return interfaces
282+
}
283+
255284
for _, port := range ports.List {
256285
if len(port.IPs) == 0 && port.VRF == "" && !slices.Contains(bgpPorts, port.Name) {
257286
continue
@@ -272,15 +301,6 @@ func getInterfaces(ports values.Ports, bgpPorts []string, interconnects map[stri
272301
}
273302
}
274303

275-
for _, interconnect := range interconnects {
276-
for _, intf := range interconnect.UnnumberedInterfaces {
277-
interfaces[intf] = Interface{
278-
IPv6UseLinkLocalOnly: IPv6UseLinkLocalOnlyModeEnable,
279-
VRFName: interconnect.VRF,
280-
}
281-
}
282-
}
283-
284304
return interfaces
285305
}
286306

@@ -439,7 +459,7 @@ func getPortChannelMembers(portchannels []values.PortChannel) map[string]struct{
439459
return portchannelMembers
440460
}
441461

442-
func getPortsAndBreakouts(ports values.Ports, breakouts map[string]string, platform *p.Platform) (map[string]Port, map[string]BreakoutConfig, error) {
462+
func getPortsAndBreakouts(ports *values.Ports, breakouts map[string]string, platform *p.Platform) (map[string]Port, map[string]BreakoutConfig, error) {
443463
configPorts := make(map[string]Port)
444464
configBreakouts := make(map[string]BreakoutConfig)
445465

@@ -627,7 +647,7 @@ func getVLANSubinterfaces(subinterfaces []values.VLANSubinterface) map[string]VL
627647
return vlanSubinterfaces
628648
}
629649

630-
func getVRFs(interconnects map[string]values.Interconnect, ports values.Ports, vlans []values.VLAN) map[string]VRF {
650+
func getVRFs(interconnects map[string]values.Interconnect, ports *values.Ports, vlans []values.VLAN) map[string]VRF {
631651
vrfs := make(map[string]VRF)
632652

633653
for _, interconnect := range interconnects {
@@ -636,24 +656,28 @@ func getVRFs(interconnects map[string]values.Interconnect, ports values.Ports, v
636656
}
637657
}
638658

639-
for _, port := range ports.List {
640-
if port.VRF == "" {
659+
for _, vlan := range vlans {
660+
if vlan.VRF == "" {
641661
continue
642662
}
643-
if _, ok := vrfs[port.VRF]; ok {
663+
if _, ok := vrfs[vlan.VRF]; ok {
644664
continue
645665
}
646-
vrfs[port.VRF] = VRF{}
666+
vrfs[vlan.VRF] = VRF{}
647667
}
648668

649-
for _, vlan := range vlans {
650-
if vlan.VRF == "" {
669+
if ports == nil {
670+
return vrfs
671+
}
672+
673+
for _, port := range ports.List {
674+
if port.VRF == "" {
651675
continue
652676
}
653-
if _, ok := vrfs[vlan.VRF]; ok {
677+
if _, ok := vrfs[port.VRF]; ok {
654678
continue
655679
}
656-
vrfs[vlan.VRF] = VRF{}
680+
vrfs[port.VRF] = VRF{}
657681
}
658682

659683
return vrfs

configdb/configdb_test.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ import (
1414
func Test_getInterfaces(t *testing.T) {
1515
tests := []struct {
1616
name string
17-
ports values.Ports
17+
ports *values.Ports
1818
bgpPorts []string
1919
interconnects map[string]values.Interconnect
2020
want map[string]Interface
2121
}{
2222
{
2323
name: "empty ports",
24-
ports: values.Ports{
24+
ports: &values.Ports{
2525
List: []values.Port{},
2626
},
2727
want: map[string]Interface{},
2828
},
2929
{
3030
name: "port not in bgp ports, with no vrf and no ips",
31-
ports: values.Ports{
31+
ports: &values.Ports{
3232
List: []values.Port{
3333
{
3434
Name: "Ethernet0",
@@ -39,7 +39,7 @@ func Test_getInterfaces(t *testing.T) {
3939
},
4040
{
4141
name: "port in bgp ports",
42-
ports: values.Ports{
42+
ports: &values.Ports{
4343
List: []values.Port{
4444
{
4545
Name: "Ethernet0",
@@ -55,7 +55,7 @@ func Test_getInterfaces(t *testing.T) {
5555
},
5656
{
5757
name: "port with vrf",
58-
ports: values.Ports{
58+
ports: &values.Ports{
5959
List: []values.Port{
6060
{
6161
Name: "Ethernet0",
@@ -71,7 +71,7 @@ func Test_getInterfaces(t *testing.T) {
7171
},
7272
{
7373
name: "port in bgp ports with vrf",
74-
ports: values.Ports{
74+
ports: &values.Ports{
7575
List: []values.Port{
7676
{
7777
Name: "Ethernet0",
@@ -89,7 +89,7 @@ func Test_getInterfaces(t *testing.T) {
8989
},
9090
{
9191
name: "port not in bgp ports without vrf but with ip",
92-
ports: values.Ports{
92+
ports: &values.Ports{
9393
List: []values.Port{
9494
{
9595
Name: "Ethernet0",
@@ -104,7 +104,7 @@ func Test_getInterfaces(t *testing.T) {
104104
},
105105
{
106106
name: "port in bgp ports with vrf and ips",
107-
ports: values.Ports{
107+
ports: &values.Ports{
108108
List: []values.Port{
109109
{
110110
Name: "Ethernet0",
@@ -198,7 +198,7 @@ func Test_getInterfaces(t *testing.T) {
198198
func Test_getPortsAndBreakouts(t *testing.T) {
199199
tests := []struct {
200200
name string
201-
ports values.Ports
201+
ports *values.Ports
202202
breakouts map[string]string
203203
platform *p.Platform
204204
wantPorts map[string]Port
@@ -207,7 +207,7 @@ func Test_getPortsAndBreakouts(t *testing.T) {
207207
}{
208208
{
209209
name: "only breakouts defined",
210-
ports: values.Ports{
210+
ports: &values.Ports{
211211
List: []values.Port{},
212212
},
213213
breakouts: map[string]string{
@@ -244,7 +244,7 @@ func Test_getPortsAndBreakouts(t *testing.T) {
244244
},
245245
{
246246
name: "only ports defined",
247-
ports: values.Ports{
247+
ports: &values.Ports{
248248
List: []values.Port{
249249
{
250250
Name: "Ethernet0",
@@ -333,7 +333,7 @@ func Test_getPortsAndBreakouts(t *testing.T) {
333333
breakouts: map[string]string{
334334
"Ethernet4": "1x100G[40G]",
335335
},
336-
ports: values.Ports{
336+
ports: &values.Ports{
337337
List: []values.Port{
338338
{
339339
Name: "Ethernet5",
@@ -359,7 +359,7 @@ func Test_getPortsAndBreakouts(t *testing.T) {
359359
breakouts: map[string]string{
360360
"Ethernet4": "1x100G[40G]",
361361
},
362-
ports: values.Ports{
362+
ports: &values.Ports{
363363
DefaultFEC: values.FECModeRS,
364364
DefaultMTU: 1500,
365365
List: []values.Port{
@@ -404,7 +404,7 @@ func Test_getPortsAndBreakouts(t *testing.T) {
404404
breakouts: map[string]string{
405405
"Ethernet4": "1x100G[40G]",
406406
},
407-
ports: values.Ports{
407+
ports: &values.Ports{
408408
List: []values.Port{
409409
{
410410
FECMode: values.FECModeRS,
@@ -466,7 +466,7 @@ func Test_getVRFs(t *testing.T) {
466466
tests := []struct {
467467
name string
468468
interconnects map[string]values.Interconnect
469-
ports values.Ports
469+
ports *values.Ports
470470
vlans []values.VLAN
471471
want map[string]VRF
472472
}{
@@ -478,7 +478,7 @@ func Test_getVRFs(t *testing.T) {
478478
VRF: "Vrf40",
479479
},
480480
},
481-
ports: values.Ports{
481+
ports: &values.Ports{
482482
List: []values.Port{},
483483
},
484484
vlans: []values.VLAN{},
@@ -496,7 +496,7 @@ func Test_getVRFs(t *testing.T) {
496496
VRF: "Vrf40",
497497
},
498498
},
499-
ports: values.Ports{
499+
ports: &values.Ports{
500500
List: []values.Port{
501501
{
502502
VRF: "Vrf40",
@@ -522,7 +522,7 @@ func Test_getVRFs(t *testing.T) {
522522
VRF: "Vrf40",
523523
},
524524
},
525-
ports: values.Ports{
525+
ports: &values.Ports{
526526
List: []values.Port{
527527
{
528528
VRF: "Vrf41",

0 commit comments

Comments
 (0)