Commit 2f3892a8 authored by Mark Canterbury's avatar Mark Canterbury
Browse files

Hack to fix TP criteria coercion to list

parent 2a1e6ba6
Loading
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
  "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
  "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common",
  "@xmlns:tp": "http://uri.etsi.org/03120/common/2022/07/TrafficPolicy",
  "@xmlns:etsi": "http://uri.etsi.org/03280/common/2017/07",
  "@xmlns:etsi280": "http://uri.etsi.org/03280/common/2017/07",
  "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task",
  "Header": {
    "SenderIdentifier": {
@@ -35,13 +35,22 @@
                "CountryCode": "XX",
                "OwnerIdentifier": "ACTOR01",
                "tp:Criteria": {
                  "tp:Criteria": [{
                  "tp:Criteria": [
                    {
                      "tp:IPPolicyCriteria": {
                        "tp:SourceIPRange": {
                        "etsi:IPv4CIDR": "203.0.113.0/24"
                          "etsi280:IPv4CIDR": "203.0.113.0/24"
                        }
                      }
                  }]
                    },
                    {
                      "tp:IPPolicyCriteria": {
                        "tp:SourceIPRange": {
                          "etsi280:IPv4CIDR": "203.0.113.0/24"
                        }
                      }
                    }
                  ]
                },
                "tp:Action": {
                  "common:Owner": "ETSI",
@@ -61,10 +70,12 @@
                "OwnerIdentifier": "ACTOR01",
                "tp:TrafficPolicyName": "Template Rule 1",
                "tp:TrafficRules": {
                  "policy:TrafficRuleReference": {
                    "policy:Order": "1",
                    "policy:ObjectIdentifier": "f69eb93b-a85b-4ff7-abaa-6f3aead286d5"
                  "tp:TrafficRuleReference": [
                    {
                      "tp:Order": 1,
                      "tp:ObjectIdentifier": "f69eb93b-a85b-4ff7-abaa-6f3aead286d5"
                    }
                  ]
                }
              }
            }
+28 −21
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<HI1Message xmlns="http://uri.etsi.org/03120/common/2019/10/Core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:common="http://uri.etsi.org/03120/common/2016/02/Common" xmlns:policy="http://uri.etsi.org/03120/common/2022/07/TrafficPolicy" xmlns:etsi="http://uri.etsi.org/03280/common/2017/07" xmlns:task="http://uri.etsi.org/03120/common/2020/09/Task">
<HI1Message xmlns="http://uri.etsi.org/03120/common/2019/10/Core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:common="http://uri.etsi.org/03120/common/2016/02/Common" xmlns:tp="http://uri.etsi.org/03120/common/2022/07/TrafficPolicy" xmlns:etsi280="http://uri.etsi.org/03280/common/2017/07" xmlns:task="http://uri.etsi.org/03120/common/2020/09/Task">
    <Header>
        <SenderIdentifier>
            <CountryCode>XX</CountryCode>
@@ -23,41 +23,48 @@
                <ActionRequest>
                    <ActionIdentifier>0</ActionIdentifier>
                    <CREATE>
                        <HI1Object xsi:type="policy:TrafficRuleObject">
                        <HI1Object xsi:type="tp:TrafficRuleObject">
                            <ObjectIdentifier>f69eb93b-a85b-4ff7-abaa-6f3aead286d5</ObjectIdentifier>
                            <CountryCode>XX</CountryCode>
                            <OwnerIdentifier>ACTOR01</OwnerIdentifier>
                            <policy:Criteria>
                                <policy:Criteria>
                                    <policy:IPPolicyCriteria>
                                        <policy:SourceIPRange>
                                            <etsi:IPv4CIDR>203.0.113.0/24</etsi:IPv4CIDR>
                                        </policy:SourceIPRange>
                                    </policy:IPPolicyCriteria>
                                </policy:Criteria>
                            </policy:Criteria>
                            <policy:Action>
                            <tp:Criteria>
                                <tp:Criteria>
                                    <tp:IPPolicyCriteria>
                                        <tp:SourceIPRange>
                                            <etsi280:IPv4CIDR>203.0.113.0/24</etsi280:IPv4CIDR>
                                        </tp:SourceIPRange>
                                    </tp:IPPolicyCriteria>
                                </tp:Criteria>
                                <tp:Criteria>
                                    <tp:IPPolicyCriteria>
                                        <tp:SourceIPRange>
                                            <etsi280:IPv4CIDR>203.0.113.0/24</etsi280:IPv4CIDR>
                                        </tp:SourceIPRange>
                                    </tp:IPPolicyCriteria>
                                </tp:Criteria>
                            </tp:Criteria>
                            <tp:Action>
                                <common:Owner>ETSI</common:Owner>
                                <common:Name>PolicyAction</common:Name>
                                <common:Value>PDSR</common:Value>
                            </policy:Action>
                            </tp:Action>
                        </HI1Object>
                    </CREATE>
                </ActionRequest>
                <ActionRequest>
                    <ActionIdentifier>1</ActionIdentifier>
                    <CREATE>
                        <HI1Object xsi:type="policy:TrafficPolicyObject">
                        <HI1Object xsi:type="tp:TrafficPolicyObject">
                            <ObjectIdentifier>55e25c0a-787b-4049-b7fb-518a13a9483b</ObjectIdentifier>
                            <CountryCode>XX</CountryCode>
                            <OwnerIdentifier>ACTOR01</OwnerIdentifier>
                            <policy:TrafficPolicyName>Template Rule 1</policy:TrafficPolicyName>
                            <policy:TrafficRules>
                                <policy:TrafficRuleReference>
                                    <policy:Order>1</policy:Order>
                                    <policy:ObjectIdentifier>f69eb93b-a85b-4ff7-abaa-6f3aead286d5</policy:ObjectIdentifier>
                                </policy:TrafficRuleReference>
                            </policy:TrafficRules>
                            <tp:TrafficPolicyName>Template Rule 1</tp:TrafficPolicyName>
                            <tp:TrafficRules>
                                <tp:TrafficRuleReference>
                                    <tp:Order>1</tp:Order>
                                    <tp:ObjectIdentifier>f69eb93b-a85b-4ff7-abaa-6f3aead286d5</tp:ObjectIdentifier>
                                </tp:TrafficRuleReference>
                            </tp:TrafficRules>
                        </HI1Object>
                    </CREATE>
                </ActionRequest>
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@
    },
    "IPv4CIDR": {
      "type": "string",
      "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$"
      "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\/([1-2]?[0-9]|3[0-2])$"
    },
    "IPv6Address": {
      "type": "string",
+23 −2
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ coerce_to_int = [
    'task:Order',
    'ErrorCode',
    'Generation',
    'tp:Order'
]

coerce_to_bool = [
@@ -115,6 +116,20 @@ def postprocessor (path, key, value):
            return key, {}
    return key, value

def recursively_fix_tpcriteria (d: dict):
    if isinstance(d, dict):
        if ("tp:Criteria" in d
            and isinstance(d["tp:Criteria"], list)
            and len(d["tp:Criteria"]) == 1
            ):
                d["tp:Criteria"] =  d["tp:Criteria"][0]
        else:
            for k,v in d.items():
                recursively_fix_tpcriteria(v)
    elif isinstance(d, list):
        for d_item in d:
            recursively_fix_tpcriteria(d_item)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--verbose', action='count', help='Verbose logging (can be specified multiple times)')
@@ -141,4 +156,10 @@ if __name__ == "__main__":
                        postprocessor=postprocessor
                        )['HI1Message']

    print(json.dumps(d, indent=2))
    # HACK
    # Needed because TrafficPolicy.xsd has two nested fields both called tp:Criteria
    # but only the outer one needs to be coerced into a list
    recursively_fix_tpcriteria(d)
    out_str = json.dumps(d, indent=2)

    print(out_str)