itchy 0.0.1 → 0.2.0

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: 2d5cddf33b94091a5668066bfd1c185ffd25e287
4
- data.tar.gz: 18c28ce3ee803506b115d361933df4b0ee76597a
3
+ metadata.gz: 33732680739a9df7269d7b6da2617791ad106fe8
4
+ data.tar.gz: b3ec978d0f1bd1dd036474cffe4fa91d0c90782f
5
5
  SHA512:
6
- metadata.gz: 12590cb87e2e4ee7332081a536f1d7b693147411727045cc32777fdf7027e5dfba70c390cbf300444b10068a0a967beb84eec98e94ede083f50138ed8c9c44c0
7
- data.tar.gz: 60e737dae10ad1a2b38aae0ada2dacc1a3b810070f172015eff4f7bc2723869d209845942a58c5871ddc87e7aea704b64da4ba505e7d718b3ed4f81ae4ef2267
6
+ metadata.gz: 8dcacca6d9448fbde79357291c2d58fa01f31ff00e9ac5745110ae8bd9bc62795838a9eb60b06c66bccffaa7f6acd22205c13e0abbc52681a27a13a8e24ba9f8
7
+ data.tar.gz: 95ff929be64811219debf0676cbf9fb39977c2d77a5b6f871bd831fa6b5b4be1da233d990c9a8d6b648abe2fd9a350b5f2162b371f5fed489306fe1f1548258b
data/bin/itchy CHANGED
@@ -31,6 +31,7 @@ class ItchyRunnable < Thor
31
31
 
32
32
  AVAILABLE_LOG_LEVELS = %w(debug info warn error fatal unknown).freeze
33
33
  AVAILABLE_AUTH_METHODS = %w(none basic).freeze
34
+ ERROR_EXIT_CODE = 1
34
35
 
35
36
  shared_option_log_to = [:log_to, { type: :string, default: Itchy::Settings.log_to,
36
37
  aliases: '-l', desc: 'Logging output, file path or stderr/stdout' }]
@@ -91,8 +92,12 @@ class ItchyRunnable < Thor
91
92
 
92
93
  Itchy::Log.info "[#{self.class.name}] Processing started"
93
94
  Itchy::Log.debug "[#{self.class.name}] With options: #{opts.inspect}"
95
+ begin
96
+ Itchy::EventProcesser.new(Itchy::VmcatcherConfiguration.new(ENV), opts).process!
97
+ rescue RuntimeError
98
+ exit ERROR_EXIT_CODE
99
+ end
94
100
 
95
- Itchy::EventProcesser.new(Itchy::VmcatcherConfiguration.new(ENV), opts).process!
96
101
  end
97
102
 
98
103
  private
@@ -137,6 +142,12 @@ class ItchyRunnable < Thor
137
142
  logger.level = opts.log_level
138
143
  logger
139
144
  end
145
+
146
+ # Overrides thors method for exiting
147
+ def exit_on_failure?
148
+ true
149
+ end
150
+
140
151
  end
141
152
 
142
153
  ItchyRunnable.start
data/config/itchy.yml CHANGED
@@ -3,7 +3,7 @@ defaults: &defaults
3
3
  metadata_dir: /var/spool/onevmcatcher
4
4
  template_dir:
5
5
  output_dir:
6
- descriptor_dir: /tmp/vmcatcher/descriptors
6
+ descriptor_dir: /vmcatcher/descriptors
7
7
  log_to: stderr
8
8
  log_level: error
9
9
  ca_path: /etc/grid-security/certificates
@@ -0,0 +1,4 @@
1
+ module Itchy::Errors
2
+ # Covers errors related to specific event handling.
3
+ class EventHandleError < Itchy::Errors::EventProcessingError; end
4
+ end
@@ -1,4 +1,4 @@
1
1
  module Itchy::Errors
2
2
  # Covers errors with shellout inspecting files and archives
3
- class FileInspectingError < Itchy::Errors::ImageTransformingErrors; end
3
+ class FileInspectError < Itchy::Errors::ImageTransformationError; end
4
4
  end
