diff --git a/assets/pango/xml/utils.go b/assets/pango/xml/utils.go new file mode 100644 index 00000000..bb2cf71c --- /dev/null +++ b/assets/pango/xml/utils.go @@ -0,0 +1,15 @@ +package xml + +import "bytes" + +func StripEntryElement(data []byte) []byte { + if !bytes.HasPrefix(data, []byte("")) { + return data + } + + var startIdx, endIdx int + startIdx = bytes.Index(data, []byte(">")) + endIdx = len(data) - len("") + + return data[startIdx+1 : endIdx] +} diff --git a/pkg/translate/imports.go b/pkg/translate/imports.go index bb7aa9e5..97c4622b 100644 --- a/pkg/translate/imports.go +++ b/pkg/translate/imports.go @@ -30,10 +30,12 @@ func RenderImports(templateTypes ...string) (string, error) { manager.AddSdkImport("github.com/PaloAltoNetworks/pango/version", "") case "service": manager.AddStandardImport("context", "") + manager.AddStandardImport("encoding/xml", "") manager.AddStandardImport("fmt", "") manager.AddSdkImport("github.com/PaloAltoNetworks/pango/errors", "") manager.AddSdkImport("github.com/PaloAltoNetworks/pango/util", "") manager.AddSdkImport("github.com/PaloAltoNetworks/pango/xmlapi", "") + manager.AddSdkImport("github.com/PaloAltoNetworks/pango/xml", "pangoxml") case "filtering": manager.AddSdkImport("github.com/PaloAltoNetworks/pango/filtering", "") case "audit": diff --git a/templates/sdk/service.tmpl b/templates/sdk/service.tmpl index e2175712..14f8417d 100644 --- a/templates/sdk/service.tmpl +++ b/templates/sdk/service.tmpl @@ -56,12 +56,16 @@ return nil, err {{- if .Entry}} path, err := loc.XpathWithEntryName(vn, entry.Name) + if err != nil { + return nil, err + } {{- else}} path, err := loc.Xpath(vn) + if err != nil { + return nil, err + } + path = path[:len(path)-1] {{- end}} -if err != nil { -return nil, err -} {{- if .Entry}} createSpec, err := specifier(entry) @@ -72,10 +76,21 @@ if err != nil { return nil, err } +data, err := xml.Marshal(createSpec) +if err != nil { + return nil, err +} + +// Optionally remove top entry element from marshalled data to fullfill +// PAN-OS API requirements. +// PAN-OS behaviour change: SET operations in the XML API no longer support +// partial XPath values. +data = pangoxml.StripEntryElement(data) + cmd := &xmlapi.Config{ Action: "set", -Xpath: util.AsXpath(path[:len(path)-1]), -Element: createSpec, +Xpath: util.AsXpath(path), +Element: string(data), Target: s.client.GetTarget(), }