From b328c76c063cfe3082316e4273cfd318bbbfe69b Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Fri, 25 Sep 2015 18:03:41 +0200
Subject: [PATCH] Move runners page to project settings

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
---
 app/controllers/ci/projects_controller.rb     |  3 +-
 .../ci/runner_projects_controller.rb          |  8 +-
 app/controllers/ci/runners_controller.rb      | 73 -------------------
 .../projects/runners_controller.rb            | 69 ++++++++++++++++++
 app/helpers/gitlab_routing_helper.rb          |  8 ++
 app/views/layouts/ci/_nav_project.html.haml   |  5 --
 .../layouts/nav/_project_settings.html.haml   |  6 ++
 .../runners/_runner.html.haml                 | 13 ++--
 .../runners/_shared_runners.html.haml         |  8 +-
 .../runners/_specific_runners.html.haml       |  6 +-
 .../{ci => projects}/runners/edit.html.haml   |  2 +-
 .../{ci => projects}/runners/index.html.haml  |  0
 .../{ci => projects}/runners/show.html.haml   |  0
 config/routes.rb                              | 15 ++--
 14 files changed, 111 insertions(+), 105 deletions(-)
 delete mode 100644 app/controllers/ci/runners_controller.rb
 create mode 100644 app/controllers/projects/runners_controller.rb
 rename app/views/{ci => projects}/runners/_runner.html.haml (54%)
 rename app/views/{ci => projects}/runners/_shared_runners.html.haml (68%)
 rename app/views/{ci => projects}/runners/_specific_runners.html.haml (81%)
 rename app/views/{ci => projects}/runners/edit.html.haml (90%)
 rename app/views/{ci => projects}/runners/index.html.haml (100%)
 rename app/views/{ci => projects}/runners/show.html.haml (100%)

diff --git a/app/controllers/ci/projects_controller.rb b/app/controllers/ci/projects_controller.rb
index 6111753a7fb..13766fb8f6f 100644
--- a/app/controllers/ci/projects_controller.rb
+++ b/app/controllers/ci/projects_controller.rb
@@ -55,7 +55,8 @@ module Ci
 
     def toggle_shared_runners
       project.toggle!(:shared_runners_enabled)
-      redirect_to :back
+
+      redirect_to namespace_project_runners_path(project.gl_project.namespace, project.gl_project)
     end
 
     def dumped_yaml
diff --git a/app/controllers/ci/runner_projects_controller.rb b/app/controllers/ci/runner_projects_controller.rb
index a8bdd5bb362..97f01d40af5 100644
--- a/app/controllers/ci/runner_projects_controller.rb
+++ b/app/controllers/ci/runner_projects_controller.rb
@@ -11,10 +11,12 @@ module Ci
 
       return head(403) unless current_user.ci_authorized_runners.include?(@runner)
 
+      path = runners_path(@project.gl_project)
+
       if @runner.assign_to(project, current_user)
-        redirect_to ci_project_runners_path(project)
+        redirect_to path
       else
-        redirect_to ci_project_runners_path(project), alert: 'Failed adding runner to project'
+        redirect_to path, alert: 'Failed adding runner to project'
       end
     end
 
@@ -22,7 +24,7 @@ module Ci
       runner_project = project.runner_projects.find(params[:id])
       runner_project.destroy
 
-      redirect_to ci_project_runners_path(project)
+      redirect_to runners_path(@project.gl_project)
     end
 
     private