@@ -1,4 +1,4 @@
1
1
  module Itchy::Errors
2
2
  # Covers errors related to image format converting.
3
- class FormatConvertingError < Itchy::Errors::ImageTransformingError; end
3
+ class FormatConversionError < Itchy::Errors::ImageTransformationError; end
4
4
  end
@@ -1,4 +1,4 @@
1
1
  module Itchy::Errors
2
2
  # Covers errors during transforming images (converting. copying..)
3
- class ImageTransformingError < Itchy::Errors::EventProcessingError; end
3
+ class ImageTransformationError < Itchy::Errors::EventProcessingError; end
4
4
  end
@@ -1,4 +1,4 @@
1
1
  module Itchy::Errors
2
2
  #Covers errors with unpacking, copying, creating dirs.
3
- class WorkingWithFilesError < Itchy::Errors::ImageTransformingError; end
3
+ class PrepareEnvError < Itchy::Errors::ImageTransformationError; end
4
4
  end
data/lib/itchy/errors.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # Wrapper for all available errors.
2
2
  module Itchy::Errors; end
3
3
 
4
+ require File.join(File.dirname(__FILE__), 'errors', 'event_processing_error')
5
+ require File.join(File.dirname(__FILE__), 'errors', 'image_transformation_error')
4
6
  # Load all available errors
5
7
  Dir.glob(File.join(File.dirname(__FILE__), 'errors', '*.rb')) { |error_file| require error_file.chomp('.rb') }
@@ -9,9 +9,15 @@ module Itchy::EventHandlers
9
9
  super
10
10
  Itchy::Log.info "[#{self.class.name}] Handling updated image " \
11
11
  "for #{vmcatcher_event.dc_identifier.inspect}"
12
- save_descriptor(create_descriptor(vmcatcher_event), event_name)
13
- image_transformer_instance = Itchy::ImageTransformer.new(@options)
14
- image_transformer_instance.transform!(vmcatcher_event, vmcatcher_configuration)
12
+ begin
13
+ image_transformer_instance = Itchy::ImageTransformer.new(@options)
14
+ new_file_name = image_transformer_instance.transform!(vmcatcher_event, vmcatcher_configuration)
15
+ save_descriptor(create_descriptor(vmcatcher_event, new_file_name), event_name)
16
+ rescue Itchy::Errors::PrepareEnvError, ArgumentError, Itchy::Errors::ImageTransformationError => ex
17
+ Itchy::Log.error "[#{self.class.name}] Problem with handling event #{event_name}" \
18
+ "Event handling failed with #{ex.message}"
19
+ fail Itchy::Errors::EventHandleError, ex
20
+ end
15
21
  end
16
22
 
17
23
  private
@@ -20,12 +26,12 @@ module Itchy::EventHandlers
20
26
  #
21
27
  # @param metadata [Itchy::VmcatcherEvent] vmcatcher event to get metadata from
22
28
  # @return [String] json form of created descriptor
23
- def create_descriptor(metadata)
29
+ def create_descriptor(metadata, file_name)
24
30
  os = ::Cloud::Appliance::Descriptor::Os.new(distribution: metadata.sl_osversion,
25
31
  version: metadata.sl_osversion)
26
32
  disk = ::Cloud::Appliance::Descriptor::Disk.new(type: :os,
27
33
  format: @options.required_format,
28
- path: "#{@options.output_dir}/#{metadata.dc_identifier}")
34
+ path: "#{@options.output_dir}/#{file_name}")
29
35
 
30
36
  appliance = ::Cloud::Appliance::Descriptor::Appliance.new action: :registration
31
37
  appliance.title = metadata.dc_title
@@ -57,17 +57,18 @@ module Itchy::EventHandlers
57
57
  end
58
58
  end
59
59
 
60
- # Save created descriptor to descriptor directory. Every descriptor
61
- # is stored in its own directory.
60
+ # Save created descriptor to descriptor directory.
62
61
  #
