Commit 54657afc authored by Ash McKenzie's avatar Ash McKenzie

Geo: LFS tests for HTTP & SSH

parent 181d9377
...@@ -3,58 +3,124 @@ ...@@ -3,58 +3,124 @@
module QA module QA
context 'Geo', :orchestrated, :geo do context 'Geo', :orchestrated, :geo do
describe 'GitLab HTTP push' do describe 'GitLab HTTP push' do
it 'is replicated to the secondary' do let(:file_name) { 'README.md' }
file_name = 'README.md'
file_content = 'This is a Geo project! Commit from primary.'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Create a new Project
project = Resource::Project.fabricate! do |project|
project.name = 'geo-project'
project.description = 'Geo test project'
end
# Perform a git push over HTTP directly to the primary context 'regular git commit' do
Resource::Repository::ProjectPush.fabricate! do |push| it 'is replicated to the secondary' do
push.project = project file_content = 'This is a Geo project! Commit from primary.'
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
# Validate git push worked and file exists with content Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
Page::Project::Show.perform do |show| # Visit the primary node and login
show.wait_for_repository_replication Page::Main::Login.act { sign_in_using_credentials }
expect(page).to have_content(file_name) # Create a new Project
expect(page).to have_content(file_content) project = Resource::Project.fabricate! do |project|
end project.name = 'geo-project'
project.description = 'Geo test project'
end
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do # Perform a git push over HTTP directly to the primary
# Visit the secondary node and login Resource::Repository::ProjectPush.fabricate! do |push|
Page::Main::OAuth.act { authorize! if needs_authorization? } push.project = project
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
# Validate git push worked and file exists with content
Page::Project::Show.perform do |show|
show.wait_for_repository_replication
EE::Page::Main::Banner.perform do |banner| expect(page).to have_content(file_name)
expect(banner).to have_secondary_read_only_banner expect(page).to have_content(file_content)
end end
Page::Main::Menu.perform { |menu| menu.go_to_projects } Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
# Visit the secondary node and login
Page::Main::OAuth.act { authorize! if needs_authorization? }
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name)
end
Page::Dashboard::Projects.perform do |dashboard| # Validate the content has been sync'd from the primary
dashboard.wait_for_project_replication(project.name) Page::Project::Show.perform do |show|
dashboard.go_to_project(project.name) show.wait_for_repository_replication_with(file_name)
expect(page).to have_content(file_name)
expect(page).to have_content(file_content)
end
end end
end
end
end
# Validate the content has been sync'd from the primary context 'git-lfs commit' do
it 'is replicated to the secondary' do
file_content = 'This is a Geo project!'
lfs_file_content = 'The rendered file could not be displayed because it is stored in LFS.'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Create a new Project
project = Resource::Project.fabricate! do |project|
project.name = 'geo-project'
project.description = 'Geo test project'
end
# Perform a git push over HTTP directly to the primary
push = Resource::Repository::ProjectPush.fabricate! do |push|
push.use_lfs = true
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
expect(push.output).to match(/Locking support detected on remote/)
expect(push.output).to match(%r{Uploading LFS objects: 100% \(1/1\)})
# Validate git push worked and file exists with content
Page::Project::Show.perform do |show| Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_name) show.wait_for_repository_replication
expect(page).to have_content(file_name) expect(page).to have_content(file_name)
expect(page).to have_content(file_content) expect(page).to have_content(lfs_file_content)
end
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
# Visit the secondary node and login
Page::Main::OAuth.act { authorize! if needs_authorization? }
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name)
end
# Validate the content has been sync'd from the primary
Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_name)
expect(page).to have_content(file_name)
expect(page).to have_content(lfs_file_content)
end
end end
end end
end end
......
...@@ -2,71 +2,164 @@ ...@@ -2,71 +2,164 @@
module QA module QA
context 'Geo', :orchestrated, :geo do context 'Geo', :orchestrated, :geo do
describe 'GitLab HTTP push to secondary' do describe 'GitLab Geo HTTP push secondary' do
it 'is redirected to the primary and ultimately replicated to the secondary' do let(:file_content_primary) { 'This is a Geo project! Commit from primary.' }
file_name = 'README.md' let(:file_content_secondary) { 'This is a Geo project! Commit from secondary.' }
file_content_primary = 'This is a Geo project! Commit from primary.'
file_content_secondary = 'This is a Geo project! Commit from secondary.'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Create a new Project
project = Resource::Project.fabricate! do |project|
project.name = 'geo-project'
project.description = 'Geo test project'
end
# Perform a git push over HTTP directly to the primary context 'regular git commit' do
# it 'is redirected to the primary and ultimately replicated to the secondary' do
# This push is required to ensure we have the primary credentials file_name = 'README.md'
# written out to the .netrc
Resource::Repository::ProjectPush.fabricate! do |push|
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content_primary}"
push.commit_message = "Add #{file_name}"
end
project.visit!
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the secondary node and login # Visit the primary node and login
Page::Main::OAuth.act { authorize! if needs_authorization? } Page::Main::Login.act { sign_in_using_credentials }
EE::Page::Main::Banner.perform do |banner| # Create a new Project
expect(banner).to have_secondary_read_only_banner project = Resource::Project.fabricate! do |project|
project.name = 'geo-project'
project.description = 'Geo test project'
end end
Page::Main::Menu.perform { |menu| menu.go_to_projects } # Perform a git push over HTTP directly to the primary
#
# This push is required to ensure we have the primary credentials
# written out to the .netrc
Resource::Repository::ProjectPush.fabricate! do |push|
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content_primary}"
push.commit_message = "Add #{file_name}"
end
project.visit!
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
# Visit the secondary node and login
Page::Main::OAuth.act { authorize! if needs_authorization? }
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard| Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name) dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name) dashboard.go_to_project(project.name)
end
# Grab the HTTP URI for the secondary and store as 'location'
location = Page::Project::Show.act do
choose_repository_clone_http
repository_location
end
# Perform a git push over HTTP at the secondary
push = Resource::Repository::Push.fabricate! do |push|
push.new_branch = false
push.repository_http_uri = location.uri
push.file_name = file_name
push.file_content = "# #{file_content_secondary}"
push.commit_message = "Update #{file_name}"
end
# We need to strip off the user from the URI, otherwise we won't
# get the correct output produced from the git CLI.
primary_uri = project.repository_http_location.uri
primary_uri.user = nil
# The git cli produces the 'warning: redirecting to..' output
# internally.
expect(push.output).to match(/warning: redirecting to #{primary_uri.to_s}/)
# Validate git push worked and new content is visible
Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_content_secondary)
show.refresh
expect(page).to have_content(file_name)
expect(page).to have_content(file_content_secondary)
end
end end
end
end
end
context 'git-lfs commit' do
it 'is redirected to the primary and ultimately replicated to the secondary' do
file_name_primary = 'README.md'
file_name_secondary = 'README_MORE.md'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Grab the HTTP URI for the secondary and store as 'location' # Create a new Project
location = Page::Project::Show.act do project = Resource::Project.fabricate! do |project|
choose_repository_clone_http project.name = 'geo-project'
repository_location project.description = 'Geo test project'
end end
# Perform a git push over HTTP at the secondary # Perform a git push over HTTP directly to the primary
#
# This push is required to ensure we have the primary credentials
# written out to the .netrc
Resource::Repository::Push.fabricate! do |push| Resource::Repository::Push.fabricate! do |push|
push.new_branch = false push.use_lfs = true
push.repository_http_uri = location.uri push.repository_http_uri = project.repository_http_location.uri
push.file_name = file_name push.file_name = file_name_primary
push.file_content = "# #{file_content_secondary}" push.file_content = "# #{file_content_primary}"
push.commit_message = "Update #{file_name}" push.commit_message = "Add #{file_name_primary}"
end end
# Validate git push worked and new content is visible Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
Page::Project::Show.perform do |show| # Visit the secondary node and login
show.wait_for_repository_replication_with(file_content) Page::Main::OAuth.act { authorize! if needs_authorization? }
show.refresh
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name)
end
# Grab the HTTP URI for the secondary and store as 'location'
location = Page::Project::Show.act do
choose_repository_clone_http
repository_location
end
# Perform a git push over HTTP at the secondary
push = Resource::Repository::Push.fabricate! do |push|
push.use_lfs = true
push.new_branch = false
push.repository_http_uri = location.uri
push.file_name = file_name_secondary
push.file_content = "# #{file_content_secondary}"
push.commit_message = "Add #{file_name_secondary}"
end
# We need to strip off the user from the URI, otherwise we won't
# get the correct output produced from the git CLI.
primary_uri = project.repository_http_location.uri
primary_uri.user = nil
# The git cli produces the 'warning: redirecting to..' output
# internally.
expect(push.output).to match(/warning: redirecting to #{primary_uri.to_s}/)
expect(push.output).to match(/Locking support detected on remote "#{location.uri.to_s}"/)
expect(push.output).to match(%r{Uploading LFS objects: 100% \(2/2\)})
# Validate git push worked and new content is visible
Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_name_secondary)
show.refresh
expect(page).to have_content(file_name) expect(page).to have_content(file_name_secondary)
expect(page).to have_content(file_content) end
end end
end end
end end
......
...@@ -3,73 +3,152 @@ ...@@ -3,73 +3,152 @@
module QA module QA
context 'Geo', :orchestrated, :geo do context 'Geo', :orchestrated, :geo do
describe 'GitLab SSH push' do describe 'GitLab SSH push' do
it "is replicated to the secondary" do let(:file_name) { 'README.md' }
file_name = 'README.md'
key_title = "key for ssh tests #{Time.now.to_f}"
file_content = 'This is a Geo project! Commit from primary.'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Create a new SSH key for the user
key = Resource::SSHKey.fabricate! do |resource|
resource.title = key_title
end
# Create a new Project context 'regular git commit' do
project = Resource::Project.fabricate! do |project| it "is replicated to the secondary" do
project.name = 'geo-project' key_title = "key for ssh tests #{Time.now.to_f}"
project.description = 'Geo test project' file_content = 'This is a Geo project! Commit from primary.'
end
# Perform a git push over SSH directly to the primary Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
Resource::Repository::ProjectPush.fabricate! do |push| # Visit the primary node and login
push.ssh_key = key Page::Main::Login.act { sign_in_using_credentials }
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
# Validate git push worked and file exists with content # Create a new SSH key for the user
Page::Project::Show.perform do |show| key = Resource::SSHKey.fabricate! do |resource|
show.wait_for_repository_replication resource.title = key_title
end
expect(page).to have_content(file_name) # Create a new Project
expect(page).to have_content(file_content) project = Resource::Project.fabricate! do |project|
end project.name = 'geo-project'
project.description = 'Geo test project'
end
# Perform a git push over SSH directly to the primary
Resource::Repository::ProjectPush.fabricate! do |push|
push.ssh_key = key
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do # Validate git push worked and file exists with content
# Visit the secondary node and login Page::Project::Show.perform do |show|
Page::Main::OAuth.act { authorize! if needs_authorization? } show.wait_for_repository_replication
EE::Page::Main::Banner.perform do |banner| expect(page).to have_content(file_name)
expect(banner).to have_secondary_read_only_banner expect(page).to have_content(file_content)
end end
# Ensure the SSH key has replicated Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
Page::Main::Menu.act { go_to_profile_settings } # Visit the secondary node and login
Page::Profile::Menu.act { click_ssh_keys } Page::Main::OAuth.act { authorize! if needs_authorization? }
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
# Ensure the SSH key has replicated
Page::Main::Menu.act { go_to_profile_settings }
Page::Profile::Menu.act { click_ssh_keys }
expect(page).to have_content(key_title)
expect(page).to have_content(key.fingerprint)
expect(page).to have_content(key_title) # Ensure project has replicated
expect(page).to have_content(key.fingerprint) Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name)
end
# Ensure project has replicated # Validate the content has been sync'd from the primary
Page::Main::Menu.perform { |menu| menu.go_to_projects } Page::Project::Show.perform do |show|
Page::Dashboard::Projects.perform do |dashboard| show.wait_for_repository_replication_with(file_content)
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name) expect(page).to have_content(file_name)
expect(page).to have_content(file_content)
end
end end
end
end
end
# Validate the content has been sync'd from the primary context 'git-lfs commit' do
it "is replicated to the secondary" do
key_title = "key for ssh tests #{Time.now.to_f}"
file_content = 'The rendered file could not be displayed because it is stored in LFS.'
Runtime::Browser.visit(:geo_primary, QA::Page::Main::Login) do
# Visit the primary node and login
Page::Main::Login.act { sign_in_using_credentials }
# Create a new SSH key for the user
key = Resource::SSHKey.fabricate! do |resource|
resource.title = key_title
end
# Create a new Project
project = Resource::Project.fabricate! do |project|
project.name = 'geo-project'
project.description = 'Geo test project'
end
# Perform a git push over SSH directly to the primary
push = Resource::Repository::ProjectPush.fabricate! do |push|
push.use_lfs = true
push.ssh_key = key
push.project = project
push.file_name = file_name
push.file_content = "# #{file_content}"
push.commit_message = 'Add README.md'
end
project.visit!
expect(push.output).to match(/Locking support detected on remote/)
expect(push.output).to match(%r{Uploading LFS objects: 100% \(1/1\)})
# Validate git push worked and file exists with content
Page::Project::Show.perform do |show| Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_content) show.wait_for_repository_replication
expect(page).to have_content(file_name) expect(page).to have_content(file_name)
expect(page).to have_content(file_content) expect(page).to have_content(file_content)
end end
Runtime::Browser.visit(:geo_secondary, QA::Page::Main::Login) do
# Visit the secondary node and login
Page::Main::OAuth.act { authorize! if needs_authorization? }
EE::Page::Main::Banner.perform do |banner|
expect(banner).to have_secondary_read_only_banner
end
# Ensure the SSH key has replicated
Page::Main::Menu.act { go_to_profile_settings }
Page::Profile::Menu.act { click_ssh_keys }
expect(page).to have_content(key_title)
expect(page).to have_content(key.fingerprint)
# Ensure project has replicated
Page::Main::Menu.perform { |menu| menu.go_to_projects }
Page::Dashboard::Projects.perform do |dashboard|
dashboard.wait_for_project_replication(project.name)
dashboard.go_to_project(project.name)
end
# Validate the content has been sync'd from the primary
Page::Project::Show.perform do |show|
show.wait_for_repository_replication_with(file_name)
expect(page).to have_content(file_name)
expect(page).to have_content(file_content)
end
end
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment