kuroko2 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +1 -0
 - data/app/controllers/kuroko2/api/application_controller.rb +4 -0
 - data/app/controllers/kuroko2/api/job_definitions_controller.rb +64 -0
 - data/app/controllers/kuroko2/job_definitions_controller.rb +9 -2
 - data/app/errors/http/unprocessable_entity.rb +4 -0
 - data/app/models/kuroko2/api/job_definition_resource.rb +11 -0
 - data/app/models/kuroko2/job_definition.rb +1 -1
 - data/app/views/kuroko2/job_definitions/_alert.html.slim +1 -1
 - data/app/views/kuroko2/job_definitions/_list.html.slim +4 -1
 - data/app/views/kuroko2/job_definitions/_search_results.html.slim +4 -1
 - data/app/views/kuroko2/job_definitions/show.html.slim +4 -2
 - data/app/views/kuroko2/job_timelines/dataset.json.jbuilder +1 -1
 - data/app/views/kuroko2/users/index.html.slim +1 -1
 - data/config/routes.rb +2 -2
 - data/db/migrate/030_add_notify_back_to_normal.rb +5 -0
 - data/lib/autoload/kuroko2/workflow/engine.rb +6 -2
 - data/lib/autoload/kuroko2/workflow/notifier/concerns/chat_message_builder.rb +4 -0
 - data/lib/autoload/kuroko2/workflow/notifier/hipchat.rb +5 -0
 - data/lib/autoload/kuroko2/workflow/notifier/mail.rb +4 -0
 - data/lib/autoload/kuroko2/workflow/notifier/slack.rb +7 -0
 - data/lib/autoload/kuroko2/workflow/notifier/webhook.rb +10 -0
 - data/lib/kuroko2/version.rb +1 -1
 - data/spec/controllers/job_definitions_controller_spec.rb +62 -0
 - data/spec/dummy/db/schema.rb +133 -132
 - data/spec/dummy/log/test.log +667 -0
 - data/spec/features/job_instance_spec.rb +4 -5
 - data/spec/requests/api/job_definitions_spec.rb +178 -0
 - data/spec/workflow/engine_spec.rb +2 -0
 - data/spec/workflow/notifier/hipchat_spec.rb +11 -0
 - data/spec/workflow/notifier/mail_spec.rb +8 -0
 - data/spec/workflow/notifier/slack_spec.rb +9 -0
 - data/spec/workflow/notifier/webhook_spec.rb +11 -0
 - metadata +9 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 80baa8f9a1ca15294cc73f9f726f5584433d6acb
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 57be564404077de0d32b829687cc579ee925a02f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 7e657c7824576cecaa2e3cbc2a01abdad723efe66f4dd6da7fa0fe4f68f215f8f46dc3ca3ed7982bb79fb299d736d2363dda21846e604aa61e5c8df03dde934f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 296957b071325388c8407d6dabeaabe85b1d6ce1498db6f0d80af9eefb4ed2c161c2e17f5592978057189751d5809b579bcfb00e84ccf040329b20594f7513b3
         
     | 
    
        data/README.md
    CHANGED
    
    
| 
         @@ -15,6 +15,10 @@ class Kuroko2::Api::ApplicationController < ActionController::Base 
     | 
|
| 
       15 
15 
     | 
    
         
             
                respond_with_error(401, 'unauthorized', exception.message)
         
     | 
| 
       16 
16 
     | 
    
         
             
              end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
              rescue_from HTTP::UnprocessableEntity do |exception|
         
     | 
| 
      
 19 
     | 
    
         
            +
                respond_with_error(422, 'unprocessable_entity', exception.message)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       18 
22 
     | 
    
         
             
              rescue_from WeakParameters::ValidationError do |exception|
         
     | 
| 
       19 
23 
     | 
    
         
             
                respond_with_error(400, 'bad_request', exception.message)
         
     | 
| 
       20 
24 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Kuroko2::Api::JobDefinitionsController < Kuroko2::Api::ApplicationController
         
     | 
| 
      
 2 
     | 
    
         
            +
              include Garage::RestfulActions
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              private
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              def require_resources
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              def create_resource
         
     | 
| 
      
 10 
     | 
    
         
            +
                definition = Kuroko2::JobDefinition.new(definition_params(params))
         
     | 
| 
      
 11 
     | 
    
         
            +
                user_ids = admin_id_params(params)
         
     | 
| 
      
 12 
     | 
    
         
            +
                definition.admins = Kuroko2::User.active.with(user_ids)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                if definition.save
         
     | 
| 
      
 15 
     | 
    
         
            +
                  definition.admins.each do |user|
         
     | 
| 
      
 16 
     | 
    
         
            +
                    user.stars.create(job_definition: definition) if user.google_account?
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  @resource = Kuroko2::Api::JobDefinitionResource.new(definition)
         
     | 
| 
      
 20 
     | 
    
         
            +
                else
         
     | 
| 
      
 21 
     | 
    
         
            +
                  raise HTTP::UnprocessableEntity.new("#{definition.name}: #{definition.errors.full_messages.join()}")
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              def require_resource
         
     | 
| 
      
 26 
     | 
    
         
            +
                definition = Kuroko2::JobDefinition.find(params[:id])
         
     | 
| 
      
 27 
     | 
    
         
            +
                @resource = Kuroko2::Api::JobDefinitionResource.new(definition)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def update_resource
         
     | 
| 
      
 31 
     | 
    
         
            +
                definition = Kuroko2::JobDefinition.find(params[:id])
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                if definition.update(definition_params(params))
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @resource = Kuroko2::Api::JobDefinitionResource.new(definition)
         
     | 
| 
      
 35 
     | 
    
         
            +
                else
         
     | 
| 
      
 36 
     | 
    
         
            +
                  raise HTTP::UnprocessableEntity.new("#{definition.name}: #{definition.errors.full_messages.join()}")
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              def definition_params(params)
         
     | 
| 
      
 41 
     | 
    
         
            +
                params.permit(
         
     | 
| 
      
 42 
     | 
    
         
            +
                  :name,
         
     | 
| 
      
 43 
     | 
    
         
            +
                  :description,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  :script,
         
     | 
| 
      
 45 
     | 
    
         
            +
                  :notify_cancellation,
         
     | 
| 
      
 46 
     | 
    
         
            +
                  :hipchat_room,
         
     | 
| 
      
 47 
     | 
    
         
            +
                  :hipchat_notify_finished,
         
     | 
| 
      
 48 
     | 
    
         
            +
                  :suspended,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  :prevent_multi,
         
     | 
| 
      
 50 
     | 
    
         
            +
                  :prevent_multi_on_failure,
         
     | 
| 
      
 51 
     | 
    
         
            +
                  :hipchat_additional_text,
         
     | 
| 
      
 52 
     | 
    
         
            +
                  :text_tags,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  :api_allowed,
         
     | 
| 
      
 54 
     | 
    
         
            +
                  :slack_channel,
         
     | 
| 
      
 55 
     | 
    
         
            +
                  :webhook_url)
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
              def admin_id_params(params)
         
     | 
| 
      
 59 
     | 
    
         
            +
                params.permit(user_id: []).
         
     | 
| 
      
 60 
     | 
    
         
            +
                  try!(:[], :user_id).
         
     | 
| 
      
 61 
     | 
    
         
            +
                  try!(:reject, &:blank?).
         
     | 
| 
      
 62 
     | 
    
         
            +
                  try!(:map, &:to_i) || []
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -33,8 +33,15 @@ class Kuroko2::JobDefinitionsController < Kuroko2::ApplicationController 
     | 
|
| 
       33 
33 
     | 
    
         
             
              end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
              def new
         
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
       37 
     | 
    
         
            -
                 
     | 
| 
      
 36 
     | 
    
         
            +
                dup_from = Kuroko2::JobDefinition.find_by(id: params[:dup_from])
         
     | 
| 
      
 37 
     | 
    
         
            +
                if dup_from.present?
         
     | 
| 
      
 38 
     | 
    
         
            +
                  @definition = dup_from.dup
         
     | 
| 
      
 39 
     | 
    
         
            +
                  @definition.admins = dup_from.admins
         
     | 
| 
      
 40 
     | 
    
         
            +
                  @definition.tags = dup_from.tags
         
     | 
| 
      
 41 
     | 
    
         
            +
                else
         
     | 
| 
      
 42 
     | 
    
         
            +
                  @definition = Kuroko2::JobDefinition.new
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
                @definition.admins << current_user unless @definition.admins.include?(current_user)
         
     | 
| 
       38 
45 
     | 
    
         
             
              end
         
     | 
| 
       39 
46 
     | 
    
         | 
| 
       40 
47 
     | 
    
         
             
              def create
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            - if @definition.errors.any?
         
     | 
| 
       2 
2 
     | 
    
         
             
              .alert.alert-danger
         
     | 
