def update_record()

in libcloud/dns/drivers/powerdns.py [0:0]


    def update_record(self, record, name, type, data, extra=None):
        """
        Update an existing record.

        :param record: Record to update.
        :type  record: :class:`Record`

        :param name: FQDN of the new record, for example "www.example.com".
        :type  name: ``str``

        :param type: DNS record type (A, AAAA, ...).
        :type  type: :class:`RecordType`

        :param data: Data for the record (depends on the record type).
        :type  data: ``str``

        :param extra: (optional) Extra attributes (driver specific).
        :type  extra: ``dict``

        :rtype: :class:`Record`
        """
        action = "{}/servers/{}/zones/{}".format(
            self.api_root,
            self.ex_server,
            record.zone.id,
        )
        if extra is None or extra.get("ttl", None) is None:
            raise ValueError("PowerDNS requires a ttl value for every record")

        if self._pdns_version() == 3:
            updated_record = {
                "content": data,
                "disabled": False,
                "name": name,
                "ttl": extra["ttl"],
                "type": type,
            }
            payload = {
                "rrsets": [
                    {"name": record.name, "type": record.type, "changetype": "DELETE"},
                    {
                        "name": name,
                        "type": type,
                        "changetype": "REPLACE",
                        "records": [updated_record],
                    },
                ]
            }
        elif self._pdns_version() == 4:
            disabled = False
            if "disabled" in extra:
                disabled = extra["disabled"]
            updated_record = {
                "content": data,
                "disabled": disabled,
                "set-ptr": False,
            }
            payload = {
                "rrsets": [
                    {
                        "name": name,
                        "type": type,
                        "changetype": "REPLACE",
                        "ttl": extra["ttl"],
                        "records": [updated_record],
                    }
                ]
            }

            if "comment" in extra:
                payload["rrsets"][0]["comments"] = extra["comment"]

        try:
            self.connection.request(action=action, data=json.dumps(payload), method="PATCH")
        except BaseHTTPError as e:
            if e.code == httplib.UNPROCESSABLE_ENTITY and e.message.startswith(
                "Could not find domain"
            ):
                raise ZoneDoesNotExistError(zone_id=record.zone.id, driver=self, value=e.message)
            raise e
        return Record(
            id=None,
            name=name,
            data=data,
            type=type,
            zone=record.zone,
            driver=self,
            ttl=extra["ttl"],
        )