Pcore
view release on metacpan or search on metacpan
lib/Pcore/API/Docker/Hub.pm view on Meta::CPAN
sub _req ( $self, $method, $endpoint, $data = undef ) {
if ( !$self->{_login_token} ) {
my $res = $self->_login;
# login ok
return $res if !$res;
}
return $self->_req_no_auth( $method, $endpoint, $data );
}
sub _req_no_auth ( $self, $method, $endpoint, $data = undef ) {
my $res = P->http->request(
method => $method,
url => $BASE_URL . $endpoint,
headers => [
'Content-Type' => 'application/json',
$self->{_login_token} ? ( Authorization => 'JWT ' . $self->{_login_token} ) : (),
],
data => $data ? P->data->to_json($data) : undef
);
return res [ $res->{status}, $res->{reason} ], $res->{data} && $res->{data}->$* ? P->data->from_json( $res->{data} ) : ();
}
# USER / NAMESPACE
sub get_user ( $self, $username ) {
return $self->_req_no_auth( 'GET', "/users/$username/" );
}
sub get_user_registry_settings ( $self, $username ) {
return $self->_req( 'GET', "/users/$username/registry-settings/" );
}
sub get_user_orgs ( $self ) {
my $res = $self->_req( 'GET', "/user/orgs/?page_size=$DEF_PAGE_SIZE&page=1" );
if ($res) {
my $data;
for my $org ( $res->{data}->{results}->@* ) {
$data->{ $org->{orgname} } = $org;
}
$res->{data} = $data;
}
return $res;
}
# CREATE REPO / AUTOMATED BUILD
sub create_repo ( $self, $repo_id, %args ) {
%args = (
private => 0,
desc => $EMPTY,
full_desc => $EMPTY,
%args
);
my ( $namespace, $name ) = split m[/]sm, $repo_id;
return $self->_req(
'POST',
'/repositories/',
{ namespace => $namespace,
name => $name,
is_private => $args{private},
description => $args{desc},
full_description => $args{full_desc},
}
);
}
# TODO not work
sub create_autobuild ( $self, $repo_id, $git_repo_id, $desc, %args ) {
%args = (
desc => undef,
private => 0,
active => 1,
build_tags => undef,
%args,
);
my ( $namespace, $name ) = split m[/]sm, $repo_id;
my $build_tags;
# prepare build tags
if ( !$args{build_tags} ) {
$build_tags = [
{ name => '{sourceref}', # docker build tag name
source_type => $DOCKERHUB_SOURCE_TYPE_NAME->{$DOCKERHUB_SOURCE_TYPE_TAG}, # Branch, Tag
source_name => '/.*/', # barnch / tag name in the source repository
dockerfile_location => '/',
},
];
}
else {
for ( $args{build_tags}->@* ) {
my %build_tags = $_->%*;
$build_tags{source_type} = $DOCKERHUB_SOURCE_TYPE_NAME->{ lc $build_tags{source_type} };
push $build_tags->@*, \%build_tags;
}
}
return $self->_req(
'POST',
"/repositories/$repo_id/autobuild/",
{ namespace => $namespace,
name => $name,
description => $desc,
is_private => $args{private} ? \1 : \0,
active => $args{active} ? \1 : \0,
dockerhub_repo_name => $repo_id,
provider => 'git',
vcs_repo_name => $git_repo_id,
description => $desc,
build_tags => $build_tags,
}
);
}
# REPO
sub get_all_repos ( $self, $namespace ) {
my $res = $self->_req( 'GET', "/users/$namespace/repositories/" );
if ($res) {
my $data;
for my $repo ( $res->{data}->@* ) {
$repo->{id} = "$repo->{namespace}/$repo->{name}";
$data->{ $repo->{id} } = $repo;
}
$res->{data} = $data;
}
return $res;
}
sub get_repo ( $self, $repo_id ) {
lib/Pcore/API/Docker/Hub.pm view on Meta::CPAN
for my $link ( $res->{data}->{results}->@* ) {
$data->{ $link->{id} } = $link;
}
$res->{data} = $data;
}
return $res;
}
sub create_autobuild_link ( $self, $repo_id, $target_repo_id ) {
return $self->_req( 'POST', "/repositories/$repo_id/links/", { to_repo => $target_repo_id } );
}
sub delete_autobuild_link ( $self, $repo_id, $link_id ) {
return $self->_req( 'DELETE', "/repositories/$repo_id/links/$link_id/" );
}
# BUILD
# TODO get all pages
sub get_build_history ( $self, $repo_id ) {
my $res = $self->_req( 'GET', "/repositories/$repo_id/buildhistory/?page_size=$DEF_PAGE_SIZE&page=1" );
if ($res) {
my $data;
for my $build ( $res->{data}->{results}->@* ) {
$data->{ $build->{id} } = $build;
$build->{status_text} = exists $BUILD_STATUS_TEXT->{ $build->{status} } ? $BUILD_STATUS_TEXT->{ $build->{status} } : $build->{status};
}
$res->{data} = $data;
}
return $res;
}
sub get_autobuild_settings ( $self, $repo_id ) {
return $self->_req( 'GET', "/repositories/$repo_id/autobuild/" );
}
# AUTOBUILD TAGS
sub get_autobuild_tags ( $self, $repo_id ) {
my $res = $self->_req( 'GET', "/repositories/$repo_id/autobuild/tags/" );
if ($res) {
my $data;
for my $tag ( $res->{data}->{results}->@* ) {
$data->{ $tag->{id} } = $tag;
}
$res->{data} = $data;
}
return $res;
}
sub create_autobuild_tag ( $self, $repo_id, $tag_name, $source_name, $source_type, $dockerfile_location ) {
my ( $namespace, $name ) = split m[/]sm, $repo_id;
return $self->_req(
'POST',
"/repositories/$repo_id/autobuild/tags/",
{ name => $tag_name,
dockerfile_location => $dockerfile_location // '/',
source_name => $source_name,
source_type => $DOCKERHUB_SOURCE_TYPE_NAME->{ lc $source_type },
isNew => \1,
repoName => $name,
namespace => $namespace,
}
);
}
sub delete_autobuild_tag_by_id ( $self, $repo_id, $autobuild_tag_id ) {
return $self->_req( 'DELETE', "/repositories/$repo_id/autobuild/tags/$autobuild_tag_id/" );
}
sub delete_autobuild_tag_by_name ( $self, $repo_id, $autobuild_tag_name ) {
my $res = $self->get_autobuild_tags($repo_id);
return $res if !$res;
my $found_autobuild_tag;
for my $autobuild_tag ( values $res->{data}->%* ) {
if ( $autobuild_tag->{name} eq $autobuild_tag_name ) {
$found_autobuild_tag = $autobuild_tag;
last;
}
}
if ( !$found_autobuild_tag ) {
return res [ 404, 'Autobuild tag was not found' ];
}
else {
return $self->delete_autobuild_tag_by_id( $repo_id, $found_autobuild_tag->{id} );
}
}
sub trigger_autobuild ( $self, $repo_id, $source_name, $source_type ) {
return $self->_req(
'POST',
"/repositories/$repo_id/autobuild/trigger-build/",
{ source_name => $source_name,
source_type => $DOCKERHUB_SOURCE_TYPE_NAME->{ lc $source_type },
dockerfile_location => '/',
}
);
}
sub trigger_autobuild_by_tag_name ( $self, $repo_id, $autobuild_tag_name ) {
my $res = $self->get_autobuild_tags($repo_id);
return $res if !$res;
my $found_autobuild_tag;
( run in 2.874 seconds using v1.01-cache-2.11-cpan-71847e10f99 )