| 
       3 
3 
     | 
    
         
             
                i.fa.fa-ban
         
     | 
| 
       4 
     | 
    
         
            -
                h4 #{pluralize(@definition.errors.count, "error")} prohibited this  
     | 
| 
      
 4 
     | 
    
         
            +
                h4 #{pluralize(@definition.errors.count, "error")} prohibited this job definition from being saved:
         
     | 
| 
       5 
5 
     | 
    
         
             
                ul
         
     | 
| 
       6 
6 
     | 
    
         
             
                - @definition.errors.full_messages.each do |message|
         
     | 
| 
       7 
7 
     | 
    
         
             
                  li= message
         
     | 
| 
         @@ -12,7 +12,10 @@ 
     | 
|
| 
       12 
12 
     | 
    
         
             
                  - for definition in definitions
         
     | 
| 
       13 
13 
     | 
    
         
             
                    tr
         
     | 
| 
       14 
14 
     | 
    
         
             
                      td= definition.id
         
     | 
| 
       15 
     | 
    
         
            -
                      td.no-decorate 
     | 
| 
      
 15 
     | 
    
         
            +
                      td.no-decorate
         
     | 
| 
      
 16 
     | 
    
         
            +
                        - if definition.suspended
         
     | 
| 
      
 17 
     | 
    
         
            +
                          span.label.label-warning.spacer-right-3 SUSPENDED
         
     | 
| 
      
 18 
     | 
    
         
            +
                        = link_to definition.name, definition
         
     | 
| 
       16 
19 
     | 
    
         
             
                      - if !definition.suspended? && !definition.job_schedules.empty?
         
     | 
| 
       17 
20 
     | 
    
         
             
                        - next_job_schedule = definition.job_schedules.map(&:next).min
         
     | 
| 
       18 
21 
     | 
    
         
             
                        - if next_job_schedule
         
     | 
| 
         @@ -34,7 +34,10 @@ 
     | 
|
| 
       34 
34 
     | 
    
         
             
                          span.star-holder
         
     | 
| 
       35 
35 
     | 
    
         
             
                            = star_link_for(definition)
         
     | 
| 
       36 
36 
     | 
    
         
             
                        td= definition.id
         
     | 
| 
       37 
     | 
    
         
            -
                        td.no-decorate 
     | 
| 
      
 37 
     | 
    
         
            +
                        td.no-decorate
         
     | 
| 
      
 38 
     | 
    
         
            +
                          - if definition.suspended
         
     | 
| 
      
 39 
     | 
    
         
            +
                            span.label.label-warning.spacer-right-3 SUSPENDED
         
     | 
| 
      
 40 
     | 
    
         
            +
                          = link_to definition.name, definition
         
     | 
| 
       38 
41 
     | 
    
         
             
                        td.no-decorate
         
     | 
| 
       39 
42 
     | 
    
         
             
                          - definition.admins.each do |user|
         
     | 
| 
       40 
43 
     | 
    
         
             
                            = link_to user.name, user_path(user)
         
     | 
| 
         @@ -80,9 +80,11 @@ 
     | 
|
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
                  .box-footer
         
     | 
| 
       82 
82 
     | 
    
         
             
                    .row
         
     | 
| 
       83 
     | 
    
         
            -
                      .col-md- 
     | 
| 
      
 83 
     | 
    
         
            +
                      .col-md-4
         
     | 
| 
       84 
84 
     | 
    
         
             
                        = link_to 'Edit Job definition', edit_job_definition_path(@definition), class: 'btn btn-default btn-block', role: 'button'
         
     | 
| 
       85 
     | 
    
         
            -
                      .col-md- 
     | 
| 
      
 85 
     | 
    
         
            +
                      .col-md-4
         
     | 
| 
      
 86 
     | 
    
         
            +
                        = link_to 'Duplicate Job definition', new_job_definition_path(dup_from: @definition.id), class: 'btn btn-default btn-block', role: 'button'
         
     | 
| 
      
 87 
     | 
    
         
            +
                      .col-md-4
         
     | 
| 
       86 
88 
     | 
    
         
             
                        = link_to 'Destroy Job definition', @definition, method: :delete, class: 'btn btn-default btn-block', role: 'button', data: { confirm: 'Are you sure?' }
         
     | 
| 
       87 
89 
     | 
    
         
             
              .col-md-5#schedules-holder
         
     | 
| 
       88 
90 
     | 
    
         
             
                = render template: 'kuroko2/job_schedules/index'
         
     | 
