Skip to content
Snippets Groups Projects
Commit 264bf229 authored by James Lopez's avatar James Lopez
Browse files

add propagate service worker and updated spec and controller

parent e81ea165
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -15,7 +15,7 @@ class Admin::ServicesController < Admin::ApplicationController
end
 
def update
if service.update_attributes(service_params[:service])
if service.update_and_propagate(service_params[:service])
redirect_to admin_application_settings_services_path,
notice: 'Application settings saved successfully'
else
Loading
Loading
Loading
Loading
@@ -254,6 +254,16 @@ class Service < ActiveRecord::Base
service
end
 
def update_and_propagate(service_params)
return false unless update_attributes(service_params)
if service_params[:active] == 1
PropagateProjectServiceWorker.perform_async(service_params[:id])
end
true
end
private
 
def cache_project_has_external_issue_tracker
Loading
Loading
# Worker for updating any project specific caches.
class PropagateProjectServiceWorker
include Sidekiq::Worker
include DedicatedSidekiqQueue
LEASE_TIMEOUT = 30.minutes.to_i
def perform(template_id)
template = Service.find_by(id: template_id)
return unless template&.active
return unless try_obtain_lease_for(template.id)
Rails.logger.info("Propagating services for template #{template.id}")
project_ids_for_template(template) do |project_id|
Service.build_from_template(project_id, template).save!
end
end
private
def project_ids_for_template(template)
limit = 100
offset = 0
loop do
batch = project_ids_batch(limit, offset, template.type)
batch.each { |project_id| yield(project_id) }
break if batch.count < limit
offset += limit
end
end
def project_ids_batch(limit, offset, template_type)
Project.joins('LEFT JOIN services ON services.project_id = projects.id').
where('services.type != ? OR services.id IS NULL', template_type).
limit(limit).offset(offset).pluck(:id)
end
def try_obtain_lease_for(template_id)
Gitlab::ExclusiveLease.
new("propagate_project_service_worker:#{template_id}", timeout: LEASE_TIMEOUT).
try_obtain
end
end
require 'spec_helper'
 
describe PruneOldEventsWorker do
describe PropagateProjectServiceWorker do
describe '#perform' do
let!(:service_template) do
PushoverService.create(
template: true,
active: true,
properties: {
device: 'MyDevice',
sound: 'mic',
priority: 4,
user_key: 'asdf',
api_key: '123456789'
})
end
 
let!(:project) { create(:empty_project) }
 
before do
allow_any_instance_of(Gitlab::ExclusiveLease).to receive(:try_obtain).
and_return(true)
end
it 'creates services for projects' do
expect { subject.perform }.to change { Service.count }.by(1)
expect { subject.perform(service_template.id) }.to change { Service.count }.by(1)
end
 
it 'does not create the service if it exists already' do
Service.build_from_template(project.id, service_template).save!
 
expect { subject.perform }.not_to change { Service.count }
expect { subject.perform(service_template.id) }.not_to change { Service.count }
end
 
it 'creates the service containing the template attributes' do
subject.perform
subject.perform(service_template.id)
 
service = Service.find_by(service_template.merge(project_id: project.id, template: false))
service = Service.find_by(type: service_template.type, template: false)
 
expect(service).not_to be_nil
expect(service.properties).to eq(service_template.properties)
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment