rocketjob_mission_control 1.2.1 → 1.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 304c034afa2db7c0db432bc35a23cf61a98bb0ea
4
- data.tar.gz: af4d336900d12e6f2aa7b3913e024ff7bd3dec8b
3
+ metadata.gz: 77e3e2d84930ed4d9f4f02099057948af722ee7c
4
+ data.tar.gz: 6ff14b67a5c4855d0c66d41d684a633f3a94c6d4
5
5
  SHA512:
6
- metadata.gz: 322c4304792cba14b21561dbea0e3f33e7bcbe44db1dd4a21ae5598b9e9e8af4ae32a7e02419cc37344e3a687ac5e8089694d790ee00345cb3470a8b9026d0bb
7
- data.tar.gz: 8c512bd2504b5f0dfd1acff972d661219a45d8ec53c4dd7c43696f62e10b94acb7d0c4301dbab2ec2831e8b38d3647b46203de897014d18644690e9e424eac8e
6
+ metadata.gz: 18bc9dfc4e06fdd0f0a1d4b49ce6a9bfbb130c8e38402bdc8f124f3e322e7fb94dd240a46e3b6a286e067d69c393d7e71abcfca62fcac49839798b670d5dbd19
7
+ data.tar.gz: f50ac9b5b4dea01e2bbe28b21586970e981e5a69e52bc6c381af54f78d945e21ac8dcf30236136e47b69a432666026523fa29d38f91b38a1fa4595204e309db4
@@ -15,4 +15,5 @@
15
15
  //= require jquery.bootstrap-touchspin
16
16
  //= require bootstrap-sprockets
17
17
  //= require prism
18
+ //= require selectize
18
19
  //= require_tree .