| 
         @@ -3,7 +3,7 @@ json.end   @end_at.strftime('%Y-%m-%d %H:%M:%S') 
     | 
|
| 
       3 
3 
     | 
    
         
             
            json.data do
         
     | 
| 
       4 
4 
     | 
    
         
             
              json.array! @instances do |instance|
         
     | 
| 
       5 
5 
     | 
    
         
             
                json.id instance.id
         
     | 
| 
       6 
     | 
    
         
            -
                json.content "<a href='#{job_definition_job_instance_path(instance.job_definition, instance)}'>##{instance.job_definition.id} #{instance.job_definition.name}</a>"
         
     | 
| 
      
 6 
     | 
    
         
            +
                json.content "<a href='#{job_definition_job_instance_path(instance.job_definition, instance)}'>##{instance.job_definition.id} #{html_escape(instance.job_definition.name)}</a>"
         
     | 
| 
       7 
7 
     | 
    
         
             
                json.start instance.created_at.strftime('%Y-%m-%d %H:%M:%S')
         
     | 
| 
       8 
8 
     | 
    
         
             
                json.end (instance.error_at || instance.canceled_at || instance.finished_at || Time.current).try!(:strftime, '%Y-%m-%d %H:%M:%S')
         
     | 
| 
       9 
9 
     | 
    
         
             
                json.group instance.job_definition.id
         
     | 
| 
         @@ -16,7 +16,7 @@ 
     | 
|
| 
       16 
16 
     | 
    
         
             
            - if @user.errors.any?
         
     | 
| 
       17 
17 
     | 
    
         
             
              .alert.alert-danger
         
     | 
| 
       18 
18 
     | 
    
         
             
                i.fa.fa-ban
         
     | 
| 
       19 
     | 
    
         
            -
                h4 #{pluralize(@user.errors.count, "error")} prohibited this  
     | 
| 
      
 19 
     | 
    
         
            +
                h4 #{pluralize(@user.errors.count, "error")} prohibited this user from being saved:
         
     | 
| 
       20 
20 
     | 
    
         
             
                ul
         
     | 
| 
       21 
21 
     | 
    
         
             
                - @user.errors.full_messages.each do |message|
         
     | 
| 
       22 
22 
     | 
    
         
             
                  li= message
         
     | 
    
        data/config/routes.rb
    CHANGED
    
    | 
         @@ -42,8 +42,8 @@ Kuroko2::Engine.routes.draw do 
     | 
|
| 
       42 
42 
     | 
    
         
             
              get '/osd' => 'dashboard#osd', as: :osd
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
       44 
44 
     | 
    
         
             
              scope :v1, module: 'api', as: 'api' do
         
     | 
| 
       45 
     | 
    
         
            -
                resources :job_definitions, path: 'definitions', only:  
     | 
| 
       46 
     | 
    
         
            -
                  resources :job_instances, path: 'instances', only:  
     | 
| 
      
 45 
     | 
    
         
            +
                resources :job_definitions, path: 'definitions', only: %w(create show update) do
         
     | 
| 
      
 46 
     | 
    
         
            +
                  resources :job_instances, path: 'instances', only: %w(show create)
         
     | 
| 
       47 
47 
     | 
    
         
             
                end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                namespace :stats do
         
     | 
| 
         @@ -25,7 +25,7 @@ module Kuroko2 
     | 
|
| 
       25 
25 
     | 
    
         
             
                      node = extract_node(token)
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                      message = "(token #{token.uuid}) Retry current node: '#{node.type}: #{node.option}'"
         
     | 
| 
       28 
     | 
    
         
            -
                      token.job_instance. 
     | 
| 
      
 28 
     | 
    
         
            +
                      token.job_instance.update_columns(error_at: nil, retrying: true)
         
     | 
| 
       29 
29 
     | 
    
         
             
                      token.job_instance.logs.info(message)
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                      token.mark_as_working
         
     | 
| 
         @@ -119,7 +119,11 @@ module Kuroko2 
     | 
|
| 
       119 
119 
     | 
    
         
             
                      token.mark_as_finished
         
     | 
| 
       120 
120 
     | 
    
         
             
                      unless token.parent
         
     | 
| 
       121 
121 
     | 
    
         
             
                        token.job_instance.touch(:finished_at)
         
     | 
| 
       122 
     | 
    
         
            -
                         
     | 
| 
      
 122 
     | 
    
         
            +
                        if token.job_instance.retrying?
         
     | 
