Current section
Files
Jump to
Current section
Files
src/ls_dataset.erl
-module(ls_dataset).
-export([
create/1,
import/1,
import/3,
delete/1,
delete/2,
get/1,
list/0,
list/2,
stream/3,
available/0,
available/2
]).
-export([
set_metadata/2,
imported/2,
status/2,
sha1/2,
description/2,
disk_driver/2,
homepage/2,
image_size/2,
name/2,
add_network/2,
remove_network/2,
add_requirement/2,
remove_requirement/2,
nic_driver/2,
os/2,
type/2,
zone_type/2,
users/2,
version/2,
kernel_version/2
]).
%%%===================================================================
%%% DATASET Functions
%%%===================================================================
%%--------------------------------------------------------------------
%% @doc Stream available datasets
%% @end
%%--------------------------------------------------------------------
-spec available(mdns_client_lib:stream_fun(), term()) ->
{ok, [maps:map()]} |
ok |
{'error', 'no_servers'}.
available(StreamFn, Acc0) ->
case libsniffle_server:stream({dataset, available, stream},
StreamFn, Acc0) of
{reply, Reply} ->
Reply;
noreply ->
ok;
E ->
E
end.
%%--------------------------------------------------------------------
%% @doc Available datasets
%% @end
%%--------------------------------------------------------------------
-spec available() ->
{ok, [maps:map()]} |
{'error', 'no_servers'}.
available() ->
send({dataset, available}).
%%--------------------------------------------------------------------
%% @doc Creates a new dataset with the given UUID.
%% @end
%%--------------------------------------------------------------------
-spec create(Dataset::binary()) ->
ok | duplicate |
{'error', 'no_servers'}.
create(Dataset) ->
send({dataset, create, Dataset}).
%%--------------------------------------------------------------------
%% @doc Tries to import a dataset from a dsapi server URL.
%% @end
%%--------------------------------------------------------------------
-spec import(URL::binary()) ->
{ok, UUID::fifo:dataset_id()} |
{error, Reason::term()} |
{'error', 'no_servers'}.
import(URL) ->
send({dataset, import, URL}).
%%--------------------------------------------------------------------
%% @doc Tries to import a dataset from a dsapi server URL, with a new
%% UUID and a specific s3 server.
%% @end
%%--------------------------------------------------------------------
-type s3cfg() :: {Host::string(), Port::pos_integer(),
AKey::string(), SKey::string(),
Bucket::string()}.
-spec import(UUID::binary(), URL::binary(), S3Cfg::s3cfg() | undefined) ->
{ok, UUID::fifo:dataset_id()} |
{error, Reason::term()} |
{'error', 'no_servers'}.
import(UUID, URL, S3Cfg) ->
send({dataset, import, UUID, URL, S3Cfg}).
%%--------------------------------------------------------------------
%% @doc Deletes a dataset from the server, this will also delete the
%% image from the database.
%% @end
%%--------------------------------------------------------------------
-spec delete(Dataset::binary()) ->
ok | not_found |
{'error', 'no_servers'}.
delete(Dataset) ->
send({dataset, delete, Dataset}).
%%--------------------------------------------------------------------
%% @doc Deletes a dataset from the server, this will also delete the
%% image from the database. A s3 config can be passed
%% @end
%%--------------------------------------------------------------------
-spec delete(Dataset::binary(), Cfg::list()) ->
ok | not_found |
{'error', 'no_servers'}.
delete(Dataset, Cfg) ->
send({dataset, delete, Dataset, Cfg}).
%%--------------------------------------------------------------------
%% @doc Gets a dataset from the database.
%% @end
%%--------------------------------------------------------------------
-spec get(Dataset::binary()) ->
{'error', 'no_servers'} |
not_found |
{ok, fifo:dataset()}.
get(Dataset) ->
send({dataset, get, Dataset}).
%%--------------------------------------------------------------------
%% @doc Lists all datasets known to the system.
%% @end
%%--------------------------------------------------------------------
-spec list() ->
{ok, Datasets::[fifo:dataset_id()]} |
{'error', 'no_servers'}.
list() ->
send({dataset, list}).
%%--------------------------------------------------------------------
%% @doc Lists all datasets known to the system filtered by
%% given matchers.
%% @end
%%--------------------------------------------------------------------
-spec list(Reqs::term(), boolean()) ->
{ok, Datasets::[{Ranking::integer(),
ID::fifo:dataset_id()}]} |
{ok, Datasets::[{Ranking::integer(), Dset::fifo:dataset()}]} |
{'error', 'no_servers'}.
list(Reqs, Full) ->
send({dataset, list, Reqs, Full}).
%%--------------------------------------------------------------------
%% @doc Streams the Datasets in chunks.
%% @end
%%--------------------------------------------------------------------
-spec stream(Reqs::[fifo:matcher()], mdns_client_lib:stream_fun(), term()) ->
{ok, [{Ranking::integer(), fifo:vm_id()}]} |
{ok, [{Ranking::integer(), fifo:vm()}]} |
{'error', 'no_servers'}.
stream(Reqs, StreamFn, Acc0) ->
case libsniffle_server:stream({dataset, stream, Reqs}, StreamFn, Acc0) of
{reply, Reply} ->
Reply;
noreply ->
ok;
E ->
E
end.
-define(HS(F),
F(Dataset, Val) ->
send({dataset, F, Dataset, Val})).
-spec status(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(status).
-spec sha1(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(sha1).
-spec imported(fifo:dataset_id(), float() | non_neg_integer()) ->
ok | {error, no_servers}.
?HS(imported).
-spec description(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(description).
-spec disk_driver(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(disk_driver).
-spec homepage(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(homepage).
-spec image_size(fifo:dataset_id(), pos_integer()) ->
ok | {error, no_servers}.
?HS(image_size).
-spec name(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(name).
-spec add_network(fifo:dataset_id(), {binary(), binary()}) ->
ok | {error, no_servers}.
?HS(add_network).
-spec remove_network(fifo:dataset_id(), {binary(), binary()}) ->
ok | {error, no_servers}.
?HS(remove_network).
-spec add_requirement(fifo:dataset_id(), fifo:matcher()) ->
ok | {error, no_servers}.
?HS(add_requirement).
-spec remove_requirement(fifo:dataset_id(), {binary(), binary()}) ->
ok | {error, no_servers}.
?HS(remove_requirement).
-spec nic_driver(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(nic_driver).
-spec os(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(os).
-spec type(fifo:dataset_id(), zone | kvm | jail) ->
ok | {error, no_servers}.
?HS(type).
-spec zone_type(fifo:dataset_id(), lx | ipkg | lipkg) ->
ok | {error, no_servers}.
?HS(zone_type).
-spec users(fifo:dataset_id(), list()) ->
ok | {error, no_servers}.
?HS(users).
-spec version(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(version).
-spec kernel_version(fifo:dataset_id(), binary()) ->
ok | {error, no_servers}.
?HS(kernel_version).
-spec set_metadata(fifo:dataset_id(), fifo:attr_list()) ->
ok | {error, no_servers}.
?HS(set_metadata).
%%%===================================================================
%%% Internal Functions
%%%===================================================================
-spec send(MSG::fifo:sniffle_dataset_message()) ->
ok |
atom() |
{ok, Reply::term()} |
{error, no_servers}.
send(Msg) ->
send(mdns, Msg).
-spec send(mdns | {term(), term()},
MSG::fifo:sniffle_dataset_message()) ->
ok |
atom() |
{ok, Reply::term()} |
{error, no_servers}.
send(Sniffle, Msg) ->
case libsniffle_server:send(Sniffle, Msg) of
{reply, Reply} ->
Reply;
noreply ->
ok;
E ->
E
end.