diff --git a/app/controllers/ci/runners_controller.rb b/app/controllers/ci/runners_controller.rb
deleted file mode 100644
index a672370302b..00000000000
--- a/app/controllers/ci/runners_controller.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-module Ci
-  class RunnersController < Ci::ApplicationController
-    before_action :authenticate_user!
-    before_action :project
-    before_action :set_runner, only: [:edit, :update, :destroy, :pause, :resume, :show]
-    before_action :authorize_access_project!
-    before_action :authorize_manage_project!
-
-    layout 'ci/project'
-
-    def index
-      @runners = @project.runners.order('id DESC')
-      @specific_runners =
-        Ci::Runner.specific.includes(:runner_projects).
-        where(Ci::RunnerProject.table_name => { project_id: current_user.authorized_projects } ).
-        where.not(id:  @runners).order("#{Ci::Runner.table_name}.id DESC").page(params[:page]).per(20)
-      @shared_runners = Ci::Runner.shared.active
-      @shared_runners_count = @shared_runners.count(:all)
-    end
-
-    def edit
-    end
-
-    def update
-      if @runner.update_attributes(runner_params)
-        redirect_to edit_ci_project_runner_path(@project, @runner), notice: 'Runner was successfully updated.'
-      else
-        redirect_to edit_ci_project_runner_path(@project, @runner), alert: 'Runner was not updated.'
-      end
-    end
-
-    def destroy
-      if @runner.only_for?(@project)
-        @runner.destroy
-      end
-
-      redirect_to ci_project_runners_path(@project)
-    end
-
-    def resume
-      if @runner.update_attributes(active: true)
-        redirect_to ci_project_runners_path(@project, @runner), notice: 'Runner was successfully updated.'
-      else
-        redirect_to ci_project_runners_path(@project, @runner), alert: 'Runner was not updated.'
-      end
-    end
-
-    def pause
-      if @runner.update_attributes(active: false)
-        redirect_to ci_project_runners_path(@project, @runner), notice: 'Runner was successfully updated.'
-      else
-        redirect_to ci_project_runners_path(@project, @runner), alert: 'Runner was not updated.'
-      end
-    end
-
-    def show
-    end
-
-    protected
-
-    def project
-      @project = Ci::Project.find(params[:project_id])
-    end
-
-    def set_runner
-      @runner ||= @project.runners.find(params[:id])
-    end
-
-    def runner_params
-      params.require(:runner).permit(:description, :tag_list, :contacted_at, :active)
-    end
-  end
-end
diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb
new file mode 100644
index 00000000000..d59884a1dd7
--- /dev/null
+++ b/app/controllers/projects/runners_controller.rb
@@ -0,0 +1,69 @@
+class Projects::RunnersController < Projects::ApplicationController
+  before_action :ci_project
+  before_action :set_runner, only: [:edit, :update, :destroy, :pause, :resume, :show]
+  before_action :authorize_admin_project!
+
+  layout 'project_settings'
+
+  def index
+    @runners = @ci_project.runners.order('id DESC')
+    @specific_runners =
+      Ci::Runner.specific.includes(:runner_projects).
+      where(Ci::RunnerProject.table_name => { project_id: current_user.authorized_projects } ).
+      where.not(id: @runners).order("#{Ci::Runner.table_name}.id DESC").page(params[:page]).per(20)
+    @shared_runners = Ci::Runner.shared.active
+    @shared_runners_count = @shared_runners.count(:all)
+  end
+
+  def edit
+  end
+
+  def update
+    if @runner.update_attributes(runner_params)
+      redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
+    else
+      redirect_to runner_path(@runner), alert: 'Runner was not updated.'
+    end
+  end
+
+  def destroy
+    if @runner.only_for?(@ci_project)
+      @runner.destroy
+    end
+
+    redirect_to runners_path(@project)
+  end
+
+  def resume
+    if @runner.update_attributes(active: true)
+      redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
+    else
+      redirect_to runner_path(@runner), alert: 'Runner was not updated.'
+    end
+  end
+
+  def pause
+    if @runner.update_attributes(active: false)
+      redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
+    else
+      redirect_to runner_path(@runner), alert: 'Runner was not updated.'
+    end
+  end
+
+  def show
+  end
+
+  protected
+
+  def ci_project
+    @ci_project = @project.gitlab_ci_project
+  end
+
+  def set_runner
+    @runner ||= @ci_project.runners.find(params[:id])
+  end
+
+  def runner_params
+    params.require(:runner).permit(:description, :tag_list, :contacted_at, :active)
+  end
+end
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index e0816f4e714..4d9da6ff837 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -33,6 +33,14 @@ module GitlabRoutingHelper
     edit_namespace_project_path(project.namespace, project, *args)
   end
 
+  def runners_path(project, *args)
+    namespace_project_runners_path(project.namespace, project, *args)
+  end
+
+  def runner_path(runner, *args)
+    namespace_project_runner_path(@project.namespace, @project, runner, *args)
+  end
+
   def issue_path(entity, *args)
     namespace_project_issue_path(entity.project.namespace, entity.project, entity, *args)
   end
