defmodule RecycledCloud.OpenNebula.VMPool do @moduledoc """ OpenNebula VM Pool: http://docs.opennebula.io/5.12/integration/system_interfaces/api.html#one-vmpool-info """ alias RecycledCloud.OpenNebula, as: ONE alias RecycledCloud.OpenNebula.Schema # Filters ressourses. # (user) ID >= 0 matches an user's resources. @filter_flags [ {:user_primary_group, -4}, {:user, -3}, {:all, -2}, {:user_and_groups, -1} ] def get(%{filter_flag: filter_flag} = params) when is_atom(filter_flag) do params |> Map.put(:filter_flag, Keyword.get(@filter_flags, filter_flag)) |> get() end def get(%{range_start: :infinite} = params) do params |> Map.put(:range_start, -1) |> get() end def get(%{range_end: :infinite} = params) do params |> Map.put(:range_end, -1) |> get() end def get(%{state_filter: state} = params) when is_atom(state) do params |> Map.put(:state_filter, ONE.VM.state_for(state)) |> get() end def get(%{ filter_flag: filter_flag, range_start: range_start, range_end: range_end, state_filter: state, kv_filter: kv_filter }) do fn location -> params = [filter_flag, range_start, range_end, state, kv_filter] case ONE.query(location, "one.vmpool.info", params) do {:ok, raw} -> data = raw |> Schema.scan("vm_pool") |> Schema.map_record {:ok, data} {:error, err} -> {:error, err} end end end end