diff --git a/app/views/groups/dependency_proxies/_url.html.haml b/app/views/groups/dependency_proxies/_url.html.haml index 785ad8f94fd485080120ed45990e0c585a42f55a..b3fb1cf05a2c9db6208fdbb381dda8dea4292e0b 100644 --- a/app/views/groups/dependency_proxies/_url.html.haml +++ b/app/views/groups/dependency_proxies/_url.html.haml @@ -8,5 +8,5 @@ = clipboard_button(text: "#{proxy_url}", title: _("Copy %{proxy_url}") % { proxy_url: proxy_url }) .row - .col-12.help-block.gl-mt-3 + .col-12.help-block.gl-mt-3{ data: { qa_selector: 'dependency_proxy_count' } } = _('Contains %{count} blobs of images (%{size})') % { count: @blobs_count, size: number_to_human_size(@blobs_total_size) } diff --git a/app/views/groups/dependency_proxies/show.html.haml b/app/views/groups/dependency_proxies/show.html.haml index 5cf4ff4bc26e544627d55bc8d0114e9c497307b1..177018af830edc862b4d06162103f1fb625f8247 100644 --- a/app/views/groups/dependency_proxies/show.html.haml +++ b/app/views/groups/dependency_proxies/show.html.haml @@ -13,7 +13,7 @@ .form-group %h5.prepend-top-20= _('Enable proxy') .js-dependency-proxy-toggle-area - = render "shared/buttons/project_feature_toggle", is_checked: @dependency_proxy.enabled?, label: s_("DependencyProxy|Toggle Dependency Proxy") do + = render "shared/buttons/project_feature_toggle", is_checked: @dependency_proxy.enabled?, label: s_("DependencyProxy|Toggle Dependency Proxy"), data: { qa_selector: 'dependency_proxy_setting_toggle' } do = f.hidden_field :enabled, { class: 'js-project-feature-toggle-input'} - if @dependency_proxy.enabled diff --git a/qa/qa.rb b/qa/qa.rb index 88d9ea13045785004d3ac61e3214a4c7a596416e..965cc88e50c8f4a79a4254fbf7fb7b1593cb41df 100644 --- a/qa/qa.rb +++ b/qa/qa.rb @@ -239,6 +239,7 @@ module Group autoload :Menu, 'qa/page/group/menu' autoload :Members, 'qa/page/group/members' autoload :BulkImport, 'qa/page/group/bulk_import' + autoload :DependencyProxy, 'qa/page/group/dependency_proxy' module Milestone autoload :Index, 'qa/page/group/milestone/index' diff --git a/qa/qa/page/group/dependency_proxy.rb b/qa/qa/page/group/dependency_proxy.rb new file mode 100644 index 0000000000000000000000000000000000000000..f637c79cffcb7536dcd28939566a249a5d38fd1f --- /dev/null +++ b/qa/qa/page/group/dependency_proxy.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + class DependencyProxy < QA::Page::Base + view 'app/views/groups/dependency_proxies/show.html.haml' do + element :dependency_proxy_setting_toggle + end + + view 'app/views/groups/dependency_proxies/_url.html.haml' do + element :dependency_proxy_count + end + + def has_dependency_proxy_enabled? + toggle = find_element(:dependency_proxy_setting_toggle) + toggle[:class].include?('is-checked') + end + + def has_blob_count?(blob_text) + has_element?(:dependency_proxy_count, text: blob_text) + end + end + end + end +end diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb index 9f793934dc90f9a3925e74ae630c290f1d08f601..7f8d3de4b4cd2a1c6e4530e2dae6172390d75d73 100644 --- a/qa/qa/page/group/menu.rb +++ b/qa/qa/page/group/menu.rb @@ -70,6 +70,14 @@ def go_to_group_packages end end + def go_to_dependency_proxy + hover_group_packages do + within_submenu do + click_element(:sidebar_menu_item_link, menu_item: 'Dependency Proxy') + end + end + end + private def hover_issues diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..be1d0dd8e8141721fa53b51f997ca79b591e15b8 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :orchestrated, :registry do + describe 'Dependency Proxy' do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'dependency-proxy-project' + project.visibility = :private + end + end + + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.name}"] + runner.executor = :docker + runner.project = project + end + end + + let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } + let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" } + let(:dependency_proxy_url) { "#{gitlab_host_with_port}/#{project.group.full_path}/dependency_proxy/containers" } + + before do + Flow::Login.sign_in + + project.group.visit! + + Page::Group::Menu.perform(&:go_to_dependency_proxy) + + Page::Group::DependencyProxy.perform do |index| + expect(index).to have_dependency_proxy_enabled + end + end + + after do + runner.remove_via_api! + end + + where(:docker_client_version) do + %w[docker:19.03.12 docker:20.10] + end + + with_them do + it "pulls an image using the dependency proxy", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1862' do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([{ + file_path: '.gitlab-ci.yml', + content: + <<~YAML + dependency-proxy-pull-test: + image: "#{docker_client_version}" + services: + - name: "#{docker_client_version}-dind" + command: + - /bin/sh + - -c + - | + apk add --no-cache openssl + true | openssl s_client -showcerts -connect gitlab.test:5050 > /usr/local/share/ca-certificates/gitlab.test.crt + update-ca-certificates + dockerd-entrypoint.sh || exit + before_script: + - apk add curl jq grep + - docker login -u "$CI_DEPENDENCY_PROXY_USER" -p "$CI_DEPENDENCY_PROXY_PASSWORD" "$CI_DEPENDENCY_PROXY_SERVER" + script: + - docker pull #{dependency_proxy_url}/alpine:latest + - TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) + - 'curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1' + - docker pull #{dependency_proxy_url}/alpine:latest + - 'curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1' + tags: + - "runner-for-#{project.name}" + YAML + }]) + end + + project.visit! + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('dependency-proxy-pull-test') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + + project.group.visit! + + Page::Group::Menu.perform(&:go_to_dependency_proxy) + + Page::Group::DependencyProxy.perform do |index| + expect(index).to have_blob_count("Contains 2 blobs of images") + end + end + end + end + end +end