Skip to content

Commit

Permalink
Merge pull request #2434 from cgwalters/custom-remote
Browse files Browse the repository at this point in the history
Add support for "custom remotes"
  • Loading branch information
cgwalters authored Sep 8, 2021
2 parents 7e4c4f2 + 511c7a1 commit ce36e05
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 22 deletions.
8 changes: 8 additions & 0 deletions man/ostree.repo-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,14 @@ Boston, MA 02111-1307, USA.
<listitem><para>If set, pulls from this remote will fail with the configured text. This is intended for OS vendors which have a subscription process to access content.</para></listitem>
</varlistentry>

<varlistentry>
<term><varname>custom-backend</varname></term>
<listitem><para>If set, pulls from this remote via libostree will fail with an error that mentions the value.
It is recommended to make this a software identifier token (e.g. "examplecorp-fetcher"), not freeform text ("ExampleCorp Fetcher").
This is intended to be used by higher level software that wants to fetch ostree commits via some other mechanism, while still reusing the core libostree infrastructure around e.g. signatures.
</para></listitem>
</varlistentry>

</variablelist>

</refsect1>
Expand Down
15 changes: 15 additions & 0 deletions src/libostree/ostree-repo-pull.c
Original file line number Diff line number Diff line change
Expand Up @@ -3965,6 +3965,7 @@ ostree_repo_pull_with_options (OstreeRepo *self,
else
{
g_autofree char *unconfigured_state = NULL;
g_autofree char *custom_backend = NULL;

g_free (pull_data->remote_name);
pull_data->remote_name = g_strdup (remote_name_or_baseurl);
Expand Down Expand Up @@ -3996,6 +3997,20 @@ ostree_repo_pull_with_options (OstreeRepo *self,
"remote unconfigured-state: %s", unconfigured_state);
goto out;
}

if (!ostree_repo_get_remote_option (self, pull_data->remote_name,
"custom-backend", NULL,
&custom_backend,
error))
goto out;

if (custom_backend)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Cannot fetch via libostree - remote '%s' uses custom backend '%s'",
pull_data->remote_name, custom_backend);
goto out;
}
}

