foreman_remote_execution 8.1.0 → 8.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a4cbf1cdf74f0bd20c4729a8bc05a7a3bb2a958bace18d30755fb600d0a999c
4
- data.tar.gz: 7eac3c732b1c9b05e9c0909d952b859010cdeef677324353901859232d8ab3b0
3
+ metadata.gz: 13f80e6dffc1166fb7f5e423ea6543b6d89a5f8f45930c29073bf28e232bde0b
4
+ data.tar.gz: 0f489c08c07a1eb217feec2d1b9325f3e5c9ce248becbaf68562471aac889cd0
5
5
  SHA512:
6
- metadata.gz: 42280d6aadec2d5ede443a1c81f688ce838bf388a65b4abdd30ab3d03953c33986023f0aee445e06cf908b5d6040e716a7bc8582b6059f553f400a4328ace60a
7
- data.tar.gz: 3248ccc1bc2f48d61d3538f171d8f6c005b241c654ca2949833993896489bbc4d2ca2c2e0f7f0776dbd6d352f63d0fc2a292edb29f1df3cf6d402ffc16feb1c8
6
+ metadata.gz: 88032e02e3375cb7d19992efaad18932e7eef3948e8822dc8ad573a790ce4077273012f861b49a8351cda44f4b272b84ef0bc8e8a7124a2d2a71c759026a1d87
7
+ data.tar.gz: 8d0aec0264bdae9ba1530940088daeef369546a2ad9102d7d4eb1b7527f2cd1402d37915d4e9f659d845706938cd0dc7fc8299d1559c21b17cd404cdf91a22df
@@ -21,8 +21,11 @@ module Actions
21
21
  end
22
22
 
23
23
  def process_proxy_data(data)
