summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Freire <code.tiago.frire@locaweb.com.br>2016-08-19 19:12:42 -0300
committerTiago Freire <code.tiago.frire@locaweb.com.br>2016-08-19 19:12:42 -0300
commitc7a91a55983b3a3de4f66b9c312170540c2a77cc (patch)
treef1b114e68dc3d27aa93a9bf86939ea5b9945afa6
parentMerge pull request #3 from akaKuruma/delete_zone (diff)
Add Delete Record feature
-rw-r--r--lib/powerdnsex/managers/records_manager.ex26
-rw-r--r--lib/powerdnsex/models/record.ex2
-rw-r--r--test/lib/powerdnsex/managers/records_manager_test.exs14
-rw-r--r--test/support/cassettes/records_manager/delete/success.json30
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