summaryrefslogtreecommitdiff
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
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
-rw-r--r--README.md8
-rw-r--r--config/config.exs4
-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
-rw-r--r--mix.exs2
-rw-r--r--test/lib/powerdnsex/managers/records_manager_test.exs40
-rw-r--r--test/lib/powerdnsex/managers/zones_manager_test.exs15
-rw-r--r--test/support/cassettes/records_manager/update/success.json30
11 files changed, 129 insertions, 38 deletions
diff --git a/README.md b/README.md
index 078e244..18dee79 100644
--- a/README.md
+++ b/README.md
@@ -6,19 +6,19 @@
If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:
- 1. Add `powerdnsx` to your list of dependencies in `mix.exs`:
+ 1. Add `powerdnsex` to your list of dependencies in `mix.exs`:
```elixir
def deps do
- [{:powerdnsx, "~> 0.1.0"}]
+ [{:powerdnsex, "~> 0.1.0"}]
end
```
- 2. Ensure `powerdnsx` is started before your application:
+ 2. Ensure `powerdnsex` is started before your application:
```elixir
def application do
- [applications: [:powerdnsx]]
+ [applications: [:powerdnsex]]
end
```
diff --git a/config/config.exs b/config/config.exs
index 2272984..4f2b23f 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -10,11 +10,11 @@ use Mix.Config
# You can configure for your application as:
#
-# config :powerdnsx, key: :value
+# config :powerdnsex, key: :value
#
# And access this configuration in your application as:
#
-# Application.get_env(:powerdnsx, :key)
+# Application.get_env(:powerdnsex, :key)
#
# Or configure a 3rd-party app:
#
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
diff --git a/mix.exs b/mix.exs
index e10171f..88dc757 100644
--- a/mix.exs
+++ b/mix.exs
@@ -2,7 +2,7 @@ defmodule PowerDNSex.Mixfile do
use Mix.Project
def project do
- [app: :powerdnsx,
+ [app: :powerdnsex,
version: "0.1.0",
elixir: "~> 1.3",
build_embedded: Mix.env == :prod,
diff --git a/test/lib/powerdnsex/managers/records_manager_test.exs b/test/lib/powerdnsex/managers/records_manager_test.exs
index e4b2579..3b91fc2 100644
--- a/test/lib/powerdnsex/managers/records_manager_test.exs
+++ b/test/lib/powerdnsex/managers/records_manager_test.exs
@@ -9,14 +9,21 @@ defmodule PowerDNSex.RecordsManagerTest do
@valid_zone %Zone{name: "my-domain.art.",
url: "api/v1/servers/localhost/zones/my-domain.art."}
@new_record %{
- name: "new-record.my-domain.art.",
- type: "A",
- ttl: 86400,
- content: [
- {"127.0.0.1", false},
- {"192.168.0.1", true}
- ]
- }
+ name: "new-record.my-domain.art.",
+ type: "A",
+ ttl: 86400,
+ records: [
+ {"127.0.0.1", false},
+ {"192.168.0.1", true}
+ ]
+ }
+
+ @updated_record %{
+ name: "updated-record.my-domain.art.",
+ type: "A",
+ ttl: 86800,
+ records: [{"127.0.0.1", true}]
+ }
setup do
# Config.set_url
@@ -33,7 +40,7 @@ defmodule PowerDNSex.RecordsManagerTest do
HTTPoison.start
end
- describe "create{%Zone{}, %Record{}}" do
+ describe "create/2" do
test "exception given empty zones url" do
raise_msg = "[Records Manager] Zone URL attribute is empty!"
assert_raise RuntimeError, raise_msg, fn() ->
@@ -48,4 +55,19 @@ defmodule PowerDNSex.RecordsManagerTest do
end
end
+ describe "update/2" do
+ @tag :records_manager_update
+ test "exception given empty zones url" do
+ raise_msg = "[Records Manager] Zone URL attribute is empty!"
+ assert_raise RuntimeError, raise_msg, fn() ->
+ RecordsManager.update(%Zone{}, %Record{})
+ end
+ end
+
+ test "the return given correct params" do
+ use_cassette "records_manager/update/success" do
+ assert RecordsManager.update(@valid_zone, @updated_record) == :ok
+ end
+ end
+ end
end
diff --git a/test/lib/powerdnsex/managers/zones_manager_test.exs b/test/lib/powerdnsex/managers/zones_manager_test.exs
index 11571f3..2e88c70 100644
--- a/test/lib/powerdnsex/managers/zones_manager_test.exs
+++ b/test/lib/powerdnsex/managers/zones_manager_test.exs
@@ -17,13 +17,11 @@ defmodule PowerDNSex.ZonesManagerTest do
@expected_rrset [
%RRSet{
- name: "my-domain.tst.",
+ name: "my-domain.art.",
ttl: 3600,
type: "SOA",
records: [
- %Record{content: "ns2.my-powerdns.api", disabled: false},
- %Record{content: "ns1.my-powerdns.api", disabled: false},
- %Record{content: "a.misconfigured.powerdns.server " <>
+ %Record{content: "a.misconfigured.powerdns.server. " <>
"hostmaster.my-domain.art. " <>
"2016060601 10800 3600 604800 3600",
disabled: false}
@@ -106,18 +104,15 @@ defmodule PowerDNSex.ZonesManagerTest do
@tag :zones_manager_delete
test "return given correct params" do
use_cassette "zones_manager/delete/success" do
- req_status = ZonesManager.delete("success-delete.com").status_code
- assert req_status == 204
+ assert ZonesManager.delete("success-delete.com") == :ok
end
end
@tag :zones_manager_delete
test "return error when zone don't exists" do
use_cassette "zones_manager/delete/not_found" do
- req = ZonesManager.delete("not_found.com")
- assert req.status_code == 422
- assert req.body ==
- "{\"error\": \"Could not find domain 'not_found.com.'\"}"
+ response = ZonesManager.delete("not_found.com")
+ assert response.error == "Could not find domain 'not_found.com.'"
end
end
end
diff --git a/test/support/cassettes/records_manager/update/success.json b/test/support/cassettes/records_manager/update/success.json
new file mode 100644
index 0000000..d6a5112
--- /dev/null
+++ b/test/support/cassettes/records_manager/update/success.json
@@ -0,0 +1,30 @@
+[
+ {
+ "request": {
+ "body": "{\"rrsets\":[{\"type\":\"A\",\"ttl\":86800,\"records\":[{\"disabled\":true,\"content\":\"127.0.0.1\"}],\"name\":\"updated-record.my-domain.art.\",\"changetype\":\"REPLACE\"}]}",
+ "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