diff --git a/app/views/layouts/ci/_nav_project.html.haml b/app/views/layouts/ci/_nav_project.html.haml
index 7daf9342e42..9ebe7eabd8e 100644
--- a/app/views/layouts/ci/_nav_project.html.haml
+++ b/app/views/layouts/ci/_nav_project.html.haml
@@ -11,11 +11,6 @@
       %span
         Commits
         %span.count= @project.commits.count
-    = nav_link path: ['runners#index', 'runners#show', 'runners#edit'] do
-      = link_to ci_project_runners_path(@project) do
-        = icon('cog fw')
-        %span
-          Runners
     = nav_link path: 'variables#show' do
       = link_to ci_project_variables_path(@project) do
         = icon('code fw')
diff --git a/app/views/layouts/nav/_project_settings.html.haml b/app/views/layouts/nav/_project_settings.html.haml
index 857fb199957..a85dd71126c 100644
--- a/app/views/layouts/nav/_project_settings.html.haml
+++ b/app/views/layouts/nav/_project_settings.html.haml
@@ -34,3 +34,9 @@
         %span
           Protected Branches
 
+    - if @project.gitlab_ci?
+      = nav_link(controller: :runners) do
+        = link_to namespace_project_runners_path(@project.namespace, @project), title: 'Runners', data: {placement: 'right'} do
+          = icon('cog fw')
+          %span
+            Runners
diff --git a/app/views/ci/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml
similarity index 54%
rename from app/views/ci/runners/_runner.html.haml
rename to app/views/projects/runners/_runner.html.haml
index ef8622e2807..e6b8a2e6fe7 100644
--- a/app/views/ci/runners/_runner.html.haml
+++ b/app/views/projects/runners/_runner.html.haml
@@ -3,9 +3,9 @@
     = runner_status_icon(runner)
     %span.monospace
       - if @runners.include?(runner)
-        = link_to runner.short_sha, ci_project_runner_path(@project, runner)
+        = link_to runner.short_sha, runner_path(runner)
         %small
-          =link_to edit_ci_project_runner_path(@project, runner) do
+          =link_to edit_namespace_project_runner_path(@project.namespace, @project, runner) do
             %i.fa.fa-edit.btn
       - else
         = runner.short_sha
@@ -13,12 +13,12 @@
     .pull-right
       - if @runners.include?(runner)
         - if runner.belongs_to_one_project?
-          = link_to 'Remove runner', [:ci, @project, runner], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm'
+          = link_to 'Remove runner', runner_path(runner), data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm'
         - else
-          - runner_project = @project.runner_projects.find_by(runner_id: runner)
-          = link_to 'Disable for this project', [:ci, @project, runner_project], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm'
+          - runner_project = @ci_project.runner_projects.find_by(runner_id: runner)
+          = link_to 'Disable for this project', [:ci, @ci_project, runner_project], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm'
       - elsif runner.specific?
-        = form_for [:ci, @project, @project.runner_projects.new] do |f|
+        = form_for [:ci, @ci_project, @ci_project.runner_projects.new] do |f|
           = f.hidden_field :runner_id, value: runner.id
           = f.submit 'Enable for this project', class: 'btn btn-sm'
   .pull-right
@@ -32,4 +32,3 @@
       - runner.tag_list.each do |tag|
         %span.label.label-primary
           = tag
-
diff --git a/app/views/ci/runners/_shared_runners.html.haml b/app/views/projects/runners/_shared_runners.html.haml
similarity index 68%
rename from app/views/ci/runners/_shared_runners.html.haml
rename to app/views/projects/runners/_shared_runners.html.haml
index 944b3fd930d..316ea747b14 100644
--- a/app/views/ci/runners/_shared_runners.html.haml
+++ b/app/views/projects/runners/_shared_runners.html.haml
@@ -3,11 +3,11 @@
 .bs-callout.bs-callout-warning
   GitLab Runners do not offer secure isolation between projects that they do builds for. You are TRUSTING all GitLab users who can push code to project A, B or C to run shell scripts on the machine hosting runner X.
   %hr
