summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDiego Alves <diego.oborba@gmail.com>2016-08-18 15:26:52 -0300
committerDiego Alves <diego.oborba@gmail.com>2016-08-19 11:57:57 -0300
commitdd0e9ed5ec3c1c78bc018511d2c87b3ae360bbf5 (patch)
tree2c6b92162a31c68ce3ada264079d17604652867d /lib
parentdelete zone on powerDns (diff)
parentWIP (diff)
Merge branch 'WIP' into delete_zone
Conflicts: lib/powerdnsex/managers/records_manager.ex lib/powerdnsex/managers/zones_manager.ex lib/powerdnsex/models/record.ex lib/powerdnsex/models/resource_record_set.ex lib/powerdnsx.ex test/lib/powerdnsex/managers/records_manager_test.exs test/lib/powerdnsex/managers/zones_manager_test.exs
Diffstat (limited to 'lib')
-rw-r--r--lib/powerdnsex.ex (renamed from lib/powerdnsx.ex)0
-rw-r--r--lib/powerdnsex/managers/records_manager.ex10
-rw-r--r--lib/powerdnsex/managers/zones_manager.ex2
-rw-r--r--lib/powerdnsex/models/record.ex24
-rw-r--r--lib/powerdnsex/models/resource_record_set.ex32
5 files changed, 56 insertions, 12 deletions
diff --git a/lib/powerdnsx.ex b/lib/powerdnsex.ex
index c82aa59..c82aa59 100644
--- a/lib/powerdnsx.ex
+++ b/lib/powerdnsex.ex
diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex
index 7d580b2..f9e71e1 100644
--- a/lib/powerdnsex/managers/records_manager.ex
+++ b/lib/powerdnsex/managers/records_manager.ex
@@ -9,14 +9,18 @@ defmodule PowerDNSex.RecordsManager do
raise "[Records Manager] Zone URL attribute is empty!"
end
- def create(%Zone{} = zone, %{} = rrset) do
- rrset = %{rrset | changetype: "REPLACE"}
+ def create(%Zone{} = zone, %{} = rrset_attrs) do
+ rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"})
zone.url
- |> HttpClient.patch!(rrset.as_body(rrset))
+ |> HttpClient.patch!(RRset.as_body(RRset.build(rrset_attrs)))
|> process_request_response
end
+ def update(%Zone{} = zone, %{} = rrset_attrs) do
+ create(zone, rrset_attrs)
+ end
+
###
# Private
##
diff --git a/lib/powerdnsex/managers/zones_manager.ex b/lib/powerdnsex/managers/zones_manager.ex
index 9561be6..ebad7fe 100644
--- a/lib/powerdnsex/managers/zones_manager.ex
+++ b/lib/powerdnsex/managers/zones_manager.ex
@@ -26,6 +26,7 @@ defmodule PowerDNSex.ZonesManager do
server_name
|> zone_path(zone_name)
|> HttpClient.delete!
+ |> process_request_response
end
###
@@ -42,6 +43,7 @@ defmodule PowerDNSex.ZonesManager do
defp process_request_response(%Response{body: body, status_code: status}) do
case status do
+ s when s == 204 -> :ok
s when s < 300 ->
body |> Poison.decode!(as: %Zone{rrsets: [
%ResourceRecordSet{
diff --git a/lib/powerdnsex/models/record.ex b/lib/powerdnsex/models/record.ex
index 82dca74..57378fc 100644
--- a/lib/powerdnsex/models/record.ex
+++ b/lib/powerdnsex/models/record.ex
@@ -1,9 +1,27 @@
defmodule PowerDNSex.Models.Record do
defstruct [:content, :disabled]
+ def build(attrs) when is_list(attrs) do
+ Enum.reduce(attrs, [], &(&2 ++ [build(&1)]))
+ end
+
+ def build(attrs) when is_tuple(attrs) do
+ %__MODULE__{content: elem(attrs, 0), disabled: elem(attrs, 1)}
+ end
+
+ def build(attrs) when is_map(attrs) do
+ %__MODULE__{content: attrs.content, disabled: attrs.disabled}
+ end
+
def as_body(content) when is_list(content) do
- Enum.reduce(content, [], fn({value, status}, records) ->
- records ++ [%__MODULE__{ content: value, disabled: status }]
- end)
+ Enum.reduce(content, [], &(&2 ++ [as_body(&1)]))
+ end
+
+ def as_body(%__MODULE__{} = record_attrs) do
+ Map.from_struct(record_attrs)
+ end
+
+ def as_body(record_attrs) when is_tuple(record_attrs) do
+ %{content: elem(record_attrs, 0), disabled: elem(record_attrs, 1)}
end
end
diff --git a/lib/powerdnsex/models/resource_record_set.ex b/lib/powerdnsex/models/resource_record_set.ex
index a3bca8d..f4338a2 100644
--- a/lib/powerdnsex/models/resource_record_set.ex
+++ b/lib/powerdnsex/models/resource_record_set.ex
@@ -4,17 +4,37 @@ defmodule PowerDNSex.Models.ResourceRecordSet do
defstruct [:name, :type, :ttl, :records, :changetype]
- def as_body(%__MODULE__{} = record) do
+ def build(rrset_attrs) when is_map(rrset_attrs) do
+ rrset = %__MODULE__{}
+
+ rrset
+ |> Map.keys
+ |> Enum.reduce(rrset, &(set_attrs(&2, &1, rrset_attrs)))
+ end
+
+ def as_body(%__MODULE__{} = rrset) do
%{ rrsets: [
%{
- name: record.name,
- type: record.type,
- ttl: record.ttl,
- changetype: record.changetype,
- records: Record.as_body(record.content)
+ name: rrset.name,
+ type: rrset.type,
+ ttl: rrset.ttl,
+ changetype: rrset.changetype,
+ records: Record.as_body(rrset.records)
}
]}
|> Poison.encode!
end
+ defp set_attrs(rrset, attr_name, attrs) do
+ if Map.has_key?(attrs, attr_name) do
+ attr_value = case attr_name do
+ :records -> Record.build(Map.fetch!(attrs, attr_name))
+ _ -> Map.fetch!(attrs, attr_name)
+ end
+
+ %{ rrset | attr_name => attr_value }
+ else
+ rrset
+ end
+ end
end