Skip to content

Commit

Permalink
Merge pull request #12292 from saraycp/data_for_token_workflows
Browse files Browse the repository at this point in the history
Add rails task to create workflow token and runs
  • Loading branch information
saraycp committed Mar 14, 2022
2 parents b2338bc + ee171c5 commit c16a99b
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 3 deletions.
47 changes: 47 additions & 0 deletions src/api/lib/tasks/dev.rake
Expand Up @@ -249,6 +249,42 @@ namespace :dev do
end
end

# Run this task with: rails dev:workflow_runs:data"
namespace :workflow_runs do
desc 'Creates a workflow token, workflow runs, artifacts and some of their dependencies'
task data: :environment do
unless Rails.env.development?
puts "You are running this rake task in #{Rails.env} environment."
puts 'Please only run this task with RAILS_ENV=development'
puts 'otherwise it will destroy your database data.'
return
end

require 'factory_bot'
include FactoryBot::Syntax::Methods

puts 'Creating workflow token and workflow runs...'

admin = User.get_default_admin
User.session = admin
project = find_or_create_project(admin.home_project_name, admin)

workflow_token = Token::Workflow.find_by(name: 'Testing token') || create(:workflow_token, user: admin, name: 'Testing token')

create(:running_workflow_run, token: workflow_token)
create(:failed_workflow_run, token: workflow_token)
succeeded_workflow_run = create(:succeeded_workflow_run, token: workflow_token)

source_project_name = project.name
target_project_name = "#{project.name}:CI:repo:PR-1"

create(:workflow_artifacts_per_step_branch_package, workflow_run: succeeded_workflow_run, source_project_name: source_project_name, target_project_name: target_project_name)
create(:workflow_artifacts_per_step_link_package, workflow_run: succeeded_workflow_run, source_project_name: source_project_name, target_project_name: target_project_name)
create(:workflow_artifacts_per_step_rebuild_package, workflow_run: succeeded_workflow_run, source_project_name: source_project_name, target_project_name: target_project_name)
create(:workflow_artifacts_per_step_config_repositories, workflow_run: succeeded_workflow_run, source_project_name: source_project_name, target_project_name: target_project_name)
end
end

# This is automatically run in Review App or manually in development env.
namespace :development_testdata do
desc 'Creates test data to play with in dev and CI environments'
Expand Down Expand Up @@ -400,6 +436,9 @@ namespace :dev do

# Create notifications by running the `dev:notifications:data` task two times
Rake::Task['dev:notifications:data'].invoke(2)

# Create a workflow token, some workflow runs and their related data
Rake::Task['dev:workflow_runs:data'].invoke
end
end
end
Expand Down Expand Up @@ -437,6 +476,14 @@ def create_and_assign_project(project_name, user)
end
end

def find_or_create_project(project_name, user)
project = Project.joins(:relationships)
.where(projects: { name: project_name }, relationships: { user: user }).first
return project if project

create_and_assign_project(project_name, user)
end

def subscribe_to_all_notifications(user)
create(:event_subscription_request_created, channel: :web, user: user, receiver_role: 'target_maintainer')
create(:event_subscription_review_wanted, channel: 'web', user: user, receiver_role: 'reviewer')
Expand Down
65 changes: 65 additions & 0 deletions src/api/spec/factories/workflow_artifacts_per_step.rb
@@ -0,0 +1,65 @@
FactoryBot.define do
factory :workflow_artifacts_per_step, aliases: [:workflow_artifacts_per_step_branch_package] do
workflow_run { create(:workflow_run) }
step { 'Workflow::Step::BranchPackageStep' }

transient do
source_project_name { Faker::Lorem.word }
target_project_name { Faker::Lorem.word }
source_package_name { Faker::Lorem.word }
target_package_name { source_package_name }
end

before(:create) do |workflow_artifacts_per_step, evaluator|
source_project = Project.find_by(name: evaluator.source_project_name) || create(:project, name: evaluator.source_project_name)
target_project = Project.find_by(name: evaluator.target_project_name) || create(:project, name: evaluator.target_project_name)

create(:package, name: evaluator.source_package_name, project: source_project) unless Package.find_by_project_and_name(evaluator.source_project_name, evaluator.source_package_name)
create(:package, name: evaluator.target_package_name, project: target_project) unless Package.find_by_project_and_name(evaluator.target_project_name, evaluator.target_package_name)

workflow_artifacts_per_step.artifacts = { source_project: evaluator.source_project_name,
source_package: evaluator.source_package_name,
target_project: evaluator.target_project_name,
target_package: evaluator.target_package_name }.to_json
end

factory :workflow_artifacts_per_step_link_package do
step { 'Workflow::Step::LinkPackageStep' }

before(:create) do |workflow_artifacts_per_step, evaluator|
workflow_artifacts_per_step.artifacts = { source_project: evaluator.source_project_name,
source_package: evaluator.source_package_name,
target_project: evaluator.target_project_name,
target_package: evaluator.target_package_name }.to_json
end
end
factory :workflow_artifacts_per_step_rebuild_package do
step { 'Workflow::Step::RebuildPackage' }

before(:create) do |workflow_artifacts_per_step, evaluator|
workflow_artifacts_per_step.artifacts = { project: evaluator.source_project_name,
package: evaluator.source_package_name }.to_json
end
end
factory :workflow_artifacts_per_step_config_repositories do
step { 'Workflow::Step::ConfigureRepositories' }
before(:create) do |workflow_artifacts_per_step, evaluator|
workflow_artifacts_per_step.artifacts = {
project: evaluator.target_project_name,
repositories: [
{
name: 'openSUSE_Tumbleweed',
paths: [
{
target_project: 'openSUSE:Factory',
target_repository: 'snapshot'
}
],
architectures: ['x86_64']
}
]
}.to_json
end
end
end
end
53 changes: 50 additions & 3 deletions src/api/spec/factories/workflow_runs.rb
@@ -1,7 +1,54 @@
FactoryBot.define do
factory :workflow_run do
request_headers { Faker::Lorem.characters(number: 32) }
request_payload { Faker::Lorem.characters(number: 32) }
token
token { create(:workflow_token) }
request_headers do
<<~END_OF_HEADERS
HTTP_X_GITHUB_EVENT: pull_request
END_OF_HEADERS
end
request_payload do
<<~END_OF_PAYLOAD
{
"action": "opened",
"pull_request": {
"number": 1
},
"repository": {
"full_name": "iggy/hello_world",
"owner": { "html_url": "https://github.com" }
},
"foo": "bar"
}
END_OF_PAYLOAD
end

factory :succeeded_workflow_run do
status { 'success' }
response_body do
<<~END_OF_RESPONSE_BODY
<status code="ok">
<summary>Ok</summary>
</status>
END_OF_RESPONSE_BODY
end
response_url { 'https://api.github.com' }
end

factory :running_workflow_run do
status { 'running' }
response_body { nil }
response_url { nil }
end

factory :failed_workflow_run do
status { 'fail' }
response_body do
<<~END_OF_RESPONSE_BODY
<status code="unknown">
<summary>The 'target_project' key is missing</summary>
</status>
END_OF_RESPONSE_BODY
end
end
end
end

0 comments on commit c16a99b

Please sign in to comment.