-  - if @project.shared_runners_enabled
-    = link_to toggle_shared_runners_ci_project_path(@project), class: 'btn btn-warning', method: :post do
+  - if @ci_project.shared_runners_enabled
+    = link_to toggle_shared_runners_ci_project_path(@ci_project), class: 'btn btn-warning', method: :post do
       Disable shared runners
   - else
-    = link_to toggle_shared_runners_ci_project_path(@project), class: 'btn btn-success', method: :post do
+    = link_to toggle_shared_runners_ci_project_path(@ci_project), class: 'btn btn-success', method: :post do
       Enable shared runners
   &nbsp; for this project
 
@@ -17,7 +17,7 @@
 - else
   %h4.underlined-title Available shared runners - #{@shared_runners_count}
   %ul.bordered-list.available-shared-runners
-    = render @shared_runners.first(10)
+    = render partial: 'runner', collection: @shared_runners, as: :runner
   - if @shared_runners_count > 10
     .light
       and #{@shared_runners_count - 10} more...
diff --git a/app/views/ci/runners/_specific_runners.html.haml b/app/views/projects/runners/_specific_runners.html.haml
similarity index 81%
rename from app/views/ci/runners/_specific_runners.html.haml
rename to app/views/projects/runners/_specific_runners.html.haml
index 0604e7a46c5..c13625c7e49 100644
--- a/app/views/ci/runners/_specific_runners.html.haml
+++ b/app/views/projects/runners/_specific_runners.html.haml
@@ -12,7 +12,7 @@
       %code #{ci_root_url(only_path: false)}
     %li
       Use the following registration token during setup:
-      %code #{@project.token}
+      %code #{@ci_project.token}
     %li
       Start runner!
 
@@ -20,10 +20,10 @@
 - if @runners.any?
   %h4.underlined-title Runners activated for this project
   %ul.bordered-list.activated-specific-runners
-    = render @runners
+    = render partial: 'runner', collection: @runners, as: :runner
 
 - if @specific_runners.any?
   %h4.underlined-title Available specific runners
   %ul.bordered-list.available-specific-runners
-    = render @specific_runners
+    = render partial: 'runner', collection: @specific_runners, as: :runner
   = paginate @specific_runners
diff --git a/app/views/ci/runners/edit.html.haml b/app/views/projects/runners/edit.html.haml
similarity index 90%
rename from app/views/ci/runners/edit.html.haml
rename to app/views/projects/runners/edit.html.haml
index 81c8e58ae2b..66851d38316 100644
--- a/app/views/ci/runners/edit.html.haml
+++ b/app/views/projects/runners/edit.html.haml
@@ -1,6 +1,6 @@
 %h4 Runner ##{@runner.id}
 %hr
-= form_for [:ci, @project, @runner], html: { class: 'form-horizontal' } do |f|
+= form_for @runner, url: runner_path(@runner), html: { class: 'form-horizontal' } do |f|
   .form-group
     = label :active, "Active", class: 'control-label'
     .col-sm-10
diff --git a/app/views/ci/runners/index.html.haml b/app/views/projects/runners/index.html.haml
similarity index 100%
rename from app/views/ci/runners/index.html.haml
rename to app/views/projects/runners/index.html.haml
diff --git a/app/views/ci/runners/show.html.haml b/app/views/projects/runners/show.html.haml
similarity index 100%
rename from app/views/ci/runners/show.html.haml
rename to app/views/projects/runners/show.html.haml
diff --git a/config/routes.rb b/config/routes.rb
index 4a07c449b4e..a81ed1b95f5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -55,13 +55,6 @@ Gitlab::Application.routes.draw do
 
       resources :triggers, only: [:index, :create, :destroy]
 
-      resources :runners, only: [:index, :edit, :update, :destroy, :show] do
-        member do
-          get :resume
-          get :pause
-        end
-      end
-
       resources :runner_projects, only: [:create, :destroy]
 
       resources :events, only: [:index]
@@ -652,8 +645,14 @@ Gitlab::Application.routes.draw do
             get ":secret/:filename", action: :show, as: :show, constraints: { filename: /[^\/]+/ }
           end
         end
-      end
 
+        resources :runners, only: [:index, :edit, :update, :destroy, :show] do
+          member do
+            get :resume
+            get :pause
+          end
+        end
+      end
     end
   end
 
-- 
GitLab