From 8beaa5452ce5245d460815ca1d6752167bdb4fd3 Mon Sep 17 00:00:00 2001 From: Tiago Freire Date: Fri, 26 Aug 2016 19:55:32 -0300 Subject: [WIP] GenServer refactoring --- lib/powerdnsex.ex | 71 +++++++++++++++++++++++++++---------- lib/powerdnsex/config.ex | 2 ++ lib/powerdnsex/gen_server/server.ex | 42 ++++++++++++++++++++++ lib/powerdnsex/models/error.ex | 2 ++ lib/powerdnsex/models/zone.ex | 2 ++ lib/powerdnsex/server_setup.ex | 29 --------------- 6 files changed, 101 insertions(+), 47 deletions(-) create mode 100644 lib/powerdnsex/gen_server/server.ex delete mode 100644 lib/powerdnsex/server_setup.ex (limited to 'lib') 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 -- cgit v1.2.3