63
62
  # @param descriptor [String] json form of appliance descriptor
64
63
  # @param name [String] name of appliance descriptor (event name)
65
64
  def save_descriptor(descriptor, name)
66
- name.slice! @options.metadata_dir
67
- dir_name = name
68
- dir_name.slice! '.json'
69
- ::FileUtils.mkdir_p "#{@options.descriptor_dir}/#{dir_name}"
70
- File.open("#{@options.descriptor_dir}#{dir_name}/#{name}.json", 'w') { |f| f.write(descriptor) }
65
+ begin
66
+ File.open("#{@options.descriptor_dir}/#{File.basename(name)}", 'w') { |f| f.write(descriptor) }
67
+ rescue SystemCallError => ex
68
+ Itchy::Log.fatal "[#{self.class.name}] Failed to save a descriptor #{File.basename(name)}. " \
69
+ "Attempt failed with error #{ex.message}"
70
+ fail Itchy::Errors::PrepareEnvError, ex
71
+ end
71
72
  end
72
73
 
73
74
  protected
@@ -9,7 +9,13 @@ module Itchy::EventHandlers
9
9
  super
10
10
  Itchy::Log.info "[#{self.class.name}] Handling expired image " \
11
11
  "for #{vmcatcher_event.dc_identifier.inspect}"
12
- save_descriptor(create_descriptor(vmcatcher_event), event_name)
12
+ begin
13
+ save_descriptor(create_descriptor(vmcatcher_event), event_name)
14
+ rescue Itchy::Errors::PrepareEnvError => ex
15
+ Itchy::Log.error "[#{self.cass.name}] Problem with handling event #{event_name}" \
16
+ "Event handling failed with #{ex.message}"
17
+ fail Itchy::Errors::EventHandleError, ex
18
+ end
13
19
  end
14
20
 
15
21
  private
@@ -23,20 +23,19 @@ module Itchy
23
23
 
24
24
  archived_events do |event, event_file|
25
25
  begin
26
-
27
26
  begin
28
27
  event_handler = Itchy::EventHandlers.const_get("#{event.type}EventHandler")
29
28
  event_handler = event_handler.new(vmc_configuration, options)
30
29
  event_handler.handle!(event, event_file)
31
- rescue => ex
32
- Itchy::Log.error "[#{self.class.name}] Due to error #{ex.message} event #{event_file}" \
33
- "was not processed!!! Continuing with next stored event."
34
- next
30
+ rescue Itchy::Errors::EventHandleError => ex
31
+ Itchy::Log.error "[#{self.class.name}] Due to error '#{ex.message}' event '#{event_file}'" \
32
+ " was not processed!!! Aborting."
33
+ fail RuntimeError, "Unprocessed event"
35
34
  end
36
35
 
37
36
  begin
38
37
  clean_event!(event, event_file)
39
- rescue => ex
38
+ rescue SystemCallError => ex
40
39
  Itchy::Log.error "[#{self.class.name}] Event #{event_file} was processed, but not cleaned!!!"
41
40
  end
42
41
 
@@ -72,7 +71,7 @@ module Itchy
72
71
  def read_event(json)
73
72
  Itchy::VmcatcherEvent.new(::File.read(json))
74
73
  rescue => ex
75
- Itchy::Log.error '[]Failed to load event!!!'
74
+ Itchy::Log.error 'Failed to load event!!!'
76
75
  return ex
77
76
  end
78
77
 
@@ -82,11 +81,12 @@ module Itchy
82
81
  # @param event_file [String] path to file containing event info
83
82
  def clean_event!(_event, event_file)
84
83
  Itchy::Log.info "[#{self.class.name}] Cleaning up"
84
+ Itchy::Log.debug "[#{self.class.name}] Deleting file #{event_file}"
85
85
 
86
86
  begin
87
87
  ::FileUtils.rm_f event_file
88
- rescue => ex
89
- Itchy::Log.fatal 'Failed to clean up event!!!'
88
+ rescue SystemCallError => ex
89
+ Itchy::Log.error 'Failed to clean up event!!!'
90
90
  return ex
