Skip to content

Commit

Permalink
the road to the success is under construction
Browse files Browse the repository at this point in the history
  • Loading branch information
vpereira authored and Dany Marcoux committed Apr 26, 2021
1 parent 8493fcb commit 249fdb6
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 49 deletions.
34 changes: 28 additions & 6 deletions src/api/app/controllers/trigger_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class TriggerController < ApplicationController
ALLOWED_GITLAB_EVENTS = ['Push Hook', 'Tag Push Hook', 'Merge Request Hook']
ALLOWED_GITLAB_EVENTS = ['Push Hook', 'Tag Push Hook', 'Merge Request Hook'].freeze

validate_action rebuild: { method: :post, response: :status }
validate_action release: { method: :post, response: :status }
Expand All @@ -9,6 +9,11 @@ class TriggerController < ApplicationController
before_action :disallow_project_param, only: [:release]
before_action :validate_gitlab_event
before_action :set_token

# TODO
# we have to call it for runservices
before_action :require_valid_token
# before_action :set_package
# before_action :extract_auth_from_request, :validate_auth_token, :require_valid_token, except: [:create]
#
# Authentication happens with tokens, so no login is required
Expand All @@ -24,10 +29,26 @@ class TriggerController < ApplicationController
include Trigger::Errors

def create
authentication # Done
get token # Done
# pundit
token.call
# authentication # Done
# get token # Done
# pundit # TODO

package = set_package # TODO: set_filter, should be named fetch_package, maybe?
# the token type inference, we are still doing via action type.
@token.call(package) # i.e Token::Rebuild / Token::Release / Token::Service
render_ok
end

def rebuild
create
end

def release
create
end

def runservice
create
end

private
Expand Down Expand Up @@ -86,7 +107,8 @@ def validate_token
end

def set_package
@package = @token.package || Package.get_by_project_and_name(params[:project], params[:package], use_source: true)
@token.package || Package.get_by_project_and_name(params[:project], @token.package_find_options)
# @package = @token.package || Package.get_by_project_and_name(params[:project], params[:package], use_source: true)
end

def set_user
Expand Down
25 changes: 20 additions & 5 deletions src/api/app/models/token.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,26 @@ def token_name
self.class.token_name
end

def package(project_name, package_name)
opts = { use_source: true,
follow_project_links: false,
follow_multibuild: false }
package || Package.get_by_project_and_name(project_name, package_name, opts)
def self.token_type(action)
case action
when 'rebuild'
Token::Rebuild
when 'release'
Token::Release
else
# default is Token::Service
Token::Service
end
end

# TODO
# make sure:
# a) the name makes sense
# b) it lives in the right place
def package_find_options
{ use_source: true,
follow_project_links: false,
follow_multibuild: false }
end
end

Expand Down
20 changes: 10 additions & 10 deletions src/api/app/models/token/rebuild.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ def self.token_name
'rebuild'
end

def rebuild
rebuild_trigger = PackageControllerService::RebuildTrigger.new(package: package, project: package.project, params: params)
#authorize rebuild_trigger.policy_object, :update?
rebuild_trigger.rebuild?
#render_ok
def call(pkg)
rebuild(pkg)
end

def package(project_name, package_name)
opts = { use_source: false,
follow_project_links: true,
follow_multibuild: true }
package || Package.get_by_project_and_name(project_name, package_name, opts)
def rebuild(pkg)
pkg.rebuild({ project: pkg.project, package: pkg })
end

def package_find_options
{ use_source: false,
follow_project_links: true,
follow_multibuild: true }
end
end

Expand Down
20 changes: 13 additions & 7 deletions src/api/app/models/token/release.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,28 @@ def self.token_name
'release'
end

def release
raise NoPermissionForPackage.setup('no_permission', 403, "no permission for package #{@pkg} in project #{@pkg.project}") unless policy(@pkg).update?
def call(pkg)
release(pkg)
end

def release(pkg)
# TODO
# move authorization to pundit
raise NoPermissionForPackage.setup('no_permission', 403, "no permission for package #{pkg} in project #{pkg.project}") unless policy(pkg).update?

manual_release_targets = @pkg.project.release_targets.where(trigger: 'manual')
raise NoPermissionForPackage.setup('not_found', 404, "#{@pkg.project} has no release targets that are triggered manually") unless manual_release_targets.any?
manual_release_targets = pkg.project.release_targets.where(trigger: 'manual')
raise NoPermissionForPackage.setup('not_found', 404, "#{pkg.project} has no release targets that are triggered manually") unless manual_release_targets.any?

manual_release_targets.each do |release_target|
release_package(@pkg,
release_package(pkg,
release_target.target_repository,
@pkg.release_target_name,
pkg.release_target_name,
{ filter_source_repository: release_target.repository,
manual: true,
comment: 'Releasing via trigger event' })
end

render_ok
# render_ok
end
end

Expand Down
50 changes: 30 additions & 20 deletions src/api/app/models/token/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,42 @@ def self.token_name
'runservice'
end

def code_from_webhook_controller
if !@user.is_active? || !@user.can_modify?(@package)
render_error message: 'Token not found or not valid.', status: 404
return
end

Backend::Api::Sources::Package.trigger_services(@package.project.name, @package.name, @user.login)
render_ok
def call(pkg)
runservice(pkg)
end

def runservice
raise NoPermissionForPackage.setup('no_permission', 403, "no permission for package #{@pkg} in project #{@pkg.project}") unless policy(@pkg).update?
# "runservice" (create action) from webhook_controller
# def code_from_webhook_controller
def runservice(pkg)
# TODO: move it to pundit in the trigger controller
# if !@user.is_active? || !@user.can_modify?(@package)
# render_error message: 'Token not found or not valid.', status: 404
# return
# end

# execute the service in backend
pass_to_backend(prepare_path_for_runservice)

@pkg.sources_changed
Backend::Api::Sources::Package.trigger_services(pkg.project.name, pkg.name, User.session!.login)
# TODO
# check if its necessary
package.sources_changed
# render_ok
end

private
# "runservice" (runservice action) from trigger controller
# def runservice
# # TODO: move it to pundit in the trigger controller
# # raise NoPermissionForPackage.setup('no_permission', 403, "no permission for package #{package} in project #{@pkg.project}") unless policy(@pkg).update?

def prepare_path_for_runservice
path = @pkg.source_path
params = { cmd: 'runservice', comment: 'runservice via trigger', user: User.session!.login }
URI(path + build_query_from_hash(params, [:cmd, :comment, :user])).to_s
end
# # execute the service in backend
# pass_to_backend(prepare_path_for_runservice)

# package.sources_changed
# end

# def prepare_path_for_runservice
# path = package.source_path
# params = { cmd: 'runservice', comment: 'runservice via trigger', user: User.session!.login }
# URI(path + build_query_from_hash(params, [:cmd, :comment, :user])).to_s
# end
end

# == Schema Information
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def extract_auth_token_from_headers
@http_request.env['HTTP_AUTHORIZATION'].to_s.slice(6..-1)
return unless auth_token

Token.find_by_string!(auth_token) if auth_token.match?(%r{^[A-Za-z0-9+/]+$})
Token.token_type(@http_request['action']).find_by_string!(auth_token) if auth_token.match?(%r{^[A-Za-z0-9+/]+$})
end

def extract_token_from_request_signature
Expand Down

0 comments on commit 249fdb6

Please sign in to comment.