@@ -7,12 +7,9 @@ $(document).on 'ready', ->
7
7
  window.location.href = window.location.href.replace( /[\?#].*|$/, param_string );
8
8
 
9
9
  if $('#properties').length
10
- $('#expand').on 'click', ->
11
- $(this).hide()
12
- $('#collapse').show()
13
- $('#properties').show()
14
- $('#collapse').on 'click', ->
15
- $(this).hide()
16
- $('#expand').show()
17
- $('#properties').hide()
10
+ $('#properties').on 'click', ->
11
+ job_class_name = $('#rocket_job_dirmon_entry_job_class_name').val()
12
+ perform_method = $('#rocket_job_dirmon_entry_perform_method').val()
13
+ new_dirmon_path = $('#properties').data('url') + "?job_class_name=#{job_class_name}&perform_method=#{perform_method}"
14
+ window.location = new_dirmon_path
18
15
 
@@ -0,0 +1,5 @@
1
+ $(document).on 'ready', ->
2
+ $('select.selectize').selectize(
3
+ create: true
4
+ hideSelected: true
5
+ )
@@ -10,6 +10,8 @@
10
10
  * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
11
  * file per style scope.
12
12
  *
13
+ *= require selectize
14
+ *= require selectize.default
13
15
  *= require_self
14
16
  *= require_tree .
15
17
  */
@@ -1,3 +1,4 @@
1
+ require 'csv'
1
2
  module RocketJobMissionControl
2
3
  class DirmonEntriesController < RocketJobMissionControl::ApplicationController
3
4
  before_filter :find_entry_or_redirect, except: [:index, :new, :create]
@@ -11,13 +12,21 @@ module RocketJobMissionControl
11
12
  end
12
13
 
13
14
  def new
14
- @dirmon_entry = RocketJob::DirmonEntry.new(arguments: nil)
15
+ job_class_name = params[:job_class_name]
16
+ perform_method = params[:perform_method] || :perform
17
+ @dirmon_entry = RocketJob::DirmonEntry.new(arguments: nil, job_class_name: job_class_name, perform: perform_method)
18
+ @previous_job_class_names = RocketJob::DirmonEntry.distinct(:job_class_name)
19
+
20
+ if job_class_name && !@dirmon_entry.job_class
21
+ @dirmon_entry.errors.add(:job_class_name, 'Invalid Job Class')
22
+ end
15
23
  end
16
24
 
17
25
  def create
18
26
  @dirmon_entry = RocketJob::DirmonEntry.new(dirmon_params)
19
27
 
20
28
  parse_and_assign_arguments
29
+ parse_and_assign_properties
21
30
 
22
31
  if @dirmon_entry.errors.empty? && @dirmon_entry.save
23
32
  flash[:success] = t(:success, scope: [:dirmon_entry, :create])
@@ -39,8 +48,10 @@ module RocketJobMissionControl
39
48
  end
40
49
 
41
50
  def update
51
+ @dirmon_entry.attributes = dirmon_params
42
52
  parse_and_assign_arguments
43
- if @dirmon_entry.errors.empty? && @dirmon_entry.update_attributes(dirmon_params)
53
+ parse_and_assign_properties
54
+ if @dirmon_entry.errors.empty? && @dirmon_entry.save
44
55
  flash[:success] = t(:success, scope: [:dirmon_entry, :update])
45
56
  redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
46
57
  else
@@ -55,7 +66,7 @@ module RocketJobMissionControl
55
66
  flash[:success] = t(:success, scope: [:dirmon_entry, :enable])
56
67
  redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
57
68
  else
58
- flash[:alert] = t(:failure, scope: [:dirmon_entry, :enable])
69
+ flash[:alert] = t(:failure, scope: [:dirmon_entry, :enable])
59
70
  load_entries
60
71
  render(:show)
61
72
  end
@@ -67,22 +78,60 @@ module RocketJobMissionControl
67
78
  flash[:success] = t(:success, scope: [:dirmon_entry, :disable])
68
79
  redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
69
80
  else
70
- flash[:alert] = t(:failure, scope: [:dirmon_entry, :disable])
81
+ flash[:alert] = t(:failure, scope: [:dirmon_entry, :disable])
71
82
  load_entries
72
83
  render(:show)
73
84
  end
74
85
  end
75
86
 
87
+ def properties
88
+ @dirmon_entry = RocketJob::DirmonEntry.new(dirmon_params)
89
+ render json: @dirmon_entry
90
+ end
91
+
76
92
  private
77
93
 
78
94
  def parse_and_assign_arguments
79
- arguments = params[:rocket_job_dirmon_entry][:arguments]
80
- arguments = arguments.blank? ? '[]' : arguments
95
+ arguments = params[:rocket_job_dirmon_entry][:arguments] || []
96
+ @dirmon_entry.arguments = arguments.collect do |value|
97
+ cleansed = parse_array_element(value, :arguments, true)
98
+ @dirmon_entry.errors.add(:arguments, 'All arguments are mandatory') unless cleansed
99
+ cleansed
100
+ end
101
+ end
102
+
103
+ def parse_and_assign_properties
104
+ properties = params[:rocket_job_dirmon_entry].fetch(:properties, {})
105
+ properties.each_pair do |property, value|
106
+ if key = @dirmon_entry.job_class.keys[property]
107
+ if key.type == Hash
108
+ begin
109
+ @dirmon_entry.properties[property] = JSON.parse(value)
110
+ rescue JSON::ParserError => e
111
+ @dirmon_entry.errors.add(:properties, e.message)
112
+ end
113
+ else
114
+ @dirmon_entry.properties[property] = value
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ # Returns [Array<String>] an array from the supplied string
121
+ # String can also be in JSON format
122
+ def parse_array_element(value, attribute, could_be_singleton = false)
123
+ return if value.blank?
81
124
  begin
82
- arguments = JSON.parse(arguments)
83
- @dirmon_entry.arguments = arguments.kind_of?(Array) ? arguments : [arguments]
125
+ JSON.parse(value)
84
126
  rescue JSON::ParserError => e
85
- @dirmon_entry.errors.add(:arguments, e.message)
127
+ begin
128
+ values = CSV.parse(value).first.collect { |col| JSON.parse("[#{col.to_s.strip}]").first }
129
+ could_be_singleton && (values.size == 1) ? values.first : values
130
+ rescue Exception => exc
131
+ @dirmon_entry.errors.add(attribute, e.message)
132
+ @dirmon_entry.errors.add(attribute, exc.message)
133
+ value
134
+ end
86
135
  end
87
136
  end
88
137
 
@@ -88,7 +88,11 @@ module RocketJobMissionControl
88
88
  end
89
89
 
90
90
  def error_occurred(exception)
91
- logger.error 'Error loading a job', exception
91
+ if defined?(SemanticLogger::Logger) && logger.is_a?(SemanticLogger::Logger)
92
+ logger.error 'Error loading a job', exception
93
+ else
94
+ logger.error "Error loading a job. #{log.exception.class}: #{log.exception.message}\n#{(log.exception.backtrace || []).join("\n")}"
95
+ end
92
96
  flash[:danger] = 'Error loading jobs.'
93
97
  raise exception if Rails.env.development?
94
98
  redirect_to :back
@@ -12,6 +12,9 @@ class JobFailures
12
12
  def list
13
13
  @slice_errors ||= job.input.collection.aggregate(
14
14
  [
15
+ {
16
+ '$match' => { state: 'failed' }
17
+ },
15
18
  {
16
19
  '$group' => {
17
20
  _id: { error_class: '$exception.class_name' },
@@ -1,7 +1,7 @@
1
1
  - action ||= :create
2
2
  - if @dirmon_entry.errors.present?
3
3
  .alert.alert-alert
4
- Error saving entry!
4
+ Invalid Dirmon entry!
5
5
  - @dirmon_entry.errors.messages.each_pair do |field, message|
6
6
  .message
7
7
  = "#{field}: #{message}"
@@ -12,28 +12,25 @@
12
12
  .path.form-group
13
13
  = f.label :pattern
14
14
  = f.text_field :pattern, class: 'form-control'
15
- .path.form-group
16
- = f.label :archive_directory
17
- = f.text_field :archive_directory, class: 'form-control'
18
15
  .job.form-group
19
16
  = f.label :job_class_name
20
- = f.text_field :job_class_name, class: 'form-control'
17
+ = f.text_field :job_class_name, class: 'form-control', disabled: action != :create
21
18
  .job.form-group
22
19
  = f.label :perform_method
23
- = f.text_field :perform_method, class: 'form-control'
24
- .job_arguments.form-group
25
- = f.label :arguments
26
- = f.text_area :arguments,
27
- value: @dirmon_entry.arguments.empty? ? nil : @dirmon_entry.arguments.to_json,
28
- rows: 10,
29
- placeholder: '{"argument1"":"value1", "argument2":"value2", "argument3":"value3"}',
30
- class: 'form-control'
20
+ = f.text_field :perform_method, class: 'form-control', disabled: action != :create
21
+ .path.form-group
22
+ = f.label :archive_directory
23
+ = f.text_field :archive_directory, class: 'form-control'
31
24
  .row
32
- .col-md-12#properties{ style: 'display:none;' }
25
+ .col-md-12
33
26
  = render partial: 'properties', locals: { f: f }
34
27
 
35
28
  .buttons
36
29
  = f.submit action, class: 'btn btn-primary'
37
30
  = link_to 'cancel', :back, class: 'btn btn-default'
38
- = button_tag 'properties',type: 'button', class: 'btn btn-default', id: 'expand'
39
- = button_tag 'collapse',type: 'button', class: 'btn btn-default', id: 'collapse', style: 'display:none;'
31
+ - if action == :create
32
+ = button_tag 'properties',
33
+ type: 'button',
34
+ class: 'btn btn-default',
35
+ id: 'properties',
36
+ data: { url: rocket_job_mission_control.new_dirmon_entry_path }
@@ -1,8 +1,38 @@
1
- .arguments
2
- = f.fields_for :properties do |properties|
3
- .form-group
4
- = properties.label :description
5
- = properties.text_field :description, value: @dirmon_entry.properties[:description], placeholder: "max length: 128", class: 'form-control'
6
- .form-group
7
- = properties.label :priority
8
- = properties.text_field :priority, value: @dirmon_entry.properties[:priority], placeholder: "e.g 1..100", class: 'form-control'
1
+ - if @dirmon_entry.job_class
2
+ .arguments
3
+ .job_arguments.form-group
4
+ - count = @dirmon_entry.job_class.argument_count(@dirmon_entry.perform_method)
5
+ - count.times do |counter|
6
+ - argument = @dirmon_entry.arguments[counter]
7
+ = f.label "Argument #{counter + 1}:"
8
+ = f.text_field :arguments,
9
+ value: argument.is_a?(Hash) || argument.is_a?(Array) ? argument.to_json : argument,
10
+ name: 'rocket_job_dirmon_entry[arguments][]',
11
+ rows: 10,
12
+ placeholder: '{"argument1":"value1", "argument2":"value2", "argument3":"value3"}',
13
+ class: 'form-control'
14
+ = f.fields_for :properties do |properties|
15
+ - @dirmon_entry.job_class.rocket_job_properties.each do |property_name|
16
+ - next if [:arguments, :perform_method].include?(property_name)
17
+ - key = @dirmon_entry.job_class.keys[property_name.to_s]
18
+ - next unless key
19
+ - placeholder = key.default? ? key.default : nil
20
+ .form-group
21
+ = properties.label property_name.to_s
22
+ - case key.type.name
23
+ - when 'Integer'
24
+ = properties.number_field property_name, value: @dirmon_entry.properties[property_name], class: 'form-control', placeholder: placeholder
25
+ - when 'Array'
26
+ - options = Array(@dirmon_entry.properties[property_name])
27
+ = properties.select property_name, options_for_select(options, options), {include_hidden: false}, {class: 'selectize', multiple: true}
28
+ - when 'Boolean'
29
+ - name = "#{property_name}_true".to_sym
30
+ .radio-buttons
31
+ = properties.label name, 'true'
32
+ = properties.radio_button(property_name, 'true', checked: @dirmon_entry.properties[property_name] == 'true')
33
+ = properties.label name, 'false'
34
+ = properties.radio_button(property_name, 'false', checked: @dirmon_entry.properties[property_name] == 'false')
35
+ = properties.label name, 'none'
36
+ = properties.radio_button(property_name, '', checked: @dirmon_entry.properties[property_name].blank?)
37
+ - else
38
+ = properties.text_field property_name, value: @dirmon_entry.properties[property_name], class: 'form-control', placeholder: placeholder
@@ -13,14 +13,19 @@
13
13
  %div
14
14
  %label Archive Directory:
15
15
  = @dirmon_entry.archive_directory
16
- .parameters
17
- %label Arguments:
18
- %pre
19
- %code= pretty_print_array_or_hash(@dirmon_entry.arguments)
20
- .parameters
21
- %label Properties:
22
- %pre
23
- %code= pretty_print_array_or_hash(@dirmon_entry.properties)
16
+ -if @dirmon_entry.arguments.size > 0
17
+ .parameters
18
+ %label Arguments:
19
+ %pre
20
+ %code= pretty_print_array_or_hash(@dirmon_entry.arguments)
21
+ - @dirmon_entry.properties.each_pair do |name, value|
22
+ .parameters
23
+ %label= "#{name.to_s.titleize}:"
24
+ - if value.is_a?(Array) || value.is_a?(Hash)
25
+ %pre
26
+ %code= pretty_print_array_or_hash(value)
27
+ - else
28
+ = value
24
29
  .id
25
30
  %label ID:
26
31
  = @dirmon_entry.id
@@ -17,8 +17,7 @@
17
17
  - if job.kind_of?(RocketJob::SlicedJob)
18
18
  .slice_count
19
19
  %label Slices Running:
20
- -#= job.input.find_all { |s| s.state == :running }.count
21
- = job.input.collection.aggregate([{ '$match' => { state: 'queued' } },{ '$group' => { _id: nil, count: { '$sum' => 1 } } }] )
20
+ = job.input.find_all { |s| s.state == :running }.count
22
21
  - else
23
22
  .worker
24
23
  %label Worker:
@@ -46,7 +46,7 @@
46
46
  - if valid_events.include?(:retry)
47
47
  = job_action_link('retry', rocket_job_mission_control.retry_job_path(@job), :patch)
48
48
 
49
- - if @job.failed? && @job.kind_of?(RocketJob::SlicedJob)
49
+ - if @job.failed? && @job.kind_of?(RocketJob::SlicedJob) && @job.input.failed_count > 0
50
50
  = link_to("view errors", job_failures_path(@job), class: 'btn btn-default')
51
51
 
52
52
  .clearfix
@@ -11,5 +11,6 @@ module RocketJobMissionControl
11
11
  require 'bootstrap-sass'
12
12
  require 'sass-rails'
13
13
  require 'coffee-rails'
14
+ require 'selectize-rails'
14
15
  end
15
16
  end
@@ -1,3 +1,3 @@
1
1
  module RocketJobMissionControl
2
- VERSION = '1.2.1'
2
+ VERSION = '1.2.2'
3
3
  end