diff options
author | Diego Alves <diego.oborba@gmail.com> | 2016-08-18 15:26:52 -0300 |
---|---|---|
committer | Diego Alves <diego.oborba@gmail.com> | 2016-08-19 11:57:57 -0300 |
commit | dd0e9ed5ec3c1c78bc018511d2c87b3ae360bbf5 (patch) | |
tree | 2c6b92162a31c68ce3ada264079d17604652867d | |
parent | delete zone on powerDns (diff) | |
parent | WIP (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.md | 8 | ||||
-rw-r--r-- | config/config.exs | 4 | ||||
-rw-r--r-- | lib/powerdnsex.ex (renamed from lib/powerdnsx.ex) | 0 | ||||
-rw-r--r-- | lib/powerdnsex/managers/records_manager.ex | 10 | ||||
-rw-r--r-- | lib/powerdnsex/managers/zones_manager.ex | 2 | ||||
-rw-r--r-- | lib/powerdnsex/models/record.ex | 24 | ||||
-rw-r--r-- | lib/powerdnsex/models/resource_record_set.ex | 32 | ||||
-rw-r--r-- | mix.exs | 2 | ||||
-rw-r--r-- | test/lib/powerdnsex/managers/records_manager_test.exs | 40 | ||||
-rw-r--r-- | test/lib/powerdnsex/managers/zones_manager_test.exs | 15 | ||||
-rw-r--r-- | test/support/cassettes/records_manager/update/success.json | 30 |
11 files changed, 129 insertions, 38 deletions
@@ -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 @@ -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 |