diff --git a/gogen/codegen_test.go b/gogen/codegen_test.go index 9791e74cd..67952b4f7 100644 --- a/gogen/codegen_test.go +++ b/gogen/codegen_test.go @@ -1123,6 +1123,20 @@ func TestSimpleStructs(t *testing.T) { }, }, wantStructsCodeFile: filepath.Join(TestRoot, "testdata/structs/presence-container-example.formatted-txt"), + }, { + name: "skip obsolete list keys test", + inFiles: []string{filepath.Join(datapath, "skip-obsolete-test.yang")}, + inConfig: CodeGenerator{ + IROptions: ygen.IROptions{ + TransformationOptions: ygen.TransformationOpts{ + SkipObsolete: true, + }, + }, + GoOptions: GoOpts{ + GenerateSimpleUnions: true, + }, + }, + wantErrSubstring: "did not find type for key obsolete-key", }} for _, tt := range tests { diff --git a/gogen/unordered_list.go b/gogen/unordered_list.go index 462634561..b698298f3 100644 --- a/gogen/unordered_list.go +++ b/gogen/unordered_list.go @@ -546,7 +546,10 @@ func generateGetListKey(buf *bytes.Buffer, s *ygen.ParsedDirectory, nameMap map[ sort.Strings(kn) for _, k := range kn { - h.Keys = append(h.Keys, nameMap[k]) + // Skip keys that don't exist in nameMap (e.g., when skip_obsolete is enabled) + if fieldMap, ok := nameMap[k]; ok { + h.Keys = append(h.Keys, fieldMap) + } } return goKeyMapTemplate.Execute(buf, h) diff --git a/testdata/modules/skip-obsolete-test.yang b/testdata/modules/skip-obsolete-test.yang new file mode 100644 index 000000000..fcde084de --- /dev/null +++ b/testdata/modules/skip-obsolete-test.yang @@ -0,0 +1,29 @@ +module skip-obsolete-test { + prefix "sot"; + namespace "urn:sot"; + + container top { + list interfaces { + key "name obsolete-key"; + + leaf name { + type string; + description "Interface name"; + } + + leaf obsolete-key { + type string; + status obsolete; + description "Obsolete key that should be skipped"; + } + + leaf admin-status { + type enumeration { + enum up; + enum down; + } + description "Administrative status"; + } + } + } +}