| 
      
 123 
     | 
    
         
            +
                          Notifier.notify(:back_to_normal, token.job_instance)
         
     | 
| 
      
 124 
     | 
    
         
            +
                        else
         
     | 
| 
      
 125 
     | 
    
         
            +
                          Notifier.notify(:finished, token.job_instance)
         
     | 
| 
      
 126 
     | 
    
         
            +
                        end
         
     | 
| 
       123 
127 
     | 
    
         
             
                        token.destroy!
         
     | 
| 
       124 
128 
     | 
    
         
             
                      end
         
     | 
| 
       125 
129 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -79,6 +79,11 @@ module Kuroko2 
     | 
|
| 
       79 
79 
     | 
    
         
             
                      end
         
     | 
| 
       80 
80 
     | 
    
         
             
                    end
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
      
 82 
     | 
    
         
            +
                    def notify_back_to_normal
         
     | 
| 
      
 83 
     | 
    
         
            +
                      message = build_message(level: 'SUCCESS', text: message_builder.back_to_normal_text)
         
     | 
| 
      
 84 
     | 
    
         
            +
                      send_to_hipchat(message)
         
     | 
| 
      
 85 
     | 
    
         
            +
                    end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
       82 
87 
     | 
    
         
             
                    def notify_long_elapsed_time
         
     | 
| 
       83 
88 
     | 
    
         
             
                      message = build_message(level: 'WARNING', text: message_builder.long_elapsed_time_text)
         
     | 
| 
       84 
89 
     | 
    
         
             
                      send_to_hipchat(message, color: 'red')
         
     | 
| 
         @@ -88,6 +88,13 @@ module Kuroko2 
     | 
|
| 
       88 
88 
     | 
    
         
             
                      end
         
     | 
| 
       89 
89 
     | 
    
         
             
                    end
         
     | 
| 
       90 
90 
     | 
    
         | 
| 
      
 91 
     | 
    
         
            +
                    def notify_back_to_normal
         
     | 
| 
      
 92 
     | 
    
         
            +
                      send_attachment_message_to_slack(
         
     | 
| 
      
 93 
     | 
    
         
            +
                        level: 'SUCCESS',
         
     | 
| 
      
 94 
     | 
    
         
            +
                        text: message_builder.back_to_normal_text,
         
     | 
| 
      
 95 
     | 
    
         
            +
                      )
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
       91 
98 
     | 
    
         
             
                    def notify_long_elapsed_time
         
     | 
| 
       92 
