Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-07-14 03:08:59 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-07-14 03:08:59 +0300
commit13d294a8d8be05421e7d5e34577033ba5b34059c (patch)
treef9aab2c3930cb85e9afbb111063930a1bdd1c156 /lib/gitlab/harbor
parenta269fb8e7cca24b826dd3f53485641ffce93bbee (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/harbor')
-rw-r--r--lib/gitlab/harbor/client.rb38
-rw-r--r--lib/gitlab/harbor/query.rb126
2 files changed, 160 insertions, 4 deletions
diff --git a/lib/gitlab/harbor/client.rb b/lib/gitlab/harbor/client.rb
index 06142ae2b40..ee40725ba95 100644
--- a/lib/gitlab/harbor/client.rb
+++ b/lib/gitlab/harbor/client.rb
@@ -21,14 +21,44 @@ module Gitlab
{ success: response.success? }
end
+ def get_repositories(params)
+ get(url("projects/#{integration.project_name}/repositories"), params)
+ end
+
+ def get_artifacts(params)
+ repository_name = params.delete(:repository_name)
+ get(url("projects/#{integration.project_name}/repositories/#{repository_name}/artifacts"), params)
+ end
+
+ def get_tags(params)
+ repository_name = params.delete(:repository_name)
+ artifact_name = params.delete(:artifact_name)
+ get(
+ url("projects/#{integration.project_name}/repositories/#{repository_name}/artifacts/#{artifact_name}/tags"),
+ params
+ )
+ end
+
private
- def url(path)
- Gitlab::Utils.append_path(base_url, path)
+ def get(path, params = {})
+ options = { headers: headers, query: params }
+ response = Gitlab::HTTP.get(path, options)
+
+ raise Gitlab::Harbor::Client::Error, 'request error' unless response.success?
+
+ {
+ body: Gitlab::Json.parse(response.body),
+ total_count: response.headers['x-total-count'].to_i
+ }
+ rescue JSON::ParserError
+ raise Gitlab::Harbor::Client::Error, 'invalid response format'
end
- def base_url
- Gitlab::Utils.append_path(integration.url, '/api/v2.0/')
+ # url must be used within get method otherwise this would avoid validation by GitLab::HTTP
+ def url(path)
+ base_url = Gitlab::Utils.append_path(integration.url, '/api/v2.0/')
+ Gitlab::Utils.append_path(base_url, path)
end
def headers
diff --git a/lib/gitlab/harbor/query.rb b/lib/gitlab/harbor/query.rb
new file mode 100644
index 00000000000..c120810ecf1
--- /dev/null
+++ b/lib/gitlab/harbor/query.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Harbor
+ class Query
+ include ActiveModel::Validations
+
+ attr_reader :client, :repository_id, :artifact_id, :search, :limit, :sort, :page
+
+ DEFAULT_LIMIT = 10
+ SORT_REGEX = %r{\A(creation_time|update_time|name) (asc|desc)\z}.freeze
+
+ validates :page, numericality: { greater_than: 0, integer: true }, allow_blank: true
+ validates :limit, numericality: { greater_than: 0, less_than_or_equal_to: 25, integer: true }, allow_blank: true
+ validates :repository_id, format: {
+ with: /\A[a-zA-Z0-9\_\.\-$]+\z/,
+ message: 'Id invalid'
+ }, allow_blank: true
+ validates :artifact_id, format: {
+ with: /\A[a-zA-Z0-9\_\.\-$]+\z/,
+ message: 'Id invalid'
+ }, allow_blank: true
+ validates :sort, format: {
+ with: SORT_REGEX,
+ message: 'params invalid'
+ }, allow_blank: true
+ validates :search, format: {
+ with: /\A([a-z\_]*=[a-zA-Z0-9\- :]*,*)*\z/,
+ message: 'params invalid'
+ }, allow_blank: true
+
+ def initialize(integration, params)
+ @client = Client.new(integration)
+ @repository_id = params[:repository_id]
+ @artifact_id = params[:artifact_id]
+ @search = params[:search]
+ @limit = params[:limit]
+ @sort = params[:sort]
+ @page = params[:page]
+ validate
+ end
+
+ def repositories
+ result = @client.get_repositories(query_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ def artifacts
+ result = @client.get_artifacts(query_artifacts_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ def tags
+ result = @client.get_tags(query_tags_options)
+ return [] if result[:total_count] == 0
+
+ Kaminari.paginate_array(
+ result[:body],
+ limit: query_page_size,
+ total_count: result[:total_count]
+ )
+ end
+
+ private
+
+ def query_artifacts_options
+ options = query_options
+ options[:repository_name] = repository_id
+ options[:with_tag] = true
+
+ options
+ end
+
+ def query_options
+ options = {
+ page: query_page,
+ page_size: query_page_size
+ }
+
+ options[:q] = query_search if search.present?
+ options[:sort] = query_sort if sort.present?
+
+ options
+ end
+
+ def query_tags_options
+ options = query_options
+ options[:repository_name] = repository_id
+ options[:artifact_name] = artifact_id
+
+ options
+ end
+
+ def query_page
+ page.presence || 1
+ end
+
+ def query_page_size
+ (limit.presence || DEFAULT_LIMIT).to_i
+ end
+
+ def query_search
+ search.gsub('=', '=~')
+ end
+
+ def query_sort
+ match = sort.match(SORT_REGEX)
+ order = (match[2] == 'asc' ? '' : '-')
+
+ "#{order}#{match[1]}"
+ end
+ end
+ end
+end