Current section
Files
Jump to
Current section
Files
src/erlcloud_glue.erl
-module(erlcloud_glue).
-include("erlcloud_aws.hrl").
%% API
-export([configure/2, configure/3, configure/4, configure/5,
new/2, new/3, new/4, new/5]).
-export([
create_crawler/1,
create_crawler/2,
create_database/1,
create_database/2,
create_database/3,
create_job/1,
create_job/2,
create_table/2,
create_table/3,
create_table/4,
delete_crawler/1,
delete_crawler/2,
delete_job/1,
delete_job/2,
delete_table/2,
delete_table/3,
delete_table/4,
get_crawler/1,
get_crawler/2,
get_crawler_metrics/0,
get_crawler_metrics/1,
get_crawler_metrics/2,
get_crawler_metrics/3,
get_crawlers/0,
get_crawlers/1,
get_crawlers/2,
get_job/1,
get_job/2,
get_jobs/0,
get_jobs/1,
get_jobs/2,
get_job_run/2,
get_job_run/3,
get_job_run/4,
get_job_runs/1,
get_job_runs/2,
get_job_runs/3,
get_table/2,
get_table/3,
get_table/4,
get_tables/1,
get_tables/2,
get_tables/3,
get_tables/4,
reset_job_bookmark/1,
reset_job_bookmark/2,
start_crawler/1,
start_crawler/2,
start_crawler_schedule/1,
start_crawler_schedule/2,
start_job_run/1,
start_job_run/2,
start_job_run/5,
stop_crawler/1,
stop_crawler/2,
stop_crawler_schedule/1,
stop_crawler_schedule/2,
update_crawler/1,
update_crawler/2,
update_crawler_schedule/1,
update_crawler_schedule/2,
update_crawler_schedule/3,
update_job/2,
update_job/3,
update_table/2,
update_table/3,
update_table/4
]).
-spec new(string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
glue_host = Host,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string(), non_neg_integer()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host, Port) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
glue_host = Host,
glue_port = Port,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string(), non_neg_integer(), string()) ->
aws_config().
new(AccessKeyID, SecretAccessKey, Host, Port, Scheme) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
glue_host = Host,
glue_port = Port,
glue_scheme = Scheme,
retry = fun erlcloud_retry:default_retry/1}.
-spec configure(string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey) ->
put(aws_config, new(AccessKeyID, SecretAccessKey)),
ok.
-spec configure(string(), string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host) ->
put(aws_config, new(AccessKeyID, SecretAccessKey, Host)),
ok.
-spec configure(string(), string(), string(), non_neg_integer()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host, Port) ->
put(aws_config, new(AccessKeyID, SecretAccessKey, Host, Port)),
ok.
-spec configure(string(), string(), string(), non_neg_integer(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host, Port, Scheme) ->
put(aws_config, new(AccessKeyID, SecretAccessKey, Host, Port, Scheme)),
ok.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_CreateCrawler.html
%%
%% `
%% erlcloud_glue:create_crawler(#{<<"Classifiers">> => [],
%% <<"Configuration">> => <<"some-config">>},
%% <<"DatabaseName">> => <<"db-name">>,
%% <<"Name">> => <<"crawler-name">>,
%% ...
%% <<"Targets">> => {}}).
%% '
%%
-spec create_crawler(map()) -> ok | {error, any()}.
create_crawler(CrawlerInput) ->
create_crawler(CrawlerInput, default_config()).
-spec create_crawler(map(), aws_config()) -> ok | {error, any()}.
create_crawler(CrawlerInput, Config) ->
case request(Config, "CreateCrawler", CrawlerInput) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_CreateDatabase.html
%%
%% `
%% erlcloud_glue:create_database(#{<<"Description">> => <<"some-desc">>,
%% <<"Name">> => <<"db-name">>},
%% <<"catalog-id">>).
%% '
%%
-spec create_database(map()) -> ok | {error, any()}.
create_database(DatabaseInput) ->
create_database(DatabaseInput, undefined, default_config()).
-spec create_database(map(), binary() | aws_config()) ->
ok | {error, any()}.
create_database(DatabaseInput, CatalogId) when is_binary(CatalogId) ->
create_database(DatabaseInput, CatalogId, default_config());
create_database(DatabaseInput, Config) when is_record(Config, aws_config) ->
create_database(DatabaseInput, undefined, Config).
-spec create_database(map(), binary() | undefined, aws_config()) ->
ok | {error, any()}.
create_database(DatabaseInput, CatalogId, Config) ->
Request0 = #{<<"DatabaseInput">> => DatabaseInput},
Request1 = update_catalog_id(CatalogId, Request0),
case request(Config, "CreateDatabase", Request1) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_CreateJob.html
%%
%% `
%% erlcloud_glue:create_job(#{<<"Name">> => <<"job-name">>,
%% <<"Description">> => <<"some-desc">>,
%% <<"Connections">> =>
%% #{<<"Connections">> => [<<"conn1">>]}
%% ...
%% <<"LogUri">> => <<"some-uri">>}).
%% '
%%
-spec create_job(map()) -> {ok, map()} | {error, any()}.
create_job(JobInput) ->
create_job(JobInput, default_config()).
-spec create_job(map(), aws_config()) -> {ok, map()} | {error, any()}.
create_job(JobInput, Config) ->
request(Config, "CreateJob", JobInput).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html
%%
%% `
%% erlcloud_glue:create_table(<<"db-name">>,
%% #{<<"Description">> => <<"some-desc">>,
%% <<"Name">> => <<"tbl-name">>,
%% ...
%% <<"TableType">> => <<"some-type">>},
%% <<"catalog-id">>).
%% '
%%
-spec create_table(binary(), map()) -> ok | {error, any()}.
create_table(DbName, TableInput) ->
create_table(DbName, TableInput, undefined, default_config()).
-spec create_table(binary(),
map(),
binary() | aws_config()) ->
ok | {error, any()}.
create_table(DbName, TableInput, CatalogId) when is_binary(CatalogId) ->
create_table(DbName, TableInput, CatalogId, default_config());
create_table(DbName, TableInput, Config) when is_record(Config, aws_config) ->
create_table(DbName, TableInput, undefined, Config).
-spec create_table(binary(), map(), binary() | undefined, aws_config()) ->
ok | {error, any()}.
create_table(DbName, TableInput, CatalogId, Config) ->
Request0 = #{<<"DatabaseName">> => DbName,
<<"TableInput">> => TableInput},
Request1 = update_catalog_id(CatalogId, Request0),
case request(Config, "CreateTable", Request1) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteCrawler.html
%%
-spec delete_crawler(binary()) -> ok | {error, any()}.
delete_crawler(CrawlerName) ->
delete_crawler(CrawlerName, default_config()).
-spec delete_crawler(binary(), aws_config()) -> ok | {error, any()}.
delete_crawler(CrawlerName, Config) ->
Request = #{<<"Name">> => CrawlerName},
case request(Config, "DeleteCrawler", Request) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteJob.html
%%
-spec delete_job(binary()) -> ok | {error, any()}.
delete_job(JobName) ->
delete_job(JobName, default_config()).
-spec delete_job(binary(), aws_config()) -> ok | {error, any()}.
delete_job(JobName, Config) ->
case request(Config, "DeleteJob", #{<<"JobName">> => JobName}) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteTable.html
%%
-spec delete_table(binary(), binary()) -> ok | {error, any()}.
delete_table(DbName, TableName) ->
delete_table(DbName, TableName, undefined, default_config()).
-spec delete_table(binary(),
binary(),
binary() | aws_config()) ->
ok | {error, any()}.
delete_table(DbName, TableName, CatalogId) when is_binary(CatalogId) ->
delete_table(DbName, TableName, CatalogId, default_config());
delete_table(DbName, TableName, Config) when is_record(Config, aws_config) ->
delete_table(DbName, TableName, undefined, Config).
-spec delete_table(binary(), binary(), binary() | undefined, aws_config()) ->
ok | {error, any()}.
delete_table(DbName, TableName, CatalogId, Config) ->
Request0 = #{<<"DatabaseName">> => DbName,
<<"Name">> => TableName},
Request1 = update_catalog_id(CatalogId, Request0),
case request(Config, "DeleteTable", Request1) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetCrawler.html
%%
-spec get_crawler(binary()) -> {ok, map()} | {error, any()}.
get_crawler(CrawlerName) ->
get_crawler(CrawlerName, default_config()).
-spec get_crawler(binary(), aws_config()) -> {ok, map()} | {error, any()}.
get_crawler(CrawlerName, Config) ->
request(Config, "GetCrawler", #{<<"Name">> => CrawlerName}).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetCrawlerMetrics.html
%% `
%% erlcloud_glue:get_crawler_metrics(
%% [<<"crawler-name-1">>, <<"crawl}er-name-2">>],
%% #{<<"MaxResults">> => 1,
%% <<"NextToken">> => <<"some-token">>}
%% ).
%% '
%%
-spec get_crawler_metrics() -> {ok, map()} | {error, any()}.
get_crawler_metrics() ->
get_crawler_metrics(default_config()).
-spec get_crawler_metrics(list() | map() | aws_config()) ->
{ok, map()} | {error, any()}.
get_crawler_metrics(NameList) when is_list(NameList) ->
get_crawler_metrics(NameList, #{}, default_config());
get_crawler_metrics(PaginationMap) when is_map(PaginationMap) ->
get_crawler_metrics([], PaginationMap, default_config());
get_crawler_metrics(Config) when is_record(Config, aws_config) ->
get_crawler_metrics([], #{}, Config).
-spec get_crawler_metrics(list() | map(), map() | aws_config()) ->
{ok, map()} | {error, any()}.
get_crawler_metrics(NameList, PaginationMap)
when is_list(NameList), is_map(PaginationMap) ->
get_crawler_metrics(NameList, PaginationMap, default_config());
get_crawler_metrics(NameList, Config)
when is_list(NameList), is_record(Config, aws_config) ->
get_crawler_metrics(NameList, #{}, default_config());
get_crawler_metrics(PaginationMap, Config)
when is_map(PaginationMap), is_record(Config, aws_config) ->
get_crawler_metrics([], PaginationMap, default_config()).
-spec get_crawler_metrics(list(), map(), aws_config()) ->
{ok, map()} | {error, any()}.
get_crawler_metrics(NameList, PaginationMap, Config) ->
Request = PaginationMap#{<<"CrawlerNameList">> => NameList},
request(Config, "GetCrawlerMetrics", Request).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetCrawlers.html
%%
%% `
%% erlcloud_glue:get_crawlers(#{<<"MaxResults">> => 1,
%% <<"NextToken">> => <<"some-token">>}).
%% '
%%
-spec get_crawlers() -> {ok, map()} | {error, any()}.
get_crawlers() ->
get_crawlers(default_config()).
-spec get_crawlers(map() | aws_config()) -> {ok, map()} | {error, any()}.
get_crawlers(PaginationMap) when is_map(PaginationMap) ->
get_crawlers(PaginationMap, default_config());
get_crawlers(Config) when is_record(Config, aws_config) ->
get_crawlers(#{}, Config).
-spec get_crawlers(map(), aws_config()) -> {ok, map()} | {error, any()}.
get_crawlers(PaginationMap, Config) ->
request(Config, "GetCrawlers", PaginationMap).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetJob.html
%%
-spec get_job(binary()) -> {ok, map()} | {error, any()}.
get_job(JobName) ->
get_job(JobName, default_config()).
-spec get_job(binary(), aws_config()) -> {ok, map()} | {error, any()}.
get_job(JobName, Config) ->
request(Config, "GetJob", #{<<"JobName">> => JobName}).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetJobs.html
%%
%% `
%% erlcloud_glue:get_jobs(#{<<"MaxResults">> => 1,
%% <<"NextToken">> => <<"some-token">>}).
%% '
%%
-spec get_jobs() -> {ok, map()} | {error, any()}.
get_jobs() ->
get_jobs(default_config()).
-spec get_jobs(map() | aws_config()) -> {ok, map()} | {error, any()}.
get_jobs(PaginationMap) when is_map(PaginationMap) ->
get_jobs(PaginationMap, default_config());
get_jobs(Config) when is_record(Config, aws_config) ->
get_jobs(#{}, Config).
-spec get_jobs(map(), aws_config()) -> {ok, map()} | {error, any()}.
get_jobs(PaginationMap, Config) ->
request(Config, "GetJobs", PaginationMap).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetJobRun.html
%%
-spec get_job_run(binary(), binary()) -> {ok, map()} | {error, any()}.
get_job_run(JobName, RunId) ->
get_job_run(JobName, RunId, false, default_config()).
-spec get_job_run(binary(), binary(), boolean() | aws_config()) ->
{ok, map()} | {error, any()}.
get_job_run(JobName, RunId, PredecessorsIncluded)
when is_boolean(PredecessorsIncluded) ->
get_job_run(JobName, RunId, PredecessorsIncluded, default_config());
get_job_run(JobName, RunId, Config) when is_record(Config, aws_config) ->
get_job_run(JobName, RunId, false, Config).
-spec get_job_run(binary(), binary(), boolean(), aws_config()) ->
{ok, map()} | {error, any()}.
get_job_run(JobName, RunId, PredecessorsIncluded, Config) ->
Request = #{<<"JobName">> => JobName,
<<"RunId">> => RunId,
<<"PredecessorsIncluded">> => PredecessorsIncluded},
request(Config, "GetJobRun", Request).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetJobRuns.html
%%
%% `
%% erlcloud_glue:get_job_runs(<<"job-name">>,
%% #{<<"MaxResults">> => 1,
%% <<"NextToken">> => <<"some-token">>}).
%% '
%%
-spec get_job_runs(binary()) -> {ok, map()} | {error, any()}.
get_job_runs(JobName) ->
get_job_runs(JobName, #{}, default_config()).
-spec get_job_runs(binary(), map() | aws_config()) ->
{ok, map()} | {error, any()}.
get_job_runs(JobName, PaginationMap) when is_map(PaginationMap) ->
get_job_runs(JobName, PaginationMap, default_config());
get_job_runs(JobName, Config) when is_record(Config, aws_config) ->
get_job_runs(JobName, #{}, Config).
-spec get_job_runs(binary(), map(), aws_config()) ->
{ok, map()} | {error, any()}.
get_job_runs(JobName, PaginationMap, Config) ->
Request = PaginationMap#{<<"JobName">> => JobName},
request(Config, "GetJobRuns", Request).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetTable.html
%%
-spec get_table(binary(), binary()) -> {ok, map()} | {error, any()}.
get_table(DbName, TableName) ->
get_table(DbName, TableName, undefined, default_config()).
-spec get_table(binary(),
binary(),
binary() | aws_config()) ->
{ok, map()} | {error, any()}.
get_table(DbName, TableName, CatalogId) when is_binary(CatalogId) ->
get_table(DbName, TableName, CatalogId, default_config());
get_table(DbName, TableName, Config) when is_record(Config, aws_config) ->
get_table(DbName, TableName, undefined, Config).
-spec get_table(binary(), binary(), binary() | undefined, aws_config()) ->
{ok, map()} | {error, any()}.
get_table(DbName, TableName, CatalogId, Config) ->
Request0 = #{<<"DatabaseName">> => DbName,
<<"Name">> => TableName},
Request1 = update_catalog_id(CatalogId, Request0),
request(Config, "GetTable", Request1).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_GetTables.html
%%
%% `
%% erlcloud_glue:get_tables(<<"db-name">>,
%% <<"catalog-id">>,
%% #{<<"Expression">> => <<"some-regex-pattern">>,
%% <<"MaxResults">> => 1,
%% <<"NextToken">> => <<"some-token">>}).
%% '
%%
-spec get_tables(binary()) -> {ok, map()} | {error, any()}.
get_tables(DbName) ->
get_tables(DbName, undefined, #{}, default_config()).
-spec get_tables(binary(),
binary() | map() | aws_config()) ->
{ok, map()} | {error, any()}.
get_tables(DbName, CatalogId) when is_binary(CatalogId) ->
get_tables(DbName, CatalogId, #{}, default_config());
get_tables(DbName, Options) when is_map(Options) ->
get_tables(DbName, undefined, Options, default_config());
get_tables(DbName, Config) when is_record(Config, aws_config) ->
get_tables(DbName, undefined, #{}, Config).
-spec get_tables(binary(),
binary() | map(),
map() | aws_config()) ->
{ok, map()} | {error, any()}.
get_tables(DbName, CatalogId, Options)
when is_binary(CatalogId), is_map(Options) ->
get_tables(DbName, CatalogId, Options, default_config());
get_tables(DbName, CatalogId, Config)
when is_binary(CatalogId), is_record(Config, aws_config) ->
get_tables(DbName, CatalogId, #{}, Config);
get_tables(DbName, Options, Config)
when is_map(Options), is_record(Config, aws_config) ->
get_tables(DbName, undefined, Options, Config).
-spec get_tables(binary(), binary() | undefined, map(), aws_config()) ->
{ok, map()} | {error, any()}.
get_tables(DbName, CatalogId, Options, Config) ->
Request0 = Options#{<<"DatabaseName">> => DbName},
Request1 = update_catalog_id(CatalogId, Request0),
request(Config, "GetTables", Request1).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_ResetJobBookmark.html
%%
-spec reset_job_bookmark(binary()) -> ok | {error, any()}.
reset_job_bookmark(JobName) ->
reset_job_bookmark(JobName, default_config()).
-spec reset_job_bookmark(binary(), aws_config()) -> ok | {error, any()}.
reset_job_bookmark(JobName, Config) ->
case request(Config, "ResetJobBookmark", #{<<"JobName">> => JobName}) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_StartCrawler.html
%%
-spec start_crawler(binary()) -> ok | {error, any()}.
start_crawler(CrawlerName) ->
start_crawler(CrawlerName, default_config()).
-spec start_crawler(binary(), aws_config()) -> ok | {error, any()}.
start_crawler(CrawlerName, Config) ->
case request(Config, "StartCrawler", #{<<"Name">> => CrawlerName}) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_StartCrawlerSchedule.html
%%
-spec start_crawler_schedule(binary()) -> ok | {error, any()}.
start_crawler_schedule(CrawlerName) ->
start_crawler_schedule(CrawlerName, default_config()).
-spec start_crawler_schedule(binary(), aws_config()) -> ok | {error, any()}.
start_crawler_schedule(CrawlerName, Config) ->
Request = #{<<"CrawlerName">> => CrawlerName},
case request(Config, "StartCrawlerSchedule", Request) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_StartJobRun.html
%%
%% `
%% erlcloud_glue:start_job_run(<<"job-name">>,
%% <<"job-run-id">>,
%% 5,
%% #{<<"Key-1">> => <<"Value-1">>,
%% <<"Key-2">> => <<"Value-2">>},
%% AwsConfig).
%% '
%%
-spec start_job_run(binary()) -> {ok, map()} | {error, any()}.
start_job_run(JobName) ->
start_job_run(JobName, undefined, undefined, #{}, default_config()).
-spec start_job_run(binary(), binary() | integer() | map()) ->
{ok, map()} | {error, any()}.
start_job_run(JobName, JobRunId) when is_binary(JobRunId) ->
start_job_run(JobName, JobRunId, undefined, #{}, default_config());
start_job_run(JobName, AllocatedCapacity) when is_integer(AllocatedCapacity) ->
start_job_run(JobName, undefined, AllocatedCapacity, #{}, default_config());
start_job_run(JobName, Arguments) when is_map(Arguments) ->
start_job_run(JobName, undefined, undefined, Arguments, default_config());
start_job_run(JobName, Config) when is_record(Config, aws_config) ->
start_job_run(JobName, undefined, undefined, #{}, Config).
-spec start_job_run(binary(),
binary() | undefined,
integer() | undefined,
map(),
aws_config()) ->
{ok, map()} | {error, any()}.
start_job_run(JobName, JobRunId, AllocatedCapacity, Arguments, Config) ->
Request0 = #{<<"JobName">> => JobName,
<<"Arguments">> => Arguments},
Request1 = update_map([{<<"JobRunId">>, JobRunId},
{<<"AllocatedCapacity">>, AllocatedCapacity}],
Request0),
request(Config, "StartJobRun", Request1).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_StopCrawler.html
%%
-spec stop_crawler(binary()) -> ok | {error, any()}.
stop_crawler(CrawlerName) ->
stop_crawler(CrawlerName, default_config()).
-spec stop_crawler(binary(), aws_config()) -> ok | {error, any()}.
stop_crawler(CrawlerName, Config) ->
case request(Config, "StopCrawler", #{<<"Name">> => CrawlerName}) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_StopCrawlerSchedule.html
%%
-spec stop_crawler_schedule(binary()) -> ok | {error, any()}.
stop_crawler_schedule(CrawlerName) ->
stop_crawler_schedule(CrawlerName, default_config()).
-spec stop_crawler_schedule(binary(), aws_config()) -> ok | {error, any()}.
stop_crawler_schedule(CrawlerName, Config) ->
Request = #{<<"CrawlerName">> => CrawlerName},
case request(Config, "StopCrawlerSchedule", Request) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateCrawler.html
%%
%% `
%% erlcloud_glue:update_crawler(#{<<"Classifiers">> => [],
%% <<"Configuration">> => <<"some-config">>},
%% <<"DatabaseName">> => <<"db-name">>,
%% <<"Name">> => <<"crawler-name">>,
%% ...
%% <<"Targets">> => {}}).
%% '
%%
-spec update_crawler(map()) -> ok | {error, any()}.
update_crawler(CrawlerInput) ->
update_crawler(CrawlerInput, default_config()).
-spec update_crawler(map(), aws_config()) -> ok | {error, any()}.
update_crawler(CrawlerInput, Config) ->
case request(Config, "UpdateCrawler", CrawlerInput) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateCrawlerSchedule.html
%%
%% `
%% erlcloud_glue:update_crawler_schedule(<<"crawler-name-1">>,
%% <<"cron(15 12 * * ? *)">>).
%% '
%%
-spec update_crawler_schedule(binary()) -> ok | {error, any()}.
update_crawler_schedule(CrawlerName) ->
update_crawler_schedule(CrawlerName, undefined, default_config()).
-spec update_crawler_schedule(binary(), binary() | undefined) ->
ok | {error, any()}.
update_crawler_schedule(CrawlerName, Schedule)
when is_binary(CrawlerName), is_binary(Schedule) ->
update_crawler_schedule(CrawlerName, Schedule, default_config()).
-spec update_crawler_schedule(binary(), binary() | undefined, aws_config()) ->
ok | {error, any()}.
update_crawler_schedule(CrawlerName, Schedule, Config) ->
Request0 = #{<<"CrawlerName">> => CrawlerName},
Request1 = update_map({<<"Schedule">>, Schedule}, Request0),
case request(Config, "UpdateCrawlerSchedule", Request1) of
{ok, _} -> ok;
Error -> Error
end.
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateJob.html
%%
%% `
%% erlcloud_glue:update_job(<<"job-name">>,
%% #{<<"AllocatedCapacity">> => 5,
%% <<"Command">> =>
%% #{<<"Name">> => <<"some-name">>,
%% <<"ScriptLocation">> => <<"location">>},
%% ...
%% <<"Role">> => <<"some-role">>}).
%% '
%%
-spec update_job(binary(), map()) -> {ok, map()} | {error, any()}.
update_job(JobName, JobInput) ->
update_job(JobName, JobInput, default_config()).
-spec update_job(binary(), map(), aws_config()) -> {ok, map()} | {error, any()}.
update_job(JobName, JobInput, Config) ->
Request = #{<<"JobName">> => JobName,
<<"JobUpdate">> => JobInput},
request(Config, "UpdateJob", Request).
%% @doc
%% Glue API:
%% https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html
%%
%% erlcloud_glue:update_table(<<"db-name">>,
%% #{<<"Description">> => <<"some-desc">>,
%% <<"Name">> => <<"tbl-name">>,
%% ...
%% <<"TableType">> => <<"some-type">>},
%% <<"catalog-id">>).
%% '
%%
-spec update_table(binary(), map()) -> ok | {error, any()}.
update_table(DbName, TableInput) ->
update_table(DbName, TableInput, undefined, default_config()).
-spec update_table(binary(),
map(),
binary() | aws_config()) ->
ok | {error, any()}.
update_table(DbName, TableInput, CatalogId) when is_binary(CatalogId) ->
update_table(DbName, TableInput, CatalogId, default_config());
update_table(DbName, TableInput, Config) when is_record(Config, aws_config) ->
update_table(DbName, TableInput, undefined, Config).
-spec update_table(binary(), map(), binary() | undefined, aws_config()) ->
ok | {error, any()}.
update_table(DbName, TableInput, CatalogId, Config) ->
Request0 = #{<<"DatabaseName">> => DbName,
<<"TableInput">> => TableInput},
Request1 = update_catalog_id(CatalogId, Request0),
case request(Config, "UpdateTable", Request1) of
{ok, _} -> ok;
Error -> Error
end.
%%------------------------------------------------------------------------------
%% Internal Functions
%%------------------------------------------------------------------------------
update_map(KeyValues, Map) when is_list(KeyValues) ->
lists:foldl(fun update_map/2, Map, KeyValues);
update_map({_, undefined}, Map) ->
Map;
update_map({Key, Value}, Map) ->
maps:put(Key, Value, Map).
update_catalog_id(CatalogId, Request) ->
update_map({<<"CatalogId">>, CatalogId}, Request).
default_config() -> erlcloud_aws:default_config().
request(Config0, OperationName, Request) ->
case erlcloud_aws:update_config(Config0) of
{ok, Config} ->
Body = jsx:encode(Request),
Operation = "AWSGlue." ++ OperationName,
Headers = get_headers(Config, Operation, Body),
AwsRequest = #aws_request{service = glue,
uri = get_url(Config),
method = post,
request_headers = Headers,
request_body = Body},
request(Config, AwsRequest);
{error, Reason} ->
{error, Reason}
end.
request(Config, Request) ->
Result = erlcloud_retry:request(Config, Request, fun handle_result/1),
case erlcloud_aws:request_to_return(Result) of
{ok, {_, <<>>}} -> {ok, #{}};
{ok, {_, RespBody}} -> {ok, jsx:decode(RespBody)};
{error, _} = Error -> Error
end.
handle_result(#aws_request{response_type = ok} = Request) ->
Request;
handle_result(#aws_request{response_type = error,
error_type = aws,
response_status = Status} = Request)
when Status >= 500 ->
Request#aws_request{should_retry = true};
handle_result(#aws_request{response_type = error,
error_type = aws} = Request) ->
Request#aws_request{should_retry = false}.
get_headers(#aws_config{glue_host = Host} = Config, Operation, Body) ->
Headers = [{"host", Host},
{"x-amz-target", Operation},
{"content-type", "application/x-amz-json-1.1"}],
Region = erlcloud_aws:aws_region_from_host(Host),
erlcloud_aws:sign_v4_headers(Config, Headers, Body, Region, "glue").
get_url(#aws_config{glue_scheme = Scheme,
glue_host = Host,
glue_port = Port}) ->
Scheme ++ Host ++ ":" ++ integer_to_list(Port).