diff options
author | Ricardo Hermida Ruiz <ricardo.ruiz@locaweb.com.br> | 2021-02-11 14:35:27 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-11 14:35:27 -0300 |
commit | 9de84ccb4e65cd7e71485f6c479e48902bde8aed (patch) | |
tree | 8d699e133ec46a099306884c39e5cb3f3c2666d1 | |
parent | Initialize poolboy app (diff) | |
parent | Fix zone path light (diff) |
Merge pull request #17 from daviluis321/zone_whithout_rrset
Add zone without rrset
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | lib/powerdnsex.ex | 18 | ||||
-rw-r--r-- | lib/powerdnsex/gen_server/server.ex | 9 | ||||
-rw-r--r-- | lib/powerdnsex/http_client.ex | 3 | ||||
-rw-r--r-- | lib/powerdnsex/managers/records_manager.ex | 4 | ||||
-rw-r--r-- | lib/powerdnsex/managers/zones_manager.ex | 12 | ||||
-rw-r--r-- | test/lib/powerdnsex/config_test.exs | 5 | ||||
-rw-r--r-- | test/lib/powerdnsex/managers/zones_manager_test.exs | 10 | ||||
-rw-r--r-- | test/support/cassettes/zones_manager/get_zone/success.json | 28 | ||||
-rw-r--r-- | test/support/fake_config.exs | 1 |
10 files changed, 87 insertions, 6 deletions
@@ -56,6 +56,9 @@ zone_model = %PowerDNSex.Models.Zone{ # SHOW ZONE: {:ok, zone} = PowerDNSex.show_zone("example.com") +# SHOW ZONE without RRSets: +{:ok, zone} = PowerDNSex.get_zone("example.com") + # DELETE ZONE: res = PowerDNSex.delete_zone("example.com") ``` diff --git a/lib/powerdnsex.ex b/lib/powerdnsex.ex index b77389c..cc6db9e 100644 --- a/lib/powerdnsex.ex +++ b/lib/powerdnsex.ex @@ -48,6 +48,14 @@ defmodule PowerDNSex do call({:show_zone, zone, server_name}) end + @spec get_zone(String.t(), String.t()) :: :ok | {:error, String.t()} + @doc """ + Show / Retrive info of the specific Zone without RRSets + """ + def get_zone(zone, server_name \\ @default_server) when is_binary(zone) do + call({:get_zone, zone, server_name}) + end + @spec delete_zone(String.t(), String.t()) :: :ok | {:error, String.t()} @doc """ Delete specific Zone on PowerDNS @@ -84,6 +92,14 @@ defmodule PowerDNSex do call({:update_record, zone, rrset_attrs}) end + @spec put_record(Zone.t(), struct) :: :ok | {:error, String.t()} + @doc """ + Update Record of the given Zone + """ + def put_record(%Zone{} = zone, %{} = rrset_attrs) do + call({:put_record, zone, rrset_attrs}) + end + @spec delete_record(Zone.t(), struct) :: :ok | {:error, String.t()} @doc """ Delete specific Record of given Zone @@ -107,7 +123,7 @@ defmodule PowerDNSex do defp call(params) do :poolboy.transaction(@name, fn pid -> - GenServer.call(pid, params, Config.powerdns_timeout) + GenServer.call(pid, params, Config.powerdns_timeout()) end) end end diff --git a/lib/powerdnsex/gen_server/server.ex b/lib/powerdnsex/gen_server/server.ex index df8a453..149351b 100644 --- a/lib/powerdnsex/gen_server/server.ex +++ b/lib/powerdnsex/gen_server/server.ex @@ -24,6 +24,10 @@ defmodule PowerDNSex.Server do {:reply, ZonesManager.show(zone, server_name), state} end + def handle_call({:get_zone, zone, server_name}, _from, state) do + {:reply, ZonesManager.get_zone(zone, server_name), state} + end + def handle_call({:delete_zone, zone, server_name}, _from, state) do {:reply, ZonesManager.delete(zone, server_name), state} end @@ -43,6 +47,11 @@ defmodule PowerDNSex.Server do {:reply, RecordsManager.update(zone, attrs), state} end + def handle_call({:put_record, zone, rrset_attrs}, _from, state) do + attrs = Converter.keys_to_atom(rrset_attrs) + {:reply, RecordsManager.put(zone, attrs), state} + end + def handle_call({:delete_record, zone, rrset_attrs}, _from, state) do {:reply, RecordsManager.delete(zone, rrset_attrs), state} end diff --git a/lib/powerdnsex/http_client.ex b/lib/powerdnsex/http_client.ex index 3431795..98e299d 100644 --- a/lib/powerdnsex/http_client.ex +++ b/lib/powerdnsex/http_client.ex @@ -15,8 +15,7 @@ defmodule PowerDNSex.HttpClient do end def process_request_options(options) do - custom_options = [ssl: [{:versions, [:'tlsv1.1']}], recv_timeout: Config.powerdns_timeout()] + custom_options = [ssl: [{:versions, [:"tlsv1.1"]}], recv_timeout: Config.powerdns_timeout()] Keyword.merge(options, custom_options) end - end diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex index f2ef6b5..e377322 100644 --- a/lib/powerdnsex/managers/records_manager.ex +++ b/lib/powerdnsex/managers/records_manager.ex @@ -12,6 +12,10 @@ defmodule PowerDNSex.Managers.RecordsManager do patch(zone, rrset_attrs) end + def put(%Zone{} = zone, %{} = rrset_attrs) do + create(zone, rrset_attrs) + end + def show(zone_name, %{} = rrset_attrs) do case ZonesManager.show(zone_name) do {:ok, zone} -> RRSet.find(zone.rrsets, rrset_attrs) diff --git a/lib/powerdnsex/managers/zones_manager.ex b/lib/powerdnsex/managers/zones_manager.ex index 23bab1d..b1567ef 100644 --- a/lib/powerdnsex/managers/zones_manager.ex +++ b/lib/powerdnsex/managers/zones_manager.ex @@ -20,6 +20,14 @@ defmodule PowerDNSex.Managers.ZonesManager do |> process_request_response end + def get(zone_name, server_name \\ @default_server) + when is_bitstring(zone_name) do + server_name + |> zone_path_light(zone_name) + |> HttpClient.get!() + |> process_request_response + end + def delete(zone_name, server_name \\ @default_server) when is_bitstring(zone_name) do server_name @@ -40,6 +48,10 @@ defmodule PowerDNSex.Managers.ZonesManager do zone_path(server_name) <> "/#{zone_name}" end + defp zone_path_light(server_name, zone_name) when is_bitstring(server_name) do + "api/v1/servers/#{server_name}/zones/#{zone_name}?rrsets=false" + end + defp process_request_response(%Response{body: body, status_code: status}) do case status do s when s == 204 -> diff --git a/test/lib/powerdnsex/config_test.exs b/test/lib/powerdnsex/config_test.exs index c8649ae..394d97c 100644 --- a/test/lib/powerdnsex/config_test.exs +++ b/test/lib/powerdnsex/config_test.exs @@ -67,9 +67,10 @@ defmodule PowerDNSex.ConfigTest do @tag :configs test "uses default timeout" do existing = Application.get_env(:powerdnsex, :timeout) - on_exit fn -> + + on_exit(fn -> Application.put_env(:powerdnsex, :timeout, existing) - end + end) Application.delete_env(:powerdnsex, :timeout) diff --git a/test/lib/powerdnsex/managers/zones_manager_test.exs b/test/lib/powerdnsex/managers/zones_manager_test.exs index 1b4982e..e2ae2d8 100644 --- a/test/lib/powerdnsex/managers/zones_manager_test.exs +++ b/test/lib/powerdnsex/managers/zones_manager_test.exs @@ -86,6 +86,16 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do end end + describe "ZonesManager.get_zone/1" do + @tag :zones_manager_get_zone + test "type of return given a correct zone name" do + use_cassette "zones_manager/show/success" do + {:ok, zone} = ZonesManager.get_zone(@valid_zone_test.name) + assert zone == @expected_zone + end + end + end + describe "ZonesManager.show/2" do @tag :zones_manager_show test "type of return given a correct zone name" do diff --git a/test/support/cassettes/zones_manager/get_zone/success.json b/test/support/cassettes/zones_manager/get_zone/success.json new file mode 100644 index 0000000..a6ca219 --- /dev/null +++ b/test/support/cassettes/zones_manager/get_zone/success.json @@ -0,0 +1,28 @@ +[ + { + "request": { + "body": "", + "headers": { + "X-API-Key": "S3cr37_70k3n" + }, + "method": "get", + "options": { + "ssl_options": { + "versions": [ + "tlsv1.1" + ] + }, + "recv_timeout": 300000 + }, + "request_body": "", + "url": "https://my-powerdns.api/api/v1/servers/localhost/zones/my-domain.art." + }, + "response": { + "binary": false, + "body": "nxdomain", + "headers": [], + "status_code": null, + "type": "error" + } + } +]
\ No newline at end of file diff --git a/test/support/fake_config.exs b/test/support/fake_config.exs index e05db22..80912e1 100644 --- a/test/support/fake_config.exs +++ b/test/support/fake_config.exs @@ -7,7 +7,6 @@ defmodule PowerDNSex.FakeConfig do def set_token, do: Application.put_env(:powerdnsex, :token, @app_config_token) def set_timeout, do: Application.put_env(:powerdnsex, :timeout, @app_config_timeout) - def token, do: @app_config_token def url, do: @app_config_url def timeout, do: @app_config_timeout |