summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTiago Freire <code.tiago.frire@locaweb.com.br>2016-08-26 19:55:32 -0300
committerTiago Freire <tcfonnet@gmail.com>2016-08-31 00:30:49 -0300
commit8beaa5452ce5245d460815ca1d6752167bdb4fd3 (patch)
tree43e054c46d963c4ca9d725d8dc7c9079e0394551 /lib
parentWIP - Add elixir GenServer (diff)
[WIP] GenServer refactoring
Diffstat (limited to 'lib')
-rw-r--r--lib/powerdnsex.ex71
-rw-r--r--lib/powerdnsex/config.ex2
-rw-r--r--lib/powerdnsex/gen_server/server.ex42
-rw-r--r--lib/powerdnsex/models/error.ex2
-rw-r--r--lib/powerdnsex/models/zone.ex2
-rw-r--r--lib/powerdnsex/server_setup.ex29
6 files changed, 101 insertions, 47 deletions
diff --git a/lib/powerdnsex.ex b/lib/powerdnsex.ex
index 7152417..104bd50 100644
--- a/lib/powerdnsex.ex
+++ b/lib/powerdnsex.ex
@@ -1,47 +1,75 @@
defmodule PowerDNSex do
- @default_server "localhost"
- use PowerDNSex.ServerSetup
+ use Application
+
+ alias PowerDNSex.{Server, Config, Models.Zone, Models.Error}
+
+ @name :PowerDNSex
+
+ def start(_,_), do: start()
+
+ @spec start() :: GenServer.on_start
+ @doc false
+ def start() do
+ import Supervisor.Spec
+
+ children = [worker(Server, [@name])]
+ options = [strategy: :one_for_one, name: :"#{@name}.Supervisor"]
+
+ try do
+ Config.valid?
+
+ case Supervisor.start_link(children, options) do
+ {:ok, pid} -> {:ok, pid}
+ {:error, {:already_started, pid}} -> {:ok, pid}
+ other -> other
+ end
+ rescue
+ error -> {:error, error}
+ end
+ end
- alias PowerDNSex.Managers.{ZonesManager, RecordsManager}
- alias PowerDNSex.Models.Zone
+ @default_server "localhost"
- ###
- # Zones
- ###
+ #########
+ # Zones #
+ #########
- @spec create_zone(Zone.t, String.t) :: :ok | {:error, String.t}
+ @spec create_zone(Zone.t, String.t) :: Zone.t | Error.t
@doc """
Create a new Zone on PowerDNS
"""
def create_zone(%Zone{} = zone, server_name \\ @default_server) do
- ZonesManager.create(zone, server_name)
+ call({:create_zone, zone, server_name})
end
+
@spec show_zone(Zone.t, String.t) :: :ok | {:error, String.t}
@doc """
Show / Retrive info of the specific Zone
"""
def show_zone(%Zone{} = zone, server_name \\ @default_server) do
- ZonesManager.show(zone, server_name)
+ call({:show_zone, zone, server_name})
end
+
@spec delete_zone(Zone.t, String.t) :: :ok | {:error, String.t}
@doc """
Delete specific Zone on PowerDNS
"""
def delete_zone(%Zone{} = zone, server_name \\ @default_server) do
- ZonesManager.delete(zone, server_name)
+ call({:delete_zone, zone, server_name})
end
- ###
- # Records
- ###
+ ###########
+ # Records #
+ ###########
+
@spec create_record(Zone.t, struct) :: :ok | {:error, String.t}
@doc """
Create a new Record for the given Zone
"""
def create_record(%Zone{} = zone, %{} = rrset_attrs) do
- RecordsManager.create(zone, rrset_attrs)
+ call({:create_record, zone, rrset_attrs})
end
@spec show_record(Zone.t, struct) :: :ok | {:error, String.t}
@@ -49,7 +77,7 @@ defmodule PowerDNSex do
Show / Retrive info of the specific Record of the given Zone
"""
def show_record(%Zone{} = zone, %{} = rrset_attrs) do
- RecordsManager.show(zone, rrset_attrs)
+ call({:show_record, zone, rrset_attrs})
end
@spec update_record(Zone.t, struct) :: :ok | {:error, String.t}
@@ -57,7 +85,7 @@ defmodule PowerDNSex do
Update Record of the given Zone
"""
def update_record(%Zone{} = zone, %{} = rrset_attrs) do
- RecordsManager.update(zone, rrset_attrs)
+ call({:update_record, zone, rrset_attrs})
end
@spec delete_record(Zone.t, struct) :: :ok | {:error, String.t}
@@ -65,6 +93,13 @@ defmodule PowerDNSex do
Delete specific Record of given Zone
"""
def delete_record(%Zone{} = zone, %{} = rrset_attrs) do
- RecordsManager.delete(zone, rrset_attrs)
+ call({:delete_record, zone, rrset_attrs})
end
+
+ ###########
+ # Private #
+ ###########
+
+ defp call(params), do: GenServer.call(@name, params)
+
end
diff --git a/lib/powerdnsex/config.ex b/lib/powerdnsex/config.ex
index 486ccb6..2cf55f1 100644
--- a/lib/powerdnsex/config.ex
+++ b/lib/powerdnsex/config.ex
@@ -20,6 +20,8 @@ defmodule PowerDNSex.Config do
def powerdns_token, do: data.token
+ def valid?(), do: powerdns_url && powerdns_token
+
###
# Private
###
diff --git a/lib/powerdnsex/gen_server/server.ex b/lib/powerdnsex/gen_server/server.ex
new file mode 100644
index 0000000..52768b3
--- /dev/null
+++ b/lib/powerdnsex/gen_server/server.ex
@@ -0,0 +1,42 @@
+defmodule PowerDNSex.Server do
+ use GenServer
+
+ alias PowerDNSex.Managers.{ZonesManager, RecordsManager}
+ alias PowerDNSex.Models.Zone
+
+ def start_link(name) do
+ GenServer.start_link(__MODULE__, :ok, name: name)
+ end
+
+ ###
+ # Zones
+ ###
+
+ def handle_call({:create_zone, zone, server_name}, _from, state) do
+ {:reply, ZonesManager.create(zone, server_name), state}
+ end
+
+ def handle_call({:show_zone, zone, server_name}, _from, state) do
+ {:reply, ZonesManager.show(zone, server_name), state}
+ end
+
+ def handle_call({:delete_zone, zone, server_name}, _from, state) do
+ {:reply, ZonesManager.delete(zone, server_name), state}
+ end
+
+ def handle_call({:create_record, zone, rrset_attrs}, _from, state) do
+ {:reply, RecordsManager.create(zone, rrset_attrs), state}
+ end
+
+ def handle_call({:show_record, zone, rrset_attrs}, _from, state) do
+ {:reply, RecordsManager.show(zone, rrset_attrs), state}
+ end
+
+ def handle_call({:update_record, zone, rrset_attrs}, _from, state) do
+ {:reply, RecordsManager.update(zone, rrset_attrs), state}
+ end
+
+ def handle_call({:delete_record, zone, rrset_attrs}, _from, state) do
+ {:reply, RecordsManager.delete(zone, rrset_attrs), state}
+ end
+end
diff --git a/lib/powerdnsex/models/error.ex b/lib/powerdnsex/models/error.ex
index 1cf9f62..d4b1183 100644
--- a/lib/powerdnsex/models/error.ex
+++ b/lib/powerdnsex/models/error.ex
@@ -1,3 +1,5 @@
defmodule PowerDNSex.Models.Error do
defstruct [:error]
+
+ @type t :: %__MODULE__{error: String.t}
end
diff --git a/lib/powerdnsex/models/zone.ex b/lib/powerdnsex/models/zone.ex
index 62a5a2a..8620443 100644
--- a/lib/powerdnsex/models/zone.ex
+++ b/lib/powerdnsex/models/zone.ex
@@ -11,6 +11,8 @@ defmodule PowerDNSex.Models.Zone do
notified_serial: 0, serial: nil, soa_edit: "", soa_edit_api: "",
url: nil
+ @type t :: %__MODULE__{}
+
def as_body(%__MODULE__{} = zone) do
get_valid_attrs = fn({attr, value}, body) ->
if Enum.member?(@body_attrs, attr) do
diff --git a/lib/powerdnsex/server_setup.ex b/lib/powerdnsex/server_setup.ex
deleted file mode 100644
index 3b5cb14..0000000
--- a/lib/powerdnsex/server_setup.ex
+++ /dev/null
@@ -1,29 +0,0 @@
-defmodule PowerDNSex.ServerSetup do
- defmacro __using__(opts \\ []) do
- quote bind_quoted: [opts: opts] do
- use Application
-
- @name opts[:process_name] || :PowerDNSex
- @config opts[:config]
-
- @spec start(term, term) :: GenServer.on_start
- def start(_, _), do: start
-
- @spec start() :: GenServer.on_start
- @doc false
- def start do
- import Supervisor.Spec
-
- children = [worker(Server, [@name, @config])]
-
- options = [strategy: :one_for_one, name: :"#{@name}.Supervisor"]
-
- case Supervisor.start_link(children, options) do
- {:ok, pid} -> {:ok, pid}
- {:error, {:already_started, pid}} -> {:ok, pid}
- other -> other
- end
- end
- end
- end
-end