junoser icon indicating copy to clipboard operation
junoser copied to clipboard

apply-path takes a quoted string

Open vincentbernat opened this issue 4 years ago • 2 comments

Hey!

With the latest master, I still have issues with apply-path:

set policy-options prefix-list ipvX-bgp-neighbors apply-path "routing-instances <*> protocols bgp group <*> neighbor <*>"

Generated parser is:

            b(str("policy-options"),
                c(
                    b(a(str("prefix-list"), arg),
                        c(
                              prefix_list_items,
                            a(str("apply-path"), arg)
                        )
                    )
                )
            ),

Last arg could be replaced by quote.

XML says:

                  <xsd:element name="apply-path" minOccurs="0" type="xsd:string">
                    <xsd:annotation>
                      <xsd:documentation>Apply IP prefixes from a configuration statement</xsd:documentation>
                      <xsd:appinfo>
                        <flag>ephemeral-db-exclude</flag>
                        <flag>twig-dynamic-db-ok</flag>
                        <flag>current-product-support</flag>
                      </xsd:appinfo>
                    </xsd:annotation>
                  </xsd:element>

To me, it seems when we have an xsd:string, we should use quote | arg. In ruler.rb, all occurrences of quote | arg seems to be special case. I am fine by adding apply-path to the list, but out of curiosity, why not always use quote | arg?

vincentbernat avatar May 16 '20 10:05 vincentbernat

That's just a fail-safe. Some xsd:string in JUNOS which rejects quoted strings with white spaces like:

koji@vsrx# set routing-instances "a a" instance-type vrf
error: instance_name: 'a a': Must be a non-reserved string of 128 characters or less with no spaces.
error: statement creation failed: a a
      <xsd:element name="name">
        <xsd:annotation>
          <xsd:documentation>Routing instance name</xsd:documentation>
          <xsd:appinfo>
            <flag>mustquote</flag>
            <flag>identifier</flag>
            <flag>nokeyword</flag>
            <flag>current-product-support</flag>
            <regex-match deprecate="deprecate">!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$</regex-match>
            <regex-match-error deprecate="deprecate">Must be a non-reserved string of 128 characters or less with no spaces.</regex-match-error>
            <match>
              <pattern>!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$</pattern>
              <message>Must be a non-reserved string of 128 characters or less with no spaces.</message>
            </match>
              <identifier/>
          </xsd:appinfo>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:simpleContent>
            <xsd:extension base="xsd:string">
              <xsd:attribute name="key" type="xsd:string" fixed="key"/>
            </xsd:extension>
          </xsd:simpleContent>
        </xsd:complexType>
      </xsd:element>
        <!-- </name> -->

Generally speaking, single-word should always be safe while "quoted strings" shouldn't. I know <regex-match deprecate="deprecate"> could be a hint in this case and there might be something else to determine which syntax can accept "quoted strings" but it's very hard to study all xsd:string unfortunately.

codeout avatar May 18 '20 14:05 codeout

Just published v0.3.13 including #17 through #21. Also it will fix this issue under policy-options prefix-list xxx apply-path but I didn't translate all xsd:string into quote | arg. There are still things we need to figure out.

codeout avatar May 20 '20 13:05 codeout