diff options
author | Thong Kuah <tkuah@gitlab.com> | 2018-11-22 22:40:05 +1300 |
---|---|---|
committer | Thong Kuah <tkuah@gitlab.com> | 2018-11-22 23:29:40 +1300 |
commit | 1b95882c39ada0eb78b810f500c8cf1f2083d4bd (patch) | |
tree | f6d764ae1d97c202b7d1cc02a6bee119e0842baa | |
parent | 6a31259ccef5106126421ab5a93fd303a9326e4a (diff) | |
download | gitlab-ce-group-cluster-qa-spec.tar.gz |
Group cluster QA specgroup-cluster-qa-spec
-rw-r--r-- | app/views/layouts/nav/sidebar/_group.html.haml | 2 | ||||
-rw-r--r-- | qa/qa.rb | 20 | ||||
-rw-r--r-- | qa/qa/page/clusters/shared/add.rb | 19 | ||||
-rw-r--r-- | qa/qa/page/clusters/shared/add_existing.rb | 44 | ||||
-rw-r--r-- | qa/qa/page/clusters/shared/index.rb | 19 | ||||
-rw-r--r-- | qa/qa/page/clusters/shared/show.rb | 40 | ||||
-rw-r--r-- | qa/qa/page/group/kubernetes/kubernetes/add.rb | 13 | ||||
-rw-r--r-- | qa/qa/page/group/kubernetes/kubernetes/add_existing.rb | 13 | ||||
-rw-r--r-- | qa/qa/page/group/kubernetes/kubernetes/index.rb | 13 | ||||
-rw-r--r-- | qa/qa/page/group/kubernetes/kubernetes/show.rb | 13 | ||||
-rw-r--r-- | qa/qa/page/group/menu.rb | 28 | ||||
-rw-r--r-- | qa/qa/page/project/operations/kubernetes/add.rb | 8 | ||||
-rw-r--r-- | qa/qa/page/project/operations/kubernetes/add_existing.rb | 33 | ||||
-rw-r--r-- | qa/qa/page/project/operations/kubernetes/index.rb | 8 | ||||
-rw-r--r-- | qa/qa/page/project/operations/kubernetes/show.rb | 29 | ||||
-rw-r--r-- | qa/qa/resource/group_kubernetes_cluster.rb | 53 | ||||
-rw-r--r-- | qa/qa/specs/features/browser_ui/7_configure/auto_devops/group_cluster_with_auto_devops_spec.rb | 85 |
17 files changed, 365 insertions, 75 deletions
diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index 3cd5168c1f7..70032ed2055 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -118,7 +118,7 @@ - if group_sidebar_link?(:kubernetes) = nav_link(controller: [:clusters]) do - = link_to group_clusters_path(@group) do + = link_to group_clusters_path(@group), class: 'qa-kubernetes-kubernetes-link' do .nav-icon-container = sprite_icon('cloud-gear') %span.nav-item-name @@ -55,6 +55,7 @@ module QA autoload :Runner, 'qa/resource/runner' autoload :PersonalAccessToken, 'qa/resource/personal_access_token' autoload :KubernetesCluster, 'qa/resource/kubernetes_cluster' + autoload :GroupKubernetesCluster, 'qa/resource/group_kubernetes_cluster' autoload :User, 'qa/resource/user' autoload :ProjectMilestone, 'qa/resource/project_milestone' autoload :Wiki, 'qa/resource/wiki' @@ -141,6 +142,16 @@ module QA module Group autoload :New, 'qa/page/group/new' autoload :Show, 'qa/page/group/show' + autoload :Menu, 'qa/page/group/menu' + + module Kubernetes + module Kubernetes + autoload :Index, 'qa/page/group/kubernetes/kubernetes/index' + autoload :Add, 'qa/page/group/kubernetes/kubernetes/add' + autoload :AddExisting, 'qa/page/group/kubernetes/kubernetes/add_existing' + autoload :Show, 'qa/page/group/kubernetes/kubernetes/show' + end + end end module File @@ -152,6 +163,15 @@ module QA end end + module Clusters + module Shared + autoload :Index, 'qa/page/clusters/shared/index' + autoload :Add, 'qa/page/clusters/shared/add' + autoload :AddExisting, 'qa/page/clusters/shared/add_existing' + autoload :Show, 'qa/page/clusters/shared/show' + end + end + module Project autoload :New, 'qa/page/project/new' autoload :Show, 'qa/page/project/show' diff --git a/qa/qa/page/clusters/shared/add.rb b/qa/qa/page/clusters/shared/add.rb new file mode 100644 index 00000000000..29c8eb4d22a --- /dev/null +++ b/qa/qa/page/clusters/shared/add.rb @@ -0,0 +1,19 @@ +module QA + module Page + module Clusters + module Shared + module Add + def self.included(base) + base.view 'app/views/clusters/clusters/new.html.haml' do + element :add_existing_cluster_button, "Add existing cluster" + end + end + + def add_existing_cluster + click_on 'Add existing cluster' + end + end + end + end + end +end diff --git a/qa/qa/page/clusters/shared/add_existing.rb b/qa/qa/page/clusters/shared/add_existing.rb new file mode 100644 index 00000000000..c1cd87d34fa --- /dev/null +++ b/qa/qa/page/clusters/shared/add_existing.rb @@ -0,0 +1,44 @@ +module QA + module Page + module Clusters + module Shared + module AddExisting + def self.included(base) + base.view 'app/views/clusters/clusters/user/_form.html.haml' do + element :cluster_name, 'text_field :name' # rubocop:disable QA/ElementWithPattern + element :api_url, 'text_field :api_url' # rubocop:disable QA/ElementWithPattern + element :ca_certificate, 'text_area :ca_cert' # rubocop:disable QA/ElementWithPattern + element :token, 'text_field :token' # rubocop:disable QA/ElementWithPattern + element :add_cluster_button, "submit s_('ClusterIntegration|Add Kubernetes cluster')" # rubocop:disable QA/ElementWithPattern + element :rbac_checkbox + end + end + + def set_cluster_name(name) + fill_in 'cluster_name', with: name + end + + def set_api_url(api_url) + fill_in 'cluster_platform_kubernetes_attributes_api_url', with: api_url + end + + def set_ca_certificate(ca_certificate) + fill_in 'cluster_platform_kubernetes_attributes_ca_cert', with: ca_certificate + end + + def set_token(token) + fill_in 'cluster_platform_kubernetes_attributes_token', with: token + end + + def add_cluster! + click_on 'Add Kubernetes cluster' + end + + def check_rbac! + check_element :rbac_checkbox + end + end + end + end + end +end diff --git a/qa/qa/page/clusters/shared/index.rb b/qa/qa/page/clusters/shared/index.rb new file mode 100644 index 00000000000..1ae8eb4fa7e --- /dev/null +++ b/qa/qa/page/clusters/shared/index.rb @@ -0,0 +1,19 @@ +module QA + module Page + module Clusters + module Shared + module Index + def self.included(base) + base.view 'app/views/clusters/clusters/_empty_state.html.haml' do + element :add_kubernetes_cluster_button, "link_to s_('ClusterIntegration|Add Kubernetes cluster')" # rubocop:disable QA/ElementWithPattern + end + end + + def add_kubernetes_cluster + click_on 'Add Kubernetes cluster' + end + end + end + end + end +end diff --git a/qa/qa/page/clusters/shared/show.rb b/qa/qa/page/clusters/shared/show.rb new file mode 100644 index 00000000000..d516d1e36ba --- /dev/null +++ b/qa/qa/page/clusters/shared/show.rb @@ -0,0 +1,40 @@ +module QA + module Page + module Clusters + module Shared + module Show + def self.included(base) + base.view 'app/assets/javascripts/clusters/components/application_row.vue' do + element :application_row, 'js-cluster-application-row-${this.id}' # rubocop:disable QA/ElementWithPattern + element :install_button, "s__('ClusterIntegration|Install')" # rubocop:disable QA/ElementWithPattern + element :installed_button, "s__('ClusterIntegration|Installed')" # rubocop:disable QA/ElementWithPattern + end + + base.view 'app/assets/javascripts/clusters/components/applications.vue' do + element :ingress_ip_address, 'id="ingress-ip-address"' # rubocop:disable QA/ElementWithPattern + end + end + + def install!(application_name) + within(".js-cluster-application-row-#{application_name}") do + page.has_button?('Install', wait: 30) + click_on 'Install' + end + end + + def await_installed(application_name) + within(".js-cluster-application-row-#{application_name}") do + page.has_text?('Installed', wait: 300) + end + end + + def ingress_ip + # We need to wait longer since it can take some time before the + # ip address is assigned for the ingress controller + page.find('#ingress-ip-address', wait: 500).value + end + end + end + end + end +end diff --git a/qa/qa/page/group/kubernetes/kubernetes/add.rb b/qa/qa/page/group/kubernetes/kubernetes/add.rb new file mode 100644 index 00000000000..cdf2d56610d --- /dev/null +++ b/qa/qa/page/group/kubernetes/kubernetes/add.rb @@ -0,0 +1,13 @@ +module QA + module Page + module Group + module Kubernetes + module Kubernetes + class Add < Page::Base + include QA::Page::Clusters::Shared::Add + end + end + end + end + end +end diff --git a/qa/qa/page/group/kubernetes/kubernetes/add_existing.rb b/qa/qa/page/group/kubernetes/kubernetes/add_existing.rb new file mode 100644 index 00000000000..3779613c37d --- /dev/null +++ b/qa/qa/page/group/kubernetes/kubernetes/add_existing.rb @@ -0,0 +1,13 @@ +module QA + module Page + module Group + module Kubernetes + module Kubernetes + class AddExisting < Page::Base + include QA::Page::Clusters::Shared::AddExisting + end + end + end + end + end +end diff --git a/qa/qa/page/group/kubernetes/kubernetes/index.rb b/qa/qa/page/group/kubernetes/kubernetes/index.rb new file mode 100644 index 00000000000..66fb80913c8 --- /dev/null +++ b/qa/qa/page/group/kubernetes/kubernetes/index.rb @@ -0,0 +1,13 @@ +module QA + module Page + module Group + module Kubernetes + module Kubernetes + class Index < Page::Base + include QA::Page::Clusters::Shared::Index + end + end + end + end + end +end diff --git a/qa/qa/page/group/kubernetes/kubernetes/show.rb b/qa/qa/page/group/kubernetes/kubernetes/show.rb new file mode 100644 index 00000000000..39e398b2795 --- /dev/null +++ b/qa/qa/page/group/kubernetes/kubernetes/show.rb @@ -0,0 +1,13 @@ +module QA + module Page + module Group + module Kubernetes + module Kubernetes + class Show < Page::Base + include QA::Page::Clusters::Shared::Show + end + end + end + end + end +end diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb new file mode 100644 index 00000000000..77ce28e7a43 --- /dev/null +++ b/qa/qa/page/group/menu.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + class Menu < Page::Base + view 'app/views/layouts/nav/sidebar/_group.html.haml' do + element :group_sidebar + element :kubernetes_kubernetes_link + end + + def click_kubernetes_kubernetes + within_sidebar do + click_link(:kubernetes_kubernetes_link) + end + end + + private + + def within_sidebar + within_element(:group_sidebar) do + yield + end + end + end + end + end +end diff --git a/qa/qa/page/project/operations/kubernetes/add.rb b/qa/qa/page/project/operations/kubernetes/add.rb index 939f912ea85..3b42ed301c7 100644 --- a/qa/qa/page/project/operations/kubernetes/add.rb +++ b/qa/qa/page/project/operations/kubernetes/add.rb @@ -4,13 +4,7 @@ module QA module Operations module Kubernetes class Add < Page::Base - view 'app/views/clusters/clusters/new.html.haml' do - element :add_existing_cluster_button, "Add existing cluster" # rubocop:disable QA/ElementWithPattern - end - - def add_existing_cluster - click_on 'Add existing cluster' - end + include QA::Page::Clusters::Shared::Add end end end diff --git a/qa/qa/page/project/operations/kubernetes/add_existing.rb b/qa/qa/page/project/operations/kubernetes/add_existing.rb index f3ab636ecc1..af9e7ec1d86 100644 --- a/qa/qa/page/project/operations/kubernetes/add_existing.rb +++ b/qa/qa/page/project/operations/kubernetes/add_existing.rb @@ -4,38 +4,7 @@ module QA module Operations module Kubernetes class AddExisting < Page::Base - view 'app/views/clusters/clusters/user/_form.html.haml' do - element :cluster_name, 'text_field :name' # rubocop:disable QA/ElementWithPattern - element :api_url, 'text_field :api_url' # rubocop:disable QA/ElementWithPattern - element :ca_certificate, 'text_area :ca_cert' # rubocop:disable QA/ElementWithPattern - element :token, 'text_field :token' # rubocop:disable QA/ElementWithPattern - element :add_cluster_button, "submit s_('ClusterIntegration|Add Kubernetes cluster')" # rubocop:disable QA/ElementWithPattern - element :rbac_checkbox - end - - def set_cluster_name(name) - fill_in 'cluster_name', with: name - end - - def set_api_url(api_url) - fill_in 'cluster_platform_kubernetes_attributes_api_url', with: api_url - end - - def set_ca_certificate(ca_certificate) - fill_in 'cluster_platform_kubernetes_attributes_ca_cert', with: ca_certificate - end - - def set_token(token) - fill_in 'cluster_platform_kubernetes_attributes_token', with: token - end - - def add_cluster! - click_on 'Add Kubernetes cluster' - end - - def check_rbac! - check_element :rbac_checkbox - end + include QA::Page::Clusters::Shared::AddExisting end end end diff --git a/qa/qa/page/project/operations/kubernetes/index.rb b/qa/qa/page/project/operations/kubernetes/index.rb index 67a74af1cd2..d741ad465d7 100644 --- a/qa/qa/page/project/operations/kubernetes/index.rb +++ b/qa/qa/page/project/operations/kubernetes/index.rb @@ -4,13 +4,7 @@ module QA module Operations module Kubernetes class Index < Page::Base - view 'app/views/clusters/clusters/_empty_state.html.haml' do - element :add_kubernetes_cluster_button, "link_to s_('ClusterIntegration|Add Kubernetes cluster')" # rubocop:disable QA/ElementWithPattern - end - - def add_kubernetes_cluster - click_on 'Add Kubernetes cluster' - end + include QA::Page::Clusters::Shared::Index end end end diff --git a/qa/qa/page/project/operations/kubernetes/show.rb b/qa/qa/page/project/operations/kubernetes/show.rb index 9e8f9ba79d7..fcceaa01429 100644 --- a/qa/qa/page/project/operations/kubernetes/show.rb +++ b/qa/qa/page/project/operations/kubernetes/show.rb @@ -4,34 +4,7 @@ module QA module Operations module Kubernetes class Show < Page::Base - view 'app/assets/javascripts/clusters/components/application_row.vue' do - element :application_row, 'js-cluster-application-row-${this.id}' # rubocop:disable QA/ElementWithPattern - element :install_button, "s__('ClusterIntegration|Install')" # rubocop:disable QA/ElementWithPattern - element :installed_button, "s__('ClusterIntegration|Installed')" # rubocop:disable QA/ElementWithPattern - end - - view 'app/assets/javascripts/clusters/components/applications.vue' do - element :ingress_ip_address, 'id="ingress-ip-address"' # rubocop:disable QA/ElementWithPattern - end - - def install!(application_name) - within(".js-cluster-application-row-#{application_name}") do - page.has_button?('Install', wait: 30) - click_on 'Install' - end - end - - def await_installed(application_name) - within(".js-cluster-application-row-#{application_name}") do - page.has_text?('Installed', wait: 300) - end - end - - def ingress_ip - # We need to wait longer since it can take some time before the - # ip address is assigned for the ingress controller - page.find('#ingress-ip-address', wait: 500).value - end + include QA::Page::Clusters::Shared::Show end end end diff --git a/qa/qa/resource/group_kubernetes_cluster.rb b/qa/qa/resource/group_kubernetes_cluster.rb new file mode 100644 index 00000000000..ee8aeef2de1 --- /dev/null +++ b/qa/qa/resource/group_kubernetes_cluster.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'securerandom' + +module QA + module Resource + class GroupKubernetesCluster < Base + attr_writer :Group, :cluster, + :install_helm_tiller, :install_ingress + + attribute :ingress_ip do + Page::Group::Kubenertes::Kubernetes::Show.perform(&:ingress_ip) + end + + def fabricate! + @group.visit! + + Page::Group::Menu.perform( + &:click_kubernetes_kubernetes) + + Page::Group::Kubernetes::Kubernetes::Index.perform( + &:add_kubernetes_cluster) + + Page::Group::Kubernetes::Kubernetes::Add.perform( + &:add_existing_cluster) + + Page::Group::Kubernetes::Kubernetes::AddExisting.perform do |page| + page.set_cluster_name(@cluster.cluster_name) + page.set_api_url(@cluster.api_url) + page.set_ca_certificate(@cluster.ca_certificate) + page.set_token(@cluster.token) + page.check_rbac! if @cluster.rbac + page.add_cluster! + end + + if @install_helm_tiller + Page::Group::Kubernetes::Kubernetes::Show.perform do |page| + # We must wait a few seconds for permissions to be set up correctly for new cluster + sleep 10 + + # Helm must be installed before everything else + page.install!(:helm) + page.await_installed(:helm) + + page.install!(:ingress) if @install_ingress + + page.await_installed(:ingress) if @install_ingress + end + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/group_cluster_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/group_cluster_with_auto_devops_spec.rb new file mode 100644 index 00000000000..5061c4e55c3 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/group_cluster_with_auto_devops_spec.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require 'pathname' + +module QA + context 'Configure', :orchestrated, :kubernetes do + describe 'Group cluster' do + after do + @cluster&.remove! + end + + [true, false].each do |rbac| + context "when rbac is #{rbac ? 'enabled' : 'disabled'}" do + it 'user creates a new project, new group cluster and runs auto devops' do + Runtime::Browser.visit(:gitlab, Page::Main::Login) + Page::Main::Login.act { sign_in_using_credentials } + + project = Resource::Project.fabricate! do |p| + p.name = 'project-with-autodevops' + p.description = 'Project with Auto Devops' + end + + group = project.group + + # Disable code_quality check in Auto DevOps pipeline as it takes + # too long and times out the test + Resource::CiVariable.fabricate! do |resource| + resource.project = project + resource.key = 'CODE_QUALITY_DISABLED' + resource.value = '1' + end + + # Create Auto Devops compatible repo + Resource::Repository::ProjectPush.fabricate! do |push| + push.project = project + push.directory = Pathname + .new(__dir__) + .join('../../../../../fixtures/auto_devops_rack') + push.commit_message = 'Create Auto DevOps compatible rack application' + end + + Page::Project::Show.act { wait_for_push } + + # Create and connect K8s cluster + @cluster = Service::KubernetesCluster.new(rbac: rbac).create! + kubernetes_cluster = Resource::GroupKubernetesCluster.fabricate! do |cluster| + cluster.group = group + cluster.cluster = @cluster + cluster.install_helm_tiller = true + cluster.install_ingress = true + end + kubernetes_cluster.populate(:ingress_ip) + + project.visit! + Page::Project::Menu.act { click_ci_cd_settings } + Page::Project::Settings::CICD.perform do |p| + p.enable_auto_devops_with_domain( + "#{kubernetes_cluster.ingress_ip}.nip.io") + end + + project.visit! + Page::Project::Menu.act { click_ci_cd_pipelines } + Page::Project::Pipeline::Index.act { go_to_latest_pipeline } + + Page::Project::Pipeline::Show.perform do |pipeline| + expect(pipeline).to have_build('build', status: :success, wait: 600) + expect(pipeline).to have_build('test', status: :success, wait: 600) + expect(pipeline).to have_build('production', status: :success, wait: 1200) + end + + Page::Project::Menu.act { click_operations_environments } + Page::Project::Operations::Environments::Index.perform do |index| + index.go_to_environment('production') + end + Page::Project::Operations::Environments::Show.perform do |show| + show.view_deployment do + expect(page).to have_content('Hello World!') + end + end + end + end + end + end + end +end |