diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c8fc51..6d71715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,4 @@ +* ENHANCEMENT + * make `ttl` mandatory for add function * BUGFIX - * fix passed variable basic auth to fix broken env variables + * update (delete + create) records with different `ttl` to prevent duplicate entries diff --git a/corenetworks/client.py b/corenetworks/client.py index 7d8b0e3..63eace0 100644 --- a/corenetworks/client.py +++ b/corenetworks/client.py @@ -202,9 +202,25 @@ class CoreNetworks(): """ schema = copy.deepcopy(self._schema) - schema["required"] = ["name", "type", "data"] + schema["required"] = ["name", "type", "data", "ttl"] self.__validate(params, schema) + curr = copy.deepcopy(params) + curr.pop("ttl") + + records = self.records(zone, curr) + if len(records) > 1: + raise CorenetworksError( + "More than one record already exists for the given attributes. " + "That should be impossible, please open an issue!" + ) + + # delete existing record with different ttl for a fake update + for r in records: + r["ttl"] = int(r["ttl"]) + if r["ttl"] != params["ttl"]: + self._delete_record_raw(zone, params=r) + self.__rest_helper( "/dnszones/{zone}/records/".format(zone=zone), data=params, method="POST" ) @@ -216,6 +232,13 @@ class CoreNetworks(): return self.__normalize(result) + def _delete_record_raw(self, zone, params): + r = self.__rest_helper( + "/dnszones/{zone}/records/delete".format(zone=zone), data=params, method="POST" + ) + + return r + def delete_record(self, zone, params): """ Delete all DNS records of a zone that match the data. @@ -245,9 +268,7 @@ class CoreNetworks(): if params.get("force_all"): params = {} - result = self.__rest_helper( - "/dnszones/{zone}/records/delete".format(zone=zone), data=params, method="POST" - ) + result = self._delete_record_raw(zone, params) if self.config["auto_commit"]: self.commit(zone=zone)