if (pull_data->remote_name && !(disable_sign_verify && disable_sign_verify_summary))
Expand Down
30 changes: 17 additions & 13 deletions src/libostree/ostree-repo.c
Original file line number Diff line number Diff line change
Expand Up @@ -1589,7 +1589,6 @@ impl_repo_remote_add (OstreeRepo *self,
GError **error)
{
g_return_val_if_fail (name != NULL, FALSE);
g_return_val_if_fail (url != NULL, FALSE);
g_return_val_if_fail (options == NULL || g_variant_is_of_type (options, G_VARIANT_TYPE ("a{sv}")), FALSE);

if (!ostree_validate_remote_name (name, error))
Expand Down Expand Up @@ -1637,10 +1636,13 @@ impl_repo_remote_add (OstreeRepo *self,
remote->file = g_file_get_child (etc_ostree_remotes_d, basename);
}

if (g_str_has_prefix (url, "metalink="))
g_key_file_set_string (remote->options, remote->group, "metalink", url + strlen ("metalink="));
else
g_key_file_set_string (remote->options, remote->group, "url", url);
if (url)
{
if (g_str_has_prefix (url, "metalink="))
g_key_file_set_string (remote->options, remote->group, "metalink", url + strlen ("metalink="));
else
g_key_file_set_string (remote->options, remote->group, "url", url);
}

if (options)
keyfile_set_from_vardict (remote->options, remote->group, options);
Expand Down Expand Up @@ -1676,7 +1678,7 @@ impl_repo_remote_add (OstreeRepo *self,
* ostree_repo_remote_add:
* @self: Repo
* @name: Name of remote
* @url: URL for remote (if URL begins with metalink=, it will be used as such)
* @url: (allow-none): URL for remote (if URL begins with metalink=, it will be used as such)
* @options: (allow-none): GVariant of type a{sv}
* @cancellable: Cancellable
* @error: Error
Expand Down Expand Up @@ -1789,7 +1791,6 @@ impl_repo_remote_replace (OstreeRepo *self,
GError **error)
{
g_return_val_if_fail (name != NULL, FALSE);
g_return_val_if_fail (url != NULL, FALSE);
g_return_val_if_fail (options == NULL || g_variant_is_of_type (options, G_VARIANT_TYPE ("a{sv}")), FALSE);

if (!ostree_validate_remote_name (name, error))
Expand All @@ -1815,11 +1816,14 @@ impl_repo_remote_replace (OstreeRepo *self,
if (!g_key_file_remove_group (remote->options, remote->group, error))
return FALSE;

if (g_str_has_prefix (url, "metalink="))
g_key_file_set_string (remote->options, remote->group, "metalink",
url + strlen ("metalink="));
else
g_key_file_set_string (remote->options, remote->group, "url", url);
if (url)
{
if (g_str_has_prefix (url, "metalink="))
g_key_file_set_string (remote->options, remote->group, "metalink",
url + strlen ("metalink="));
else
g_key_file_set_string (remote->options, remote->group, "url", url);
}

if (options != NULL)
keyfile_set_from_vardict (remote->options, remote->group, options);
Expand Down Expand Up @@ -1866,7 +1870,7 @@ impl_repo_remote_replace (OstreeRepo *self,
* @sysroot: (allow-none): System root
* @changeop: Operation to perform
* @name: Name of remote
* @url: URL for remote (if URL begins with metalink=, it will be used as such)
* @url: (allow-none): URL for remote (if URL begins with metalink=, it will be used as such)
* @options: (allow-none): GVariant of type a{sv}
* @cancellable: Cancellable
* @error: Error
Expand Down
31 changes: 24 additions & 7 deletions src/ostree/ot-remote-builtin-add.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ static char *opt_gpg_import;
static char **opt_sign_verify;
static char *opt_contenturl;
static char *opt_collection_id;
static char *opt_custom_backend;
static char *opt_sysroot;
static char *opt_repo;

Expand All @@ -51,6 +52,7 @@ static GOptionEntry option_entries[] = {
{ "if-not-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_not_exists, "Do nothing if the provided remote exists", NULL },
{ "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Replace the provided remote if it exists", NULL },
{ "gpg-import", 0, 0, G_OPTION_ARG_FILENAME, &opt_gpg_import, "Import GPG key from FILE", "FILE" },
{ "custom-backend", 0, 0, G_OPTION_ARG_STRING, &opt_custom_backend, "This remote has content not fetched via libostree", "NAME" },
{ "contenturl", 0, 0, G_OPTION_ARG_STRING, &opt_contenturl, "Use URL when fetching content", "URL" },
{ "collection-id", 0, 0, G_OPTION_ARG_STRING, &opt_collection_id,
"Globally unique ID for this repository as an collection of refs for redistribution to other repositories", "COLLECTION-ID" },
Expand Down Expand Up @@ -103,7 +105,7 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio
g_autoptr(OstreeRepo) repo = NULL;
g_autoptr(GString) sign_verify = NULL;
const char *remote_name;
const char *remote_url;
const char *remote_url = NULL;
g_autoptr(GVariantBuilder) optbuilder = NULL;
g_autoptr(GVariant) options = NULL;
gboolean ret = FALSE;
Expand All @@ -119,11 +121,26 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio
cancellable, error))
goto out;

if (argc < 3)
if (opt_custom_backend)
{
ot_util_usage_error (context, "NAME and URL must be specified", error);
goto out;
if (argc < 2)
{
ot_util_usage_error (context, "NAME must be specified", error);
goto out;
}
if (argc >= 3)
remote_url = argv[2];
}
else
{
if (argc < 3)
{
ot_util_usage_error (context, "NAME and URL must be specified", error);
goto out;
}
remote_url = argv[2];
}
remote_name = argv[1];

if (opt_if_not_exists && opt_force)
{
Expand All @@ -133,9 +150,6 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio
goto out;
}

remote_name = argv[1];
remote_url = argv[2];

optbuilder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));

if (argc > 3)
Expand All @@ -159,6 +173,9 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio
if (opt_contenturl != NULL)
g_variant_builder_add (optbuilder, "{s@v}",
"contenturl", g_variant_new_variant (g_variant_new_string (opt_contenturl)));
if (opt_custom_backend != NULL)
g_variant_builder_add (optbuilder, "{s@v}",
"custom-backend", g_variant_new_variant (g_variant_new_string (opt_custom_backend)));

for (char **iter = opt_set; iter && *iter; iter++)
{
Expand Down
31 changes: 29 additions & 2 deletions tests/pull-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ function verify_initial_contents() {
}

if has_gpgme; then
echo "1..37"
echo "1..38"
else
# 3 tests needs GPG support
echo "1..34"
echo "1..35"
fi

# Try both syntaxes
Expand Down Expand Up @@ -598,6 +598,33 @@ assert_file_has_content err.txt "ONE BILLION DOLLARS"
echo "ok unconfigured"
cd ${test_tmpdir}
${CMD_PREFIX} ostree --repo=repo remote add --custom-backend=ostree-rs-ext fromcontainer
if ${CMD_PREFIX} ostree --repo=repo pull fromcontainer 2>err.txt; then
assert_not_reached "pull unexpectedly succeeded?"
fi
assert_file_has_content err.txt "remote 'fromcontainer' uses custom backend 'ostree-rs-ext'"
for x in show-url refs; do
if ${CMD_PREFIX} ostree --repo=repo remote "$x" fromcontainer 2>err.txt; then
assert_file_has_content err.txt "remote 'fromcontainer' uses custom backend 'ostree-rs-ext'"
assert_not_reached "no url expected"
fi
assert_file_has_content err.txt "No \"url\" option in remote"
done
${CMD_PREFIX} ostree --repo=repo remote delete fromcontainer
${CMD_PREFIX} ostree --repo=repo remote add --custom-backend=ostree-rs-ext fromcontainer2 docker://quay.io/examplecorp/foo
if ${CMD_PREFIX} ostree --repo=repo pull fromcontainer2 main 2>err.txt; then
assert_not_reached "pull unexpectedly succeeded?"
fi
assert_file_has_content err.txt "remote 'fromcontainer2' uses custom backend 'ostree-rs-ext'"
${CMD_PREFIX} ostree --repo=repo remote show-url fromcontainer2 >out.txt
assert_file_has_content out.txt docker://quay.io/examplecorp/foo
${CMD_PREFIX} ostree --repo=repo remote delete fromcontainer2
echo "ok custom backend"
cd ${test_tmpdir}
repo_init
${CMD_PREFIX} ostree --repo=repo remote add origin-bad $(cat httpd-address)/ostree/noent
Expand Down

0 comments on commit ce36e05

Please sign in to comment.