octodns / octodns-constellix

Constellix DNS provider for octoDNS
MIT License
1 stars 4 forks source link

Missing rule ordering leads to change for every run #32

Closed istr closed 1 year ago

istr commented 1 year ago

With the following dynamic record, every run will trigger a (no-op) change.

cdn-dev:
  - dynamic:
      pools:
        af:
          values:
            - status: up
              value: 68.70.192.128
        apac:
          values:
            - status: up
              value: 89.187.160.25
        eu:
          values:
            - status: up
              value: 185.172.148.128
            - status: up
              value: 185.172.148.132
        eu_E:
          values:
            - status: up
              value: 137.74.0.47
        eu_S:
          values:
            - status: up
              value: 94.126.16.223
        eu_SW:
          values:
            - status: up
              value: 82.102.17.19
        eu_fr:
          values:
            - status: up
              value: 62.210.90.237
        eu_nl:
          values:
            - status: up
              value: 185.172.149.128
            - status: up
              value: 185.172.149.132
        eu_uk:
          values:
            - status: up
              value: 68.70.192.128
        na:
          values:
            - status: up
              value: 138.199.57.66
            - status: up
              value: 138.199.57.67
        ocean:
          values:
            - status: up
              value: 103.231.91.78
        sa:
          values:
            - status: up
              value: 103.50.33.23
      rules:
        - geos:
            - EU-UA
            - EU-PL
            - EU-RU
            - EU-LT
            - EU-LV
            - EU-EE
          pool: eu_E
        - geos:
            - EU-CH
            - EU-IT
            - EU-MC
          pool: eu_S
        - geos:
            - EU-AD
            - EU-ES
            - EU-PT
          pool: eu_SW
        - geos:
          - EU-FR
          pool: eu_fr
        - geos:
          - EU-NL
          pool: eu_nl
        - geos:
            - EU-GB
          pool: eu_uk
        - geos:
            - NA
          pool: na
        - geos:
            - OC
          pool: ocean
        - geos:
            - SA
          pool: sa
        - geos:
            - AF
          pool: af
        - geos:
            - AS
          pool: apac
        - pool: eu  # catchall - no geos
    ttl: 60
    type: A
    values:
      - 185.172.148.128
      - 185.172.148.132

The diff is only in the order of the rules:

2023-09-16T20:36:50  [140492986421312] INFO  Plan 
********************************************************************************
* ingo-struck.com.
********************************************************************************
* constellix (ConstellixProvider)
*   Update
*     <ARecord A 60, cdn-dev.ingo-struck.com., ['185.172.148.128', '185.172.148.132'], {'af': {'fallback': None, 'values': [{'value': '68.70.192.128', 'weight': 1, 'status': 'obey'}]}, 'apac': {'fallback': None, 'values': [{'value': '89.187.160.25', 'weight': 1, 'status': 'obey'}]}, 'eu': {'fallback': None, 'values': [{'value': '185.172.148.128', 'weight': 1, 'status': 'obey'}, {'value': '185.172.148.132', 'weight': 1, 'status': 'obey'}]}, 'eu_E': {'fallback': None, 'values': [{'value': '137.74.0.47', 'weight': 1, 'status': 'obey'}]}, 'eu_S': {'fallback': None, 'values': [{'value': '94.126.16.223', 'weight': 1, 'status': 'obey'}]}, 'eu_SW': {'fallback': None, 'values': [{'value': '82.102.17.19', 'weight': 1, 'status': 'obey'}]}, 'eu_fr': {'fallback': None, 'values': [{'value': '62.210.90.237', 'weight': 1, 'status': 'obey'}]}, 'eu_nl': {'fallback': None, 'values': [{'value': '185.172.149.128', 'weight': 1, 'status': 'obey'}, {'value': '185.172.149.132', 'weight': 1, 'status': 'obey'}]}, 'eu_uk': {'fallback': None, 'values': [{'value': '68.70.192.128', 'weight': 1, 'status': 'obey'}]}, 'na': {'fallback': None, 'values': [{'value': '138.199.57.66', 'weight': 1, 'status': 'obey'}, {'value': '138.199.57.67', 'weight': 1, 'status': 'obey'}]}, 'ocean': {'fallback': None, 'values': [{'value': '103.231.91.78', 'weight': 1, 'status': 'obey'}]}, 'sa': {'fallback': None, 'values': [{'value': '103.50.33.23', 'weight': 1, 'status': 'obey'}]}}, [{'pool': 'af', 'geos': ['AF']}, {'pool': 'apac', 'geos': ['AS']}, {'pool': 'eu'}, {'pool': 'eu_E', 'geos': ['EU-EE', 'EU-LT', 'EU-LV', 'EU-PL', 'EU-RU', 'EU-UA']}, {'pool': 'eu_S', 'geos': ['EU-CH', 'EU-IT', 'EU-MC']}, {'pool': 'eu_SW', 'geos': ['EU-AD', 'EU-ES', 'EU-PT']}, {'pool': 'eu_fr', 'geos': ['EU-FR']}, {'pool': 'eu_nl', 'geos': ['EU-NL']}, {'pool': 'eu_uk', 'geos': ['EU-GB']}, {'pool': 'na', 'geos': ['NA']}, {'pool': 'ocean', 'geos': ['OC']}, {'pool': 'sa', 'geos': ['SA']}]> ->
*     <ARecord A 60, cdn-dev.ingo-struck.com., ['185.172.148.128', '185.172.148.132'], {'af': {'fallback': None, 'values': [{'value': '68.70.192.128', 'weight': 1, 'status': 'obey'}]}, 'apac': {'fallback': None, 'values': [{'value': '89.187.160.25', 'weight': 1, 'status': 'obey'}]}, 'eu': {'fallback': None, 'values': [{'value': '185.172.148.128', 'weight': 1, 'status': 'obey'}, {'value': '185.172.148.132', 'weight': 1, 'status': 'obey'}]}, 'eu_E': {'fallback': None, 'values': [{'value': '137.74.0.47', 'weight': 1, 'status': 'obey'}]}, 'eu_S': {'fallback': None, 'values': [{'value': '94.126.16.223', 'weight': 1, 'status': 'obey'}]}, 'eu_SW': {'fallback': None, 'values': [{'value': '82.102.17.19', 'weight': 1, 'status': 'obey'}]}, 'eu_fr': {'fallback': None, 'values': [{'value': '62.210.90.237', 'weight': 1, 'status': 'obey'}]}, 'eu_nl': {'fallback': None, 'values': [{'value': '185.172.149.128', 'weight': 1, 'status': 'obey'}, {'value': '185.172.149.132', 'weight': 1, 'status': 'obey'}]}, 'eu_uk': {'fallback': None, 'values': [{'value': '68.70.192.128', 'weight': 1, 'status': 'obey'}]}, 'na': {'fallback': None, 'values': [{'value': '138.199.57.66', 'weight': 1, 'status': 'obey'}, {'value': '138.199.57.67', 'weight': 1, 'status': 'obey'}]}, 'ocean': {'fallback': None, 'values': [{'value': '103.231.91.78', 'weight': 1, 'status': 'obey'}]}, 'sa': {'fallback': None, 'values': [{'value': '103.50.33.23', 'weight': 1, 'status': 'obey'}]}}, [{'pool': 'eu_E', 'geos': ['EU-EE', 'EU-LT', 'EU-LV', 'EU-PL', 'EU-RU', 'EU-UA']}, {'pool': 'eu_S', 'geos': ['EU-CH', 'EU-IT', 'EU-MC']}, {'pool': 'eu_SW', 'geos': ['EU-AD', 'EU-ES', 'EU-PT']}, {'pool': 'eu_fr', 'geos': ['EU-FR']}, {'pool': 'eu_nl', 'geos': ['EU-NL']}, {'pool': 'eu_uk', 'geos': ['EU-GB']}, {'pool': 'na', 'geos': ['NA']}, {'pool': 'ocean', 'geos': ['OC']}, {'pool': 'sa', 'geos': ['SA']}, {'pool': 'af', 'geos': ['AF']}, {'pool': 'apac', 'geos': ['AS']}, {'pool': 'eu'}]> (config)
*   Summary: Creates=0, Updates=1, Deletes=0, Existing Records=45
********************************************************************************

This is due to missing order information for the rules. They are sorted by pool name when fetched from constellix.