99 
     | 
    
         
             
                      send_attachment_message_to_slack(
         
     | 
| 
       93 
100 
     | 
    
         
             
                        level: 'WARNING',
         
     | 
| 
         @@ -100,6 +100,16 @@ module Kuroko2 
     | 
|
| 
       100 
100 
     | 
    
         
             
                      end
         
     | 
| 
       101 
101 
     | 
    
         
             
                    end
         
     | 
| 
       102 
102 
     | 
    
         | 
| 
      
 103 
     | 
    
         
            +
                    def notify_back_to_normal
         
     | 
| 
      
 104 
     | 
    
         
            +
                      request(
         
     | 
| 
      
 105 
     | 
    
         
            +
                        build_payload(
         
     | 
| 
      
 106 
     | 
    
         
            +
                          action: 'notify_back_to_normal',
         
     | 
| 
      
 107 
     | 
    
         
            +
                          level: 'SUCCESS',
         
     | 
| 
      
 108 
     | 
    
         
            +
                          subject: message_builder.back_to_normal_text,
         
     | 
| 
      
 109 
     | 
    
         
            +
                        )
         
     | 
| 
      
 110 
     | 
    
         
            +
                      )
         
     | 
| 
      
 111 
     | 
    
         
            +
                    end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
       103 
113 
     | 
    
         
             
                    def notify_long_elapsed_time
         
     | 
| 
       104 
114 
     | 
    
         
             
                      request(
         
     | 
| 
       105 
115 
     | 
    
         
             
                        build_payload(
         
     | 
    
        data/lib/kuroko2/version.rb
    CHANGED
    
    
| 
         @@ -38,6 +38,68 @@ describe Kuroko2::JobDefinitionsController do 
     | 
|
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
                  expect(assigns(:definition)).to be_new_record
         
     | 
| 
       40 
40 
     | 
    
         
             
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                context 'with dup_from params' do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  subject! { get :new, params: { dup_from: definition.id } }
         
     | 
| 
      
 44 
     | 
    
         
            +
                  it do
         
     | 
| 
      
 45 
     | 
    
         
            +
                    expect(response).to have_http_status(:ok)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    expect(response).to render_template('new')
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    expect(assigns(:definition)).to be_new_record
         
     | 
| 
      
 49 
     | 
    
         
            +
                    expect(assigns(:definition).name).to eq definition.name
         
     | 
| 
      
 50 
     | 
    
         
            +
                    expect(assigns(:definition).admins).to eq definition.admins + [controller.current_user]
         
     | 
| 
      
 51 
     | 
    
         
            +
                    expect(assigns(:definition).tags).to eq definition.tags
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  context 'with current_user and another admin user' do
         
     | 
| 
      
 55 
     | 
    
         
            +
                    let!(:admin_user) { create(:user) }
         
     | 
| 
      
 56 
     | 
    
         
            +
                    let!(:definition) { create(:job_definition, admins: [admin_user, controller.current_user]) }
         
     | 
| 
      
 57 
     | 
    
         
            +
                    it do
         
     | 
| 
      
 58 
     | 
    
         
            +
                      expect(response).to have_http_status(:ok)
         
     | 
| 
      
 59 
     | 
    
         
            +
                      expect(response).to render_template('new')
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                      expect(assigns(:definition)).to be_new_record
         
     | 
| 
      
 62 
     | 
    
         
            +
                      expect(assigns(:definition).name).to eq definition.name
         
     | 
| 
      
 63 
     | 
    
         
            +
                      expect(assigns(:definition).admins).to match_array [admin_user, controller.current_user]
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    context 'with only another admin user' do
         
     | 
| 
      
 67 
     | 
    
         
            +
                      let!(:definition) { create(:job_definition, admins: [admin_user]) }
         
     | 
| 
      
 68 
     | 
    
         
            +
                      it do
         
     | 
| 
      
 69 
     | 
    
         
            +
                        expect(response).to have_http_status(:ok)
         
     | 
| 
      
 70 
     | 
    
         
            +
                        expect(response).to render_template('new')
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                        expect(assigns(:definition)).to be_new_record
         
     | 
| 
      
 73 
     | 
    
         
            +
                        expect(assigns(:definition).name).to eq definition.name
         
     | 
| 
      
 74 
     | 
    
         
            +
                        expect(assigns(:definition).admins).to match_array [admin_user, controller.current_user]
         
     | 
| 
      
 75 
     | 
    
         
            +
                      end
         
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  context 'with tags' do
         
     | 
| 
      
 80 
     | 
    
         
            +
                    let!(:definition) { create(:job_definition, text_tags: 'First,Second') }
         
     | 
| 
      
 81 
     | 
    
         
            +
                    it do
         
     | 
| 
      
 82 
     | 
    
         
            +
                      expect(response).to have_http_status(:ok)
         
     | 
| 
      
 83 
     | 
    
         
            +
                      expect(response).to render_template('new')
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                      expect(assigns(:definition)).to be_new_record
         
     | 
| 
      
 86 
     | 
    
         
            +
                      expect(assigns(:definition).name).to eq definition.name
         
     | 
| 
      
 87 
     | 
    
         
            +
                      expect(assigns(:definition).text_tags).to eq definition.text_tags
         
     | 
| 
      
 88 
     | 
    
         
            +
                    end
         
     | 
| 
      
 89 
     | 
    
         
            +
                  end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                  context 'with invalid id' do
         
     | 
| 
      
 92 
     | 
    
         
            +
                    subject! { get :new, params: { dup_from: 'invalid' } }
         
     | 
| 
      
 93 
     | 
    
         
            +
                    it do
         
     | 
| 
      
 94 
     | 
    
         
            +
                      expect(response).to have_http_status(:ok)
         
     | 
| 
      
 95 
     | 
    
         
            +
                      expect(response).to render_template('new')
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                      expect(assigns(:definition)).to be_new_record
         
     | 
| 
      
 98 
     | 
    
         
            +
                      expect(assigns(:definition).name).to be_blank
         
     | 
| 
      
 99 
     | 
    
         
            +
                      expect(assigns(:definition).admins).to eq [controller.current_user]
         
     | 
| 
      
 100 
     | 
    
         
            +
                    end
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
       41 
103 
     | 
    
         
             
              end
         
     | 
| 
       42 
104 
     | 
    
         | 
| 
       43 
105 
     | 
    
         
             
              describe '#create' do
         
     |