summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThong Kuah <tkuah@gitlab.com>2018-11-22 22:40:05 +1300
committerThong Kuah <tkuah@gitlab.com>2018-12-13 21:17:25 +1300
commitc86c392e244b69fb7efd26ea03235005d62102ef (patch)
tree4f29f35a0aaa9bd0aa40057b1ea0d1e82bd1ba61
parente7a6b841684f9a2929b16176b223ea44bfc26332 (diff)
downloadgitlab-ce-34758-qa-spec-group-clusters.tar.gz
Group cluster QA spec34758-qa-spec-group-clusters
-rw-r--r--app/views/layouts/nav/sidebar/_group.html.haml2
-rw-r--r--qa/qa.rb20
-rw-r--r--qa/qa/page/clusters/shared/add.rb19
-rw-r--r--qa/qa/page/clusters/shared/add_existing.rb44
-rw-r--r--qa/qa/page/clusters/shared/index.rb19
-rw-r--r--qa/qa/page/clusters/shared/show.rb40
-rw-r--r--qa/qa/page/group/kubernetes/kubernetes/add.rb13
-rw-r--r--qa/qa/page/group/kubernetes/kubernetes/add_existing.rb13
-rw-r--r--qa/qa/page/group/kubernetes/kubernetes/index.rb13
-rw-r--r--qa/qa/page/group/kubernetes/kubernetes/show.rb13
-rw-r--r--qa/qa/page/group/menu.rb28
-rw-r--r--qa/qa/page/project/operations/kubernetes/add.rb8
-rw-r--r--qa/qa/page/project/operations/kubernetes/add_existing.rb33
-rw-r--r--qa/qa/page/project/operations/kubernetes/index.rb8
-rw-r--r--qa/qa/page/project/operations/kubernetes/show.rb29
-rw-r--r--qa/qa/resource/group_kubernetes_cluster.rb53
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/group_cluster_with_auto_devops_spec.rb85
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 477030a20c1..d3dd040fce9 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
diff --git a/qa/qa.rb b/qa/qa.rb
index bf05b6b53ca..a9e96084997 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -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