24
- events = data['result'].map do |update|
24
+ events = data['result'].each_with_index.map do |update, seq_id|
25
25
  {
26
+ # For N-1 compatibility, we assume that the output provided here is
27
+ # complete
28
+ sequence_id: update['sequence_id'] || seq_id,
26
29
  template_invocation_id: template_invocation.id,
27
30
  event: update['output'],
28
31
  timestamp: Time.at(update['timestamp']).getlocal,
@@ -31,14 +34,15 @@ module Actions
31
34
  end
32
35
  if data['exit_status']
33
36
  events << {
37
+ sequence_id: events.last[:sequence_id] + 1,
34
38
  template_invocation_id: template_invocation.id,
35
39
  event: data['exit_status'],
36
- timestamp: events.last[:timestamp] + 0.0001,
40
+ timestamp: events.last[:timestamp],
37
41
  event_type: 'exit',
38
42
  }
39
43
  end
40
44
  events.each_slice(1000) do |batch|
41
- TemplateInvocationEvent.upsert_all(batch, unique_by: [:template_invocation_id, :timestamp, :event_type]) # rubocop:disable Rails/SkipsModelValidations
45
+ TemplateInvocationEvent.upsert_all(batch, unique_by: [:template_invocation_id, :sequence_id]) # rubocop:disable Rails/SkipsModelValidations
42
46
  end
43
47
  end
44
48
  end
@@ -169,7 +169,7 @@ module Actions
169
169
  # This is enough, the error will get shown using add_exception at the end of the method
170
170
  end
171
171
 
172
- task.template_invocation.template_invocation_events.find_each do |output|
172
+ task.template_invocation.template_invocation_events.order(:sequence_id).find_each do |output|
173
173
  if output.event_type == 'exit'
174
174
  continuous_output.add_output(_('Exit status: %s') % output.event, 'stdout', output.timestamp)
175
175
  else
@@ -0,0 +1,36 @@
1
+ class RedefineTemplateInvocationEventsIndex < ActiveRecord::Migration[6.0]
2
+ def up
3
+ change_table :template_invocation_events do |t|
4
+ t.remove_index name: :unique_template_invocation_events_index
5
+ t.integer :sequence_id
6
+ end
7
+
8
+ execute <<~SQL
9
+ WITH extended_t AS
10
+ (
11
+ SELECT id, row_number() over (PARTITION BY template_invocation_id ORDER BY timestamp ASC) AS rn
12
+ FROM template_invocation_events
13
+ )
14
+ UPDATE template_invocation_events SET sequence_id = extended_t.rn
15
+ FROM extended_t
16
+ WHERE template_invocation_events.id = extended_t.id;
17
+ SQL
18
+
19
+ change_table :template_invocation_events do |t|
20
+ t.index [:template_invocation_id, :sequence_id],
21
+ unique: true,
22
+ name: 'unique_template_invocation_events_index'
23
+ t.change :sequence_id, :integer, null: false
24
+ end
25
+ end
26
+
27
+ def down
28
+ change_table :template_invocation_events do |t|
29
+ t.remove_index name: :unique_template_invocation_events_index
30
+ t.remove :sequence_id
31
+ t.index [:template_invocation_id, :timestamp, :event_type],
32
+ unique: true,
33
+ name: 'unique_template_invocation_events_index'
34
+ end
35
+ end
36
+ end
@@ -79,7 +79,7 @@ module ForemanRemoteExecution
79
79
  type: :string,
80
80
  description: N_('Default user to use for executing the script. If the user differs from the SSH user, su or sudo is used to switch the user.'),
81
81
  default: 'root',
82
- full_name: N_('Efffective User')
82
+ full_name: N_('Effective User')
83
83
  setting 'remote_execution_effective_user_method',
84
84
  type: :string,
85
85
  description: N_('What command should be used to switch to the effective user. One of %s') % SSHExecutionProvider::EFFECTIVE_USER_METHODS.inspect,
@@ -1,3 +1,3 @@
1
1
  module ForemanRemoteExecution
2
- VERSION = '8.1.0'.freeze
2
+ VERSION = '8.1.1'.freeze
3
3
  end
@@ -48,7 +48,7 @@ export const JobWizard = ({ rerunData }) => {
48
48
  rerunData?.job_category || jobCategoriesResponse?.default_category || ''
49
49
  );
50
50
  const [advancedValues, setAdvancedValues] = useState({ templateValues: {} });
51
- const [templateValues, setTemplateValues] = useState({}); // TODO use templateValues in advanced fields - description https://github.com/theforeman/foreman_remote_execution/pull/605
51
+ const [templateValues, setTemplateValues] = useState({});
52
52
  const [scheduleValue, setScheduleValue] = useState(initialScheduleState);
53
53
  const [selectedTargets, setSelectedTargets] = useState({
54
54
  hosts: [],
@@ -378,6 +378,7 @@ export const JobWizard = ({ rerunData }) => {
378
378
  hostsSearchQuery,
379
379
  location,
380
380
  organization,
381
+ feature: routerSearch?.feature,
381
382
  });
382
383
  }}
383
384
  />
@@ -57,9 +57,6 @@
57
57
  margin: 0;
58
58
  }
59
59
  .schedule-tab {
60
- .advanced-scheduling-button {
61
- text-align: start;
62
- }
63
60
  #repeat-on-weekly {
64
61
  display: grid;
65
62
  grid-template-columns: repeat(7, 1fr);
@@ -92,7 +89,7 @@
92
89
  display: inline-block;
93
90
  align-self: center;
94
91
  }
95
- .scheudle-radio-wrapper {
92
+ .schedule-radio-wrapper {
96
93
  display: flex;
97
94
  }
98
95
  }