91
91
  end
92
92
  end
@@ -28,7 +28,8 @@ module Itchy
28
28
  "original format: #{file_format} to " \
29
29
  "required format: #{required_format}."
30
30
 
31
- convert_cmd = Mixlib::ShellOut.new("qemu-img convert -f #{file_format} -O #{required_format} #{@unpacking_dir}/#{@metadata.dc_identifier} #{output_dir}/#{@metadata.dc_identifier}")
31
+ new_file_name = "#{::Time.now.to_i}_#{@metadata.dc_identifier}"
32
+ convert_cmd = Mixlib::ShellOut.new("qemu-img convert -f #{file_format} -O #{required_format} #{@unpacking_dir}/#{@metadata.dc_identifier} #{output_dir}/#{new_file_name}")
32
33
  convert_cmd.run_command
33
34
  begin
34
35
  convert_cmd.error!
@@ -36,8 +37,9 @@ module Itchy
36
37
  Mixlib::Shellout::InvalidCommandOption => ex
37
38
  Itchy::Log.fatal "[#{self.class.name}] Converting of image failed with " \
38
39
  "error messages #{convert_cmd.stderr}."
39
- fail Itchy::Errors::FormatConvertingError, ex
40
+ fail Itchy::Errors::FormatConversionError, ex
40
41
  end
42
+ new_file_name
41
43
  end
42
44
  end
43
45
  end
@@ -43,15 +43,16 @@ module Itchy
43
43
  unpacking_dir = copy_unpacked!(metadata, vmcatcher_configuration)
44
44
  end
45
45
  if file_format == @options.required_format
46
- copy_same_format(unpacking_dir, metadata)
46
+ new_file_name = copy_same_format(unpacking_dir, metadata)
47
47
  else
48
48
  converter = Itchy::FormatConverter.new(unpacking_dir, metadata, vmcatcher_configuration)
49
- converter.convert!(file_format, @options.required_format, @options.output_dir)
49
+ new_file_name = converter.convert!(file_format, @options.required_format, @options.output_dir)
50
50
  end
51
- rescue Itchy::Errors::FileInspectingError, Itchy::Errors::FormatConvertingError,
52
- Itchy::Errors::WorkingWithFilesError => ex
53
- fail Itchy::Errors::ImageTransformingError, ex
51
+ rescue Itchy::Errors::FileInspectError, Itchy::Errors::FormatConversionError,
52
+ Itchy::Errors::PrepareEnvError => ex
53
+ fail Itchy::Errors::ImageTransformationError, ex
54
54
  end
55
+ new_file_name
55
56
  end
56
57
 
57
58
  private
@@ -66,15 +67,16 @@ module Itchy
66
67
  image_format_tester.run_command
67
68
  begin
68
69
  image_format_tester.error!
69
- rescue => ex
70
+ rescue Mixlib::ShellOut::ShellCommandFailed, Mixlib::ShellOut::CommandTimeout,
71
+ Mixlib::ShellOut::InvalidCommandOption => ex
70
72
  Itchy::Log.error "[#{self.class.name}] Checking file format for" \
71
73
  "#{file} failed!"
72
- fail Itchy::Errors::FileInspectingError, ex
74
+ fail Itchy::Errors::FileInspectError, ex
73
75
  end
74
76
  file_format = image_format_tester.stdout.scan(FORMAT_PATTERN)[0].flatten.first
75
77
  unless KNOWN_IMAGE_FORMATS.include? file_format
76
78
  Itchy::Log.error "Image format #{file_format} is unknown and not supported!"
77
- fail Itchy::Errors::FileInspectingError
79
+ fail Itchy::Errors::FileInspectError
78
80
  end
79
81
  file_format
80
82
  end
@@ -96,9 +98,10 @@ module Itchy
96
98
  tar_cmd.run_command
97
99
  begin
98
100
  tar_cmd.error!
