Skip to content

Commit

Permalink
[api,backend] move request notifications to generic route in backend
Browse files Browse the repository at this point in the history
called from API. the backend no longer knows about requests

I left the code in the backend for now to allow master backends to run
behind 2.3 apis, but this is going to be removed for the beta.

One possible problem is the multi action support. I didn't really test
it, but it sounds possible that the generic route is not prepared to
have multiple actions
  • Loading branch information
coolo committed Jul 9, 2012
1 parent 5ea2829 commit 549c630
Show file tree
Hide file tree
Showing 10 changed files with 208 additions and 11 deletions.
27 changes: 21 additions & 6 deletions src/api/app/controllers/request_controller.rb
Expand Up @@ -10,7 +10,7 @@ class RequestController < ApplicationController
alias_method :create, :dispatch_command

#TODO: allow PUT for non-admins
before_filter :require_admin, :only => [:update]
before_filter :require_admin, :only => [:update, :destroy]

# GET /request
def index
Expand Down Expand Up @@ -194,18 +194,25 @@ def update
oldrequest = BsRequest.find params[:id]
oldrequest.destroy

notify = oldrequest.notify_parameters
Suse::Backend.send_notification("SRCSRV_REQUEST_CHANGE", notify)

req = BsRequest.new_from_xml(request.body.read)
req.id = params[:id]
req.save!

send_data(req.render_xml, :type => "text/xml")
end
end

# DELETE /request/:id
#def destroy
# Do we want to allow to delete requests at all ?
#end
def destroy
request = BsRequest.find(params[:id])
notify = request.notify_parameters
request.destroy # throws us out of here if failing
Suse::Backend.send_notification("SRCSRV_REQUEST_DELETE", notify)
render_ok
end

private

Expand Down Expand Up @@ -487,7 +494,6 @@ def create_expand_package(action, packages)


def create_expand_targets(req)

per_package_locking = nil

newactions = []
Expand Down Expand Up @@ -879,6 +885,14 @@ def create_create
# create the actual request
#
req.save!
notify = req.notify_parameters
Suse::Backend.send_notification('SRCSRV_REQUEST_CREATE', notify)

req.reviews.each do |review|
hermes_type, review_notify = review.notify_parameters(notify.dup)
Suse::Backend.send_notification(hermes_type, review_notify) if hermes_type
end

render :text => req.render_xml, :content_type => 'text/xml'
end

Expand Down Expand Up @@ -1454,6 +1468,7 @@ def command_changestate
end
end
end

# job done by changing target
if params[:cmd] == "setincident"
req.save!
Expand Down
64 changes: 62 additions & 2 deletions src/api/app/models/bs_request.rb
@@ -1,4 +1,5 @@
require 'xmlhash'
require 'opensuse/backend'

class BsRequest < ActiveRecord::Base

Expand All @@ -12,7 +13,9 @@ class BsRequest < ActiveRecord::Base
validate :check_supersede_state
validates_length_of :comment, :maximum=>300000
validates_length_of :description, :maximum=>300000


after_update :send_state_change

def check_supersede_state
if self.state == :superseded && self.superseded_by.nil?
errors.add(:superseded_by, "Superseded_by should be set")
Expand Down Expand Up @@ -206,6 +209,17 @@ def change_state(state, opts = {})
end
end
self.save!

notify = self.notify_parameters
case state
when :accepted
Suse::Backend.send_notification("SRCSRV_REQUEST_ACCEPTED", notify)
when :declined
Suse::Backend.send_notification("SRCSRV_REQUEST_DECLINED", notify)
when :revoked
Suse::Backend.send_notification("SRCSRV_REQUEST_REVOKED", notify)
end

end
end

Expand Down Expand Up @@ -276,6 +290,18 @@ def change_review_state(state, opts = {})
end

self.save!

notify = self.notify_parameters
if go_new_state
case state
when :accepted
Suse::Backend.send_notification("SRCSRV_REVIEW_ACCEPTED", notify)
when :declined
Suse::Backend.send_notification("SRCSRV_REVIEW_DECLINED", notify)
when :revoked
Suse::Backend.send_notification("SRCSRV_REVIEW_REVOKED", notify)
end
end
end
end

Expand All @@ -290,10 +316,44 @@ def addreview(opts)
self.commenter = User.current.login
self.comment = opts[:comment] if opts[:comment]

self.reviews.create reason: opts[:comment], by_user: opts[:by_user], by_group: opts[:by_group], by_project: opts[:by_project],
newreview = self.reviews.create reason: opts[:comment], by_user: opts[:by_user], by_group: opts[:by_group], by_project: opts[:by_project],
by_package: opts[:by_package], creator: User.current.login
self.save!

hermes_type, params = newreview.notify_parameters(self.notify_parameters)
Suse::Backend.send_notification(hermes_type, params) if hermes_type
end
end

def send_state_change
Suse::Backend.send_notification("SRCSRV_REQUEST_STATECHANGE", self.notify_parameters) if self.state_changed?
end

def notify_parameters(ret = {})
ret[:id] = self.id
ret[:type] = '' # old style
ret[:description] = self.description
ret[:state] = self.state
ret[:when] = self.updated_at.strftime("%Y-%m-%dT%H:%M:%S")
ret[:comment] = self.comment
ret[:author] = self.creator

if CONFIG['multiaction_notify_support']
# Use a nested data structure to support multiple actions in one request
ret[:actions] = []
self.bs_request_actions.each do |a|
ret[:actions] << a.notify_params
end
else
# This is the old code that doesn't handle multiple actions in one request.
# The last one just wins ....
# Needed until Hermes supports $reqinfo{'actions'}
self.bs_request_actions.each do |a|
ret = a.notify_params(ret)
end
end
return ret
end

end

