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

docker_images_controller.rb « artifact_registry « gcp « projects « controllers « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cd492e93d14c455f78c612192262d60e9b80114e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# frozen_string_literal: true

module Projects
  module Gcp
    module ArtifactRegistry
      class DockerImagesController < Projects::Gcp::ArtifactRegistry::BaseController
        before_action :require_gcp_params
        before_action :handle_pagination

        REPO_NAME_REGEX = %r{/repositories/(.*)/dockerImages/}

        def index
          result = service.execute(page_token: params[:page_token])

          if result.success?
            @docker_images = process_docker_images(result.payload[:images] || [])
            @next_page_token = result.payload[:next_page_token]
            @artifact_repository_name = artifact_repository_name
            @error = @docker_images.blank? ? 'No docker images' : false
          else
            @error = result.message
          end
        end

        private

        def service
          ::Integrations::GoogleCloudPlatform::ArtifactRegistry::ListDockerImagesService.new(
            project: @project,
            current_user: current_user,
            params: {
              gcp_project_id: gcp_project_id,
              gcp_location: gcp_location,
              gcp_repository: gcp_ar_repository,
              gcp_wlif: gcp_wlif_url
            }
          )
        end

        def process_docker_images(raw_images)
          raw_images.map { |r| process_docker_image(r) }
        end

        def process_docker_image(raw_image)
          DockerImage.new(
            name: raw_image[:name],
            uri: raw_image[:uri],
            tags: raw_image[:tags],
            image_size_bytes: raw_image[:size_bytes],
            media_type: raw_image[:media_type],
            upload_time: raw_image[:uploaded_at],
            build_time: raw_image[:built_at],
            update_time: raw_image[:updated_at]
          )
        end

        def artifact_repository_name
          return unless @docker_images.present?

          (@docker_images.first.name || '')[REPO_NAME_REGEX, 1]
        end

        def handle_pagination
          @page = Integer(params[:page] || 1)
          @page_tokens = {}
          @previous_page_token = nil

          if params[:page_tokens]
            @page_tokens = ::Gitlab::Json.parse(Base64.decode64(params[:page_tokens]))
            @previous_page_token = @page_tokens[(@page - 1).to_s]
          end

          @page_tokens[@page.to_s] = params[:page_token]
          @page_tokens = Base64.encode64(::Gitlab::Json.dump(@page_tokens.compact))
        end

        def require_gcp_params
          return unless gcp_project_id.blank? || gcp_location.blank? || gcp_ar_repository.blank? || gcp_wlif_url.blank?

          redirect_to new_namespace_project_gcp_artifact_registry_setup_path
        end

        def gcp_project_id
          params[:gcp_project_id]
        end

        def gcp_location
          params[:gcp_location]
        end

        def gcp_ar_repository
          params[:gcp_ar_repository]
        end

        def gcp_wlif_url
          params[:gcp_wlif_url]
        end

        class DockerImage
          include ActiveModel::API

          attr_accessor :name, :uri, :tags, :image_size_bytes, :upload_time, :media_type, :build_time, :update_time

          SHORT_NAME_REGEX = %r{dockerImages/(.*)$}

          def short_name
            (name || '')[SHORT_NAME_REGEX, 1]
          end

          def updated_at
            return unless update_time

            Time.zone.parse(update_time)
          end

          def built_at
            return unless build_time

            Time.zone.parse(build_time)
          end

          def uploaded_at
            return unless upload_time

            Time.zone.parse(upload_time)
          end

          def details_url
            "https://#{uri}"
          end
        end
      end
    end
  end
end