99
- rescue => ex
101
+ rescue Mixlib::ShellOut::ShellCommandFailed, Mixlib::ShellOut::CommandTimeout,
102
+ Mixlib::ShellOut::InvalidCommandOption => ex
100
103
  Itchy::Log.error "Unpacking of archive failed with #{tar_cmd.stderr}"
101
- fail Itchy::Errors::WorkingWithFilesError, ex
104
+ fail Itchy::Errors::PrepareEnvError, ex
102
105
  end
103
106
 
104
107
  unpacking_dir
@@ -121,7 +124,7 @@ module Itchy
121
124
  counter += 1
122
125
  # unsupported ova content (more than one disk)
123
126
  return nil if counter > 1
124
- File.new("#{directory}/#{file}", 'r').rename(file, "#{metadata.dc_identifier}.#{file_format}")
127
+ File.new("#{directory}/#{file}", 'r').rename(file, "#{metadata.dc_identifier}")
125
128
  end
126
129
  end
127
130
  return nil if counter == 0
@@ -129,25 +132,28 @@ module Itchy
129
132
  file_format
130
133
  end
131
134
 
132
- #
135
+ # Method moves image files to output directory
133
136
  #
134
137
  # @param directory [String] name of directory where image is saved
135
138
  # @param metadata [Itchy::VmcatcherEvent] event metadata
136
139
  def copy_same_format(directory, metadata)
137
140
  Itchy::Log.info "[#{self.class.name}] Image #{metadata.dc_identifier.inspect} " \
138
- 'is already in the required format. Copying it to output directory.'
141
+ 'is already in the required format. Moving it to output directory.'
139
142
 
143
+ new_file_name = "#{::Time.now.to_i}_#{metadata.dc_identifier}"
140
144
  begin
141
- ::FileUtils.ln_sf("#{directory}/#{metadata.dc_identifier}", @options.output_dir)
142
- rescue => ex
143
- Itchy::Log.fatal "[#{self.class.name}] Failed to create a link (copy) " \
145
+ ::FileUtils.mv("#{directory}/#{metadata.dc_identifier}",
146
+ "#{@options.output_dir}/#{new_file_name}")
147
+ rescue SystemCallError => ex
148
+ Itchy::Log.fatal "[#{self.class.name}] Failed to move a file " \
144
149
  "for #{metadata.dc_identifier.inspect}: " \
145
150
  "#{ex.message}"
146
- fail Itchy::Errors::WorkingWithFilesError, ex
151
+ fail Itchy::Errors::PrepareEnvError, ex
147
152
  end
153
+ new_file_name
148
154
  end
149
155
 
150
- #
156
+ # Method for copying image file from vmCatcher cache to processing places
151
157
  #
152
158
  # @param metadata [Itchy::VmcatcherEvent] event metadata
153
159
  # @param vmcatcher_configuration [Itchy::VmcatcherConfiguration] current VMC configuration
@@ -157,15 +163,15 @@ module Itchy
157
163
  "for #{metadata.dc_identifier.inspect}"
158
164
  unpacking_dir = prepare_image_temp_dir(metadata, vmcatcher_configuration).flatten.first
159
165
  begin