48 changes: 48 additions & 0 deletions src/api/app/models/bs_request_action.rb
Expand Up @@ -149,4 +149,52 @@ def render_xml(builder)
def set_acceptinfo(ai)
self.bs_request_action_accept_info = BsRequestActionAcceptInfo.create(ai)
end

def notify_params(ret = {})
ret[:type] = self.action_type.to_s
if self.action_type == :submit
ret[:sourceproject] = self.source_project
ret[:sourcepackage] = self.source_package
ret[:sourcerevision] = self.source_rev
ret[:targetproject] = self.target_project
ret[:targetpackage] = self.target_package
ret[:deleteproject] = nil
ret[:deletepackage] = nil
ret[:person] = nil
ret[:role] = nil
elsif self.action_type == :change_devel
ret[:sourceproject] = self.source_project
ret[:sourcepackage] = self.source_package
ret[:targetproject] = self.target_project
ret[:targetpackage] = self.target_package || self.source_package
ret[:deleteproject] = nil
ret[:deletepackage] = nil
ret[:sourcerevision] = nil
ret[:person] = nil
ret[:role] = nil
elsif self.action_type == :add_role
ret[:targetproject] = self.target_project
ret[:targetpackage] = self.target_package
ret[:sourceproject] = nil
ret[:sourcepackage] = nil
ret[:deleteproject] = nil
ret[:deletepackage] = nil
ret[:sourcerevision] = nil
ret[:person] = self.person_name
ret[:role] = self.role
elsif self.action_type == :delete
# FIXME3 this parameter is duplicating infos
ret[:deleteproject] = self.target_project
ret[:deletepackage] = self.target_package
ret[:sourceproject] = nil
ret[:sourcepackage] = nil
ret[:targetproject] = self.target_project
ret[:targetpackage] = self.target_package
ret[:sourcerevision] = nil
ret[:person] = nil
ret[:role] = nil
end
ret
end

end
24 changes: 22 additions & 2 deletions src/api/app/models/review.rb
Expand Up @@ -47,10 +47,30 @@ def render_xml(builder)
attributes[:by_user] = self.by_user if self.by_user
attributes[:by_package] = self.by_package if self.by_package
attributes[:by_project] = self.by_project if self.by_project

builder.review(attributes) do
builder.comment! self.reason if self.reason
end
end


def notify_parameters(params = {})
hermes_type = nil
if self.by_package
hermes_type = "SRCSRV_REQUEST_REVIEWER_PACKAGE_ADDED"
params[:newreviewer_project] = self.by_project
params[:newreviewer_package] = self.by_package
elsif self.by_project
hermes_type = "SRCSRV_REQUEST_REVIEWER_PROJECT_ADDED"
params[:newreviewer_project] = self.by_project
elsif self.by_user
hermes_type = "SRCSRV_REQUEST_REVIEWER_ADDED"
params[:newreviewer] = self.by_user
elsif self.by_group
hermes_type = "SRCSRV_REQUEST_REVIEWER_GROUP_ADDED"
params[:newreviewer_group] = self.by_group
end
params[:comment] = self.reason

return hermes_type, params
end
end
2 changes: 1 addition & 1 deletion src/api/config/routes.rb
Expand Up @@ -254,7 +254,7 @@

### /request

resources :request, :only => [:index, :show, :update, :create]
resources :request, :only => [:index, :show, :update, :create, :destroy]

match 'request/:id' => 'request#command'

Expand Down
13 changes: 13 additions & 0 deletions src/api/lib/opensuse/backend.rb
Expand Up @@ -166,6 +166,19 @@ def build_query_from_hash(hash, key_list=nil)
end
end

def send_notification(type, params)
params[:who] ||= User.current.login
params[:sender] ||= User.current.login
logger.debug "send_notification #{type} #{params}"
data = []
params.each do |key, value|
next if value.nil?
data << "#{key}=#{CGI.escape(value.to_s)}"
end

post("/notify/#{type}?#{data.join('&')}", '')
end

private

def now
Expand Down
27 changes: 27 additions & 0 deletions src/api/test/functional/request_controller_test.rb
Expand Up @@ -612,6 +612,7 @@ def test_process_devel_request
# cleanup
put "/source/home:Iggy/TestPack/_meta", oldmeta.dup
assert_response :success

end

def test_reject_request_creation
Expand Down Expand Up @@ -1723,5 +1724,31 @@ def test_project_delete_request_with_pending
assert_response :success
end

def test_delete_request_id

prepare_request_with_user "Iggy", "asdfasdf"
req = load_backend_file('request/1')
post "/request?cmd=create", req
assert_response :success

node = Xmlhash.parse(@response.body)
id = node['id']
get "/request/#{id}"
assert_response :success

# old admins can do that
delete "/request/#{id}"
assert_response 403
assert_xml_tag :tag => 'summary', :content => "Requires admin privileges"

prepare_request_with_user "king", "sunflower"
delete "/request/#{id}"
assert_response :success

get "/request/#{id}"
assert_response 404

end

end

2 changes: 2 additions & 0 deletions src/backend/BSConfig.pm.template
Expand Up @@ -62,6 +62,8 @@ our $repodownload = "http://$hostname/repositories";
#
# Notification Plugin
#our $notification_plugin = "notify_hermes";
#
#FIXME2.4 belongs in API
# Does the notify plugin supports multiple actions?
# Hermes doesn't, BOSS does.
#our $multiaction_notify_support = 0
Expand Down
1 change: 1 addition & 0 deletions src/backend/BSNotify.pm
Expand Up @@ -50,6 +50,7 @@ sub loadPackage {
return $obj;
}

# FIXME2.4 remove whole function
# Create parameters for BS Requests
sub requestParams( $$ )
{
Expand Down

0 comments on commit 549c630

Please sign in to comment.