diff options
author | Tiago Freire <code.tiago.frire@locaweb.com.br> | 2016-08-19 19:12:42 -0300 |
---|---|---|
committer | Tiago Freire <code.tiago.frire@locaweb.com.br> | 2016-08-19 19:12:42 -0300 |
commit | c7a91a55983b3a3de4f66b9c312170540c2a77cc (patch) | |
tree | f1b114e68dc3d27aa93a9bf86939ea5b9945afa6 | |
parent | Merge pull request #3 from akaKuruma/delete_zone (diff) |
Add Delete Record feature
-rw-r--r-- | lib/powerdnsex/managers/records_manager.ex | 26 | ||||
-rw-r--r-- | lib/powerdnsex/models/record.ex | 2 | ||||
-rw-r--r-- | test/lib/powerdnsex/managers/records_manager_test.exs | 14 | ||||
-rw-r--r-- | test/support/cassettes/records_manager/delete/success.json | 30 |
4 files changed, 64 insertions, 8 deletions
diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex index f9e71e1..7ac83ca 100644 --- a/lib/powerdnsex/managers/records_manager.ex +++ b/lib/powerdnsex/managers/records_manager.ex @@ -5,20 +5,20 @@ defmodule PowerDNSex.RecordsManager do alias PowerDNSex.Models.ResourceRecordSet, as: RRset alias HTTPoison.Response - def create(%Zone{url: nil}, _) do - raise "[Records Manager] Zone URL attribute is empty!" - end def create(%Zone{} = zone, %{} = rrset_attrs) do rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"}) - - zone.url - |> HttpClient.patch!(RRset.as_body(RRset.build(rrset_attrs))) - |> process_request_response + patch(zone, rrset_attrs) end def update(%Zone{} = zone, %{} = rrset_attrs) do - create(zone, rrset_attrs) + rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"}) + patch(zone, rrset_attrs) + end + + def delete(%Zone{} = zone, %{} = rrset_attrs) do + rrset_attrs = Map.merge(rrset_attrs, %{changetype: "DELETE"}) + patch(zone, rrset_attrs) end ### @@ -31,4 +31,14 @@ defmodule PowerDNSex.RecordsManager do s when s >= 300 -> body |> Poison.decode!(as: %Error{}) end end + + defp patch(%Zone{url: nil}, _) do + raise "[Records Manager] Zone URL attribute is empty!" + end + + defp patch(%Zone{} = zone, %{} = rrset_attrs) do + zone.url + |> HttpClient.patch!(RRset.as_body(RRset.build(rrset_attrs))) + |> process_request_response + end end diff --git a/lib/powerdnsex/models/record.ex b/lib/powerdnsex/models/record.ex index 57378fc..a494a07 100644 --- a/lib/powerdnsex/models/record.ex +++ b/lib/powerdnsex/models/record.ex @@ -13,6 +13,8 @@ defmodule PowerDNSex.Models.Record do %__MODULE__{content: attrs.content, disabled: attrs.disabled} end + def as_body(nil), do: [] + def as_body(content) when is_list(content) do Enum.reduce(content, [], &(&2 ++ [as_body(&1)])) end diff --git a/test/lib/powerdnsex/managers/records_manager_test.exs b/test/lib/powerdnsex/managers/records_manager_test.exs index 5f314bd..aa054c2 100644 --- a/test/lib/powerdnsex/managers/records_manager_test.exs +++ b/test/lib/powerdnsex/managers/records_manager_test.exs @@ -25,6 +25,11 @@ defmodule PowerDNSex.RecordsManagerTest do records: [{"127.0.0.1", true}] } + @record_to_delete %{ + name: "record-to-delete.my-domain.art.", + type: "A", + } + @invalid_record %{ name: "updated-record.my-domain.art.", type: "NS", @@ -102,4 +107,13 @@ defmodule PowerDNSex.RecordsManagerTest do end end end + + describe "delete/2" do + @tag :records_manager_update + test "the return given a correct record" do + use_cassette "records_manager/delete/success" do + assert RecordsManager.delete(@valid_zone, @record_to_delete) == :ok + end + end + end end diff --git a/test/support/cassettes/records_manager/delete/success.json b/test/support/cassettes/records_manager/delete/success.json new file mode 100644 index 0000000..fccb1ad --- /dev/null +++ b/test/support/cassettes/records_manager/delete/success.json @@ -0,0 +1,30 @@ +[ + { + "request": { + "body": "{\"rrsets\":[{\"type\":\"A\",\"ttl\":null,\"records\":[],\"name\":\"record-to-delete.my-domain.art.\",\"changetype\":\"DELETE\"}]}", + "headers": { + "X-API-Key": "Locaweb2016" + }, + "method": "patch", + "options": [], + "request_body": "", + "url": "http://cpro36999.systemintegration.locaweb.com.br/api/v1/servers/localhost/zones/my-domain.art." + }, + "response": { + "body": "", + "headers": { + "Access-Control-Allow-Origin": "*", + "Connection": "close", + "Content-Length": "0", + "Content-Security-Policy": "default-src 'self'; style-src 'self' 'unsafe-inline'", + "Server": "PowerDNS/4.0.1", + "X-Content-Type-Options": "nosniff", + "X-Frame-Options": "deny", + "X-Permitted-Cross-Domain-Policies": "none", + "X-Xss-Protection": "1; mode=block" + }, + "status_code": 204, + "type": "ok" + } + } +]
\ No newline at end of file |