160
- ::FileUtils.ln_sf(
166
+ ::FileUtils.cp(
161
167
  orig_image_file(metadata, vmcatcher_configuration),
162
168
  unpacking_dir
163
169
  )
164
- rescue => ex
165
- Itchy::Log.fatal "[#{self.class.name}] Failed to create a link (copy) " \
170
+ rescue SystemCallError => ex
171
+ Itchy::Log.fatal "[#{self.class.name}] Failed to create a copy " \
166
172
  "for #{metadata.dc_identifier.inspect}: " \
167
173
  "#{ex.message}"
168
- fail Itchy::Errors::WorkingWithFilesError, ex
174
+ fail Itchy::Errors::PrepareEnvError, ex
169
175
  end
170
176
 
171
177
  unpacking_dir
@@ -190,11 +196,11 @@ module Itchy
190
196
 
191
197
  begin
192
198
  ::FileUtils.mkdir_p temp_dir
193
- rescue => ex
199
+ rescue SystemCallError => ex
194
200
  Itchy::Log.fatal "[#{self.class.name}] Failed to create a directory " \
195
201
  "for #{metadata.dc_identifier.inspect}: " \
196
202
  "#{ex.message}"
197
- fail Itchy::Errors::WorkingWithFilesError, ex
203
+ fail Itchy::Errors::PrepareEnvError, ex
198
204
  end
199
205
  end
200
206
 
@@ -207,10 +213,11 @@ module Itchy
207
213
  image_format_tester.run_command
208
214
  begin
209
215
  image_format_tester.error!
210
- rescue
216
+ rescue Mixlib::ShellOut::ShellCommandFailed, Mixlib::ShellOut::CommandTimeout,
217
+ Mixlib::ShellOut::InvalidCommandOption => ex
211
218
  Itchy::Log.error "[#{self.class.name}] Checking file format for" \
212
219
  "#{file} failed with #{image_format_tester.stderr}"
213
- fail Itchy::Errors::FileInspectingError, ex
220
+ fail Itchy::Errors::FileInspectError, ex
214
221
 
215
222
  end
216
223
  temp = image_format_tester.stdout
@@ -36,7 +36,7 @@ module Itchy
36
36
  begin
37
37
  event_handler = Itchy::EventHandlers.const_get("#{vmc_event.type}EventHandler")
38
38
  rescue NameError => ex
39
- raise Itchy::Errors::UnknownEventError,
39
+ fail Itchy::Errors::UnknownEventError,
40
40
  "Unknown event type #{vmc_event.type.inspect} detected: #{ex.message}"
41
41
  end
42
42
 
data/lib/itchy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itchy
2
- VERSION = '0.0.1' unless defined?(::Itchy::VERSION)
2
+ VERSION = '0.2.0' unless defined?(::Itchy::VERSION)
3
3
  end
@@ -51,7 +51,6 @@ module Itchy
51
51
  self.class.send :define_method, method_id do
52
52
  temp = VMCATCHER_ATTR_PREFIX + method_id.to_s.upcase
53
53
 
54
- Itchy::Log.debug "[#{method_id}] METHOD MISSING CALL "
55
54
  attributes[temp]
56
55
  end
57
56
  send(method_id)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itchy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lubomir Kosaristan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-25 00:00:00.000000000 Z
12
+ date: 2016-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: opennebula
@@ -312,14 +312,15 @@ files:
312
312
  - lib/itchy/errors.rb
313
313
  - lib/itchy/errors/abstract_env_error.rb
314
314
  - lib/itchy/errors/env_lookup_error.rb
315
+ - lib/itchy/errors/event_handle_error.rb
315
316
  - lib/itchy/errors/event_processing_error.rb
316
- - lib/itchy/errors/file_inspecting_error.rb
317
- - lib/itchy/errors/format_converting_error.rb
318
- - lib/itchy/errors/image_transforming_error.rb
317
+ - lib/itchy/errors/file_inspect_error.rb
318
+ - lib/itchy/errors/format_conversion_error.rb
319
+ - lib/itchy/errors/image_transformation_error.rb
319
320
  - lib/itchy/errors/not_found_error.rb
320
321
  - lib/itchy/errors/not_implemented_error.rb
322
+ - lib/itchy/errors/prepare_env_error.rb
321
323
  - lib/itchy/errors/unknown_event_error.rb
322
- - lib/itchy/errors/working_with_files_error.rb
323
324
  - lib/itchy/errors/wrong_state_error.rb
324
325
  - lib/itchy/event_handlers.rb
325
326
  - lib/itchy/event_handlers/available_postfix_event_handler.rb
@@ -372,7 +373,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
372
373
  version: '0'
373
374
  requirements: []
374
375
  rubyforge_project:
375
- rubygems_version: 2.2.2
376
+ rubygems_version: 2.4.6
376
377
  signing_key:
377
378
  specification_version: 4
378
379
  summary: Event handler for vmcatcher