@@ -117,7 +117,7 @@ export const ScheduleRecurring = ({
117
117
  id="start-at"
118
118
  className="schedule-radio"
119
119
  label={
120
- <div className="scheudle-radio-wrapper">
120
+ <div className="schedule-radio-wrapper">
121
121
  <div className="schedule-radio-title">{__('At')}</div>
122
122
  <DateTimePicker
123
123
  ariaLabel="starts at"
@@ -197,7 +197,7 @@ export const ScheduleRecurring = ({
197
197
  id="ends-on"
198
198
  className="schedule-radio"
199
199
  label={
200
- <div className="scheudle-radio-wrapper">
200
+ <div className="schedule-radio-wrapper">
201
201
  <div className="schedule-radio-title">{__('On')}</div>
202
202
  <DateTimePicker
203
203
  ariaLabel="ends on"
@@ -229,7 +229,7 @@ export const ScheduleRecurring = ({
229
229
  id="ends-after"
230
230
  className="schedule-radio"
231
231
  label={
232
- <div className="scheudle-radio-wrapper">
232
+ <div className="schedule-radio-wrapper">
233
233
  <div className="schedule-radio-title">{__('After')}</div>
234
234
  <FormGroup
235
235
  helperTextInvalid={__(
@@ -11,6 +11,7 @@ export const submit = ({
11
11
  hostsSearchQuery,
12
12
  location,
13
13
  organization,
14
+ feature,
14
15
  dispatch,
15
16
  }) => {
16
17
  const {
@@ -65,7 +66,7 @@ export const submit = ({
65
66
  location,
66
67
  organization,
67
68
  job_invocation: {
68
- job_template_id: jobTemplateID,
69
+ job_template_id: feature ? null : jobTemplateID,
69
70
  targeting_type: scheduleValue?.isTypeStatic
70
71
  ? 'static_query'
71
72
  : 'dynamic_query',
@@ -107,7 +108,7 @@ export const submit = ({
107
108
  buildHostQuery(selectedTargets, hostsSearchQuery) || 'name ~ *',
108
109
  description_format: description,
109
110
  execution_timeout_interval: timeoutToKill,
110
- feature: '', // TODO add value after https://github.com/theforeman/foreman_remote_execution/pull/629
111
+ feature,
111
112
  time_to_pickup: timeToPickup,
112
113
  },
113
114
  };
@@ -6,9 +6,10 @@ export const runFeature = (hostId, feature, label) => dispatch => {
6
6
  const url = foremanUrl(
7
7
  `/job_invocations?feature=${feature}&host_ids%5B%5D=${hostId}`
8
8
  );
9
+ const redirectUrl = 'job_invocations/new';
9
10
 
10
11
  const successToast = ({ request }) => {
11
- if (request.responseURL.includes('job_invocations?')) {
12
+ if (request.responseURL.includes(redirectUrl)) {
12
13
  return __('Opening job invocation form');
13
14
  }
14
15
  return sprintf(__('%s job has been invoked'), label);
@@ -21,12 +22,9 @@ export const runFeature = (hostId, feature, label) => dispatch => {
21
22
  successToast,
22
23
  errorToast,
23
24
  handleSuccess: ({ request }) => {
24
- if (request.responseURL.includes('job_invocations?')) {
25
+ if (request.responseURL.includes(redirectUrl)) {
25
26
  // checking if user should be redicted to finish setting up the job
26
- window.location.href = request.responseURL.replace(
27
- 'job_invocations?',
28
- 'job_invocations/new?'
29
- );
27
+ window.location.href = request.responseURL;
30
28
  }
31
29
  },
32
30
  })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_remote_execution
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.1.0
4
+ version: 8.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Remote Execution team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-10 00:00:00.000000000 Z
11
+ date: 2022-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -329,6 +329,7 @@ files:
329
329
  - db/migrate/20220331112719_add_ssh_user_to_job_invocation.rb
330
330
  - db/migrate/20220713095705_create_template_invocation_events.rb
331
331
  - db/migrate/20220822155946_add_time_to_pickup_to_job_invocation.rb
332
+ - db/migrate/20221129170145_redefine_template_invocation_events_index.rb
332
333
  - db/seeds.d/100-assign_features_with_templates.rb
333
334
  - db/seeds.d/20-permissions.rb
334
335
  - db/seeds.d/50-notification_blueprints.rb