opennebula 6.0.1 → 6.1.90.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,107 +14,118 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
-
18
17
  require 'opennebula/host'
19
18
  require 'opennebula/image'
20
19
  require 'opennebula/virtual_machine'
21
20
 
22
- module OpenNebula::WaitExtEvent
23
- def wait_event(ctx, event, timeout)
24
- subscriber = ctx.socket(ZMQ::SUB)
21
+ module OpenNebula
25
22
 
26
- # Create subscriber
27
- key = ''
28
- content = ''
23
+ # Module to wait OpenNebula objects events using ZMQ
24
+ module WaitExtEvent
29
25
 
30
- subscriber.setsockopt(ZMQ::RCVTIMEO, timeout * 1000)
31
- subscriber.setsockopt(ZMQ::SUBSCRIBE, event)
32
- subscriber.connect(@client.one_zmq)
26
+ def wait_event(ctx, event, timeout)
27
+ subscriber = ctx.socket(ZMQ::SUB)
33
28
 
34
- rc = subscriber.recv_string(key)
35
- rc = subscriber.recv_string(content) if rc != -1
29
+ # Create subscriber
30
+ key = ''
31
+ content = ''
36
32
 
37
- return if ZMQ::Util.errno == ZMQ::EAGAIN || rc == -1
33
+ subscriber.setsockopt(ZMQ::RCVTIMEO, timeout * 1000)
34
+ subscriber.setsockopt(ZMQ::SUBSCRIBE, event)
35
+ subscriber.connect(@client.one_zmq)
38
36
 
39
- content
40
- ensure
41
- subscriber.setsockopt(ZMQ::UNSUBSCRIBE, event)
42
- subscriber.close
43
- end
37
+ rc = subscriber.recv_string(key)
38
+ rc = subscriber.recv_string(content) if rc != -1
44
39
 
45
- def wait2(sstr1, sstr2, timeout = 60, cycles = -1)
46
- wfun = OpenNebula::WaitExt::WAIT[self.class]
47
-
48
- # Start with a timeout of 2 seconds, to wait until the first
49
- # info.
50
- #
51
- # The timeout is increased later, to avoid multiple info calls.
52
- c_timeout = 2
53
- recvs = 0
54
- in_state = false
55
-
56
- # Subscribe with timeout seconds
57
- #
58
- # Subscribe string:
59
- #
60
- # EVENT STATE element_name/state_str//self.ID
61
- #
62
- # - element_name: is the element name to find in the message
63
- # - self.ID: returns element ID to find in the message
64
- ctx = ZMQ::Context.new(1)
65
-
66
- until in_state || (cycles != -1 && recvs >= cycles)
67
- content = wait_event(ctx,
68
- wfun[:event].call(self, sstr1, sstr2),
69
- c_timeout)
70
-
71
- if content && !content.empty?
72
- in_state = wfun[:in_state_e].call(sstr1, sstr2, content)
73
-
74
- break if in_state
75
- end
40
+ return if ZMQ::Util.errno == ZMQ::EAGAIN || rc == -1
41
+
42
+ content
43
+ ensure
44
+ subscriber.setsockopt(ZMQ::UNSUBSCRIBE, event)
45
+ subscriber.close
46
+ end
47
+
48
+ def wait2(sstr1, sstr2, timeout = 60, cycles = -1)
49
+ wfun = OpenNebula::WaitExt::WAIT[self.class]
50
+
51
+ # Start with a timeout of 2 seconds, to wait until the first
52
+ # info.
53
+ #
54
+ # The timeout is increased later, to avoid multiple info calls.
55
+ c_timeout = 2
56
+ recvs = 0
57
+ in_state = false
58
+
59
+ # Subscribe with timeout seconds
60
+ #
61
+ # Subscribe string:
62
+ #
63
+ # EVENT STATE element_name/state_str//self.ID
64
+ #
65
+ # - element_name: is the element name to find in the message
66
+ # - self.ID: returns element ID to find in the message
67
+ ctx = ZMQ::Context.new(1)
68
+
69
+ until in_state || (cycles != -1 && recvs >= cycles)
70
+ content = wait_event(ctx,
71
+ wfun[:event].call(self, sstr1, sstr2),
72
+ c_timeout)
73
+
74
+ if content && !content.empty?
75
+ in_state = wfun[:in_state_e].call(sstr1, sstr2, content)
76
+
77
+ break if in_state
78
+ end
76
79
 
77
- c_timeout *= 10
78
- c_timeout = timeout if c_timeout > timeout
80
+ c_timeout *= 10
81
+ c_timeout = timeout if c_timeout > timeout
79
82
 
80
- rco = info
83
+ rco = info
81
84
 
82
- return false if OpenNebula.is_error?(rco)
85
+ return false if OpenNebula.is_error?(rco)
83
86
 
84
- in_state = wfun[:in_state].call(self, sstr1, sstr2)
87
+ in_state = wfun[:in_state].call(self, sstr1, sstr2)
85
88
 
86
- recvs += 1
89
+ recvs += 1
90
+ end
91
+
92
+ in_state
87
93
  end
88
94
 
89
- in_state
90
95
  end
91
96
 
92
97
  end
93
98
 
94
- module OpenNebula::WaitExtPolling
95
- def wait2(sstr1, sstr2, timeout = 60, cycles = -1)
96
- wfun = OpenNebula::WaitExt::WAIT[self.class]
99
+ module OpenNebula
100
+
101
+ # Module to wait OpenNebula objects events using polling
102
+ module WaitExtPolling
103
+
104
+ def wait2(sstr1, sstr2, timeout = 60, cycles = -1)
105
+ wfun = OpenNebula::WaitExt::WAIT[self.class]
106
+
107
+ stime = 5
108
+ recvs = 0
109
+ cycles = timeout / stime if cycles == -1
110
+ in_state = false
97
111
 
98
- stime = 5
99
- recvs = 0
100
- cycles = timeout / stime
101
- in_state = false
112
+ loop do
113
+ rco = info
102
114
 
103
- loop do
104
- rco = info
115
+ return false if OpenNebula.is_error?(rco)
105
116
 
106
- return false if OpenNebula.is_error?(rco)
117
+ in_state = wfun[:in_state].call(self, sstr1, sstr2)
107
118
 
108
- in_state = wfun[:in_state].call(self, sstr1, sstr2)
119
+ recvs += 1
109
120
 
110
- recvs += 1
121
+ break if in_state || recvs >= cycles
111
122
 
112
- break if in_state || recvs >= cycles
123
+ sleep stime
124
+ end
113
125
 
114
- sleep stime
126
+ in_state
115
127
  end
116
128
 
117
- in_state
118
129
  end
119
130
 
120
131
  end
@@ -124,6 +135,7 @@ end
124
135
  #
125
136
  # rubocop:disable Style/ClassAndModuleChildren
126
137
  module OpenNebula::WaitExt
138
+
127
139
  # Wait classes and the name published in ZMQ/STATE
128
140
  WAIT = {
129
141
  OpenNebula::Host => {
@@ -176,7 +188,7 @@ module OpenNebula::WaitExt
176
188
  },
177
189
 
178
190
  :in_state => lambda {|o, s1, s2|
179
- obj_s1 = Integer(o['STATE'])
191
+ obj_s1 = Integer(o['STATE'])
180
192
  inx_s1 = OpenNebula::VirtualMachine::VM_STATE.index(s1)
181
193
 
182
194
  obj_s2 = Integer(o['LCM_STATE'])
@@ -203,13 +215,15 @@ module OpenNebula::WaitExt
203
215
  wait?(obj)
204
216
 
205
217
  class << obj
206
- begin
207
- require 'ffi-rzmq'
208
218
 
209
- include OpenNebula::WaitExtEvent
210
- rescue LoadError
211
- include OpenNebula::WaitExtPolling
212
- end
219
+ begin
220
+ require 'ffi-rzmq'
221
+
222
+ include OpenNebula::WaitExtEvent
223
+ rescue LoadError
224
+ include OpenNebula::WaitExtPolling
225
+ end
226
+
213
227
  end
214
228
 
215
229
  super
@@ -31,7 +31,15 @@ module OpenNebula
31
31
  :delete => "zone.delete",
32
32
  :addserver => "zone.addserver",
33
33
  :delserver => "zone.delserver",
34
- :resetserver => "zone.resetserver"
34
+ :resetserver => "zone.resetserver",
35
+ :enable => "zone.enable"
36
+ }
37
+
38
+ ZONE_STATES=%w{ENABLED DISABLED}
39
+
40
+ SHORT_ZONE_STATES={
41
+ "ENABLED" => "on",
42
+ "DISABLED" => "off"
35
43
  }
36
44
 
37
45
  # Creates a Zone description with just its identifier
@@ -179,6 +187,37 @@ module OpenNebula
179
187
  return call(ZONE_METHODS[:resetserver], @pe_id, server_id)
180
188
  end
181
189
 
190
+ # Enable zone
191
+ #
192
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
193
+ # otherwise
194
+ def enable()
195
+ return call(ZONE_METHODS[:enable], @pe_id, true)
196
+ end
197
+
198
+ # Disable zone, only readonly commands can be executed in disabled
199
+ # state
200
+ #
201
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
202
+ # otherwise
203
+ def disable()
204
+ return call(ZONE_METHODS[:enable], @pe_id, false)
205
+ end
206
+
207
+ #######################################################################
208
+ # Helpers to get Zone information
209
+ #######################################################################
210
+
211
+ # Returns the state of the Zone (numeric value)
212
+ def state
213
+ self['STATE'].to_i
214
+ end
215
+
216
+ # Returns the state of the Zone (string value)
217
+ def state_str
218
+ ZONE_STATES[state]
219
+ end
220
+
182
221
  private
183
222
 
184
223
  # These methods adds elements to the given node of the zone
data/lib/opennebula.rb CHANGED
@@ -77,5 +77,5 @@ require 'opennebula/flow'
77
77
  module OpenNebula
78
78
 
79
79
  # OpenNebula version
80
- VERSION = '6.0.1'
80
+ VERSION = '6.1.90'
81
81
  end
@@ -45,16 +45,7 @@ module OpenNebula
45
45
 
46
46
  # This function is used to pass error message to the mad
47
47
  def self.error_message(message)
48
- STDERR.puts format_error_message(message)
49
- end
50
-
51
- #This function formats an error message for OpenNebula
52
- def self.format_error_message(message)
53
- error_str = "ERROR MESSAGE --8<------\n"
54
- error_str << message
55
- error_str << "\nERROR MESSAGE ------>8--"
56
-
57
- return error_str
48
+ STDERR.puts message
58
49
  end
59
50
 
60
51
  def self.is_disk?(arg)
@@ -36,14 +36,25 @@ end
36
36
 
37
37
  ENV['LANG'] = 'C'
38
38
 
39
+ # %%RUBYGEMS_SETUP_BEGIN%%
39
40
  if File.directory?(GEMS_LOCATION)
40
41
  real_gems_path = File.realpath(GEMS_LOCATION)
41
42
  if !defined?(Gem) || Gem.path != [real_gems_path]
42
43
  $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
43
- require 'rubygems'
44
- Gem.use_paths(real_gems_path)
44
+
45
+ # Suppress warnings from Rubygems
46
+ # https://github.com/OpenNebula/one/issues/5379
47
+ begin
48
+ verb = $VERBOSE
49
+ $VERBOSE = nil
50
+ require 'rubygems'
51
+ Gem.use_paths(real_gems_path)
52
+ ensure
53
+ $VERBOSE = verb
54
+ end
45
55
  end
46
56
  end
57
+ # %%RUBYGEMS_SETUP_END%%
47
58
 
48
59
  $LOAD_PATH << LIB_LOCATION + '/ruby/vendors/rbvmomi/lib'
49
60
  $LOAD_PATH << LIB_LOCATION + '/ruby'
@@ -122,19 +133,10 @@ end
122
133
  # Helper functions #
123
134
  # ---------------------------------------------------------------------------- #
124
135
 
125
- def error_message(message)
126
- error_str = "ERROR MESSAGE --8<------\n"
127
- error_str << message
128
- error_str << "\nERROR MESSAGE ------>8--"
129
-
130
- error_str
131
- end
132
-
133
136
  def check_valid(parameter, label)
134
137
  return unless parameter.nil? || parameter.empty?
135
138
 
136
- STDERR.puts error_message("The parameter '#{label}'\
137
- is required for this action.")
139
+ STDERR.puts "The parameter '#{label}' is required for this action."
138
140
  exit(-1)
139
141
  end
140
142
 
@@ -369,9 +369,11 @@ module VCenterDriver
369
369
  error_msg = "\nError: #{e.message}\n"
370
370
  error_msg << "#{e.backtrace}\n" \
371
371
  if VCenterDriver::CONFIG[:debug_information]
372
- STDOUT.puts error_msg
372
+ STDERR.puts error_msg
373
+ raise_error = true
373
374
  ensure
374
375
  vi_client.close_connection if vi_client
376
+ raise if raise_error
375
377
  end
376
378
  end
377
379
 
@@ -496,9 +498,9 @@ module VCenterDriver
496
498
  end
497
499
 
498
500
  #
499
- # Create and allocate a Opennebula Object.
501
+ # Create and allocate a OpenNebula Object.
500
502
  #
501
- # @param info [String] Info passed to opennebula Core.
503
+ # @param info [String] Info passed to OpenNebula Core.
502
504
  #
503
505
  # @return [&block] the allocated object through a block.
504
506
  #
@@ -33,14 +33,27 @@ module VCenterDriver
33
33
  end
34
34
  end
35
35
 
36
- if File.directory?(GEMS_LOCATION)
37
- real_gems_path = File.realpath(GEMS_LOCATION)
38
- if !defined?(Gem) || Gem.path != [real_gems_path]
39
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
36
+ # rubocop: disable all
37
+ # %%RUBYGEMS_SETUP_BEGIN%%
38
+ if File.directory?(GEMS_LOCATION)
39
+ real_gems_path = File.realpath(GEMS_LOCATION)
40
+ if !defined?(Gem) || Gem.path != [real_gems_path]
41
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
42
+
43
+ # Suppress warnings from Rubygems
44
+ # https://github.com/OpenNebula/one/issues/5379
45
+ begin
46
+ verb = $VERBOSE
47
+ $VERBOSE = nil
40
48
  require 'rubygems'
41
49
  Gem.use_paths(real_gems_path)
50
+ ensure
51
+ $VERBOSE = verb
42
52
  end
43
53
  end
54
+ end
55
+ # %%RUBYGEMS_SETUP_END%%
56
+ # rubocop: enable all
44
57
 
45
58
  $LOAD_PATH << RUBY_LIB_LOCATION
46
59
 
@@ -1041,7 +1054,8 @@ module VCenterDriver
1041
1054
  else
1042
1055
  if snapshots?
1043
1056
  error = 'Disk metadata not present and snapshots exist. ' \
1044
- 'OpenNebula cannot manage this VM.'
1057
+ 'Please remove imported VM with "onevm recover ' \
1058
+ '--delete-db".'
1045
1059
  raise error
1046
1060
  end
1047
1061
 
@@ -1076,14 +1090,22 @@ module VCenterDriver
1076
1090
  #
1077
1091
  # @return [Hash ("String" => self.Nic)] Model representation of nics
1078
1092
  def info_nics
1093
+ keep_mac_on_imported = false
1094
+ keep_mac_on_imported = CONFIG[:keep_mac_on_imported] \
1095
+ unless CONFIG[:keep_mac_on_imported].nil?
1096
+
1079
1097
  @nics = { :macs => {} }
1080
1098
 
1081
1099
  vc_nics = vcenter_nics_list
1082
1100
  one_nics = one_nics_get
1083
1101
 
1084
1102
  one_nics.each do |one_nic|
1085
- index = one_nic['NIC_ID']
1086
- mac = one_nic['MAC']
1103
+ index = one_nic['NIC_ID']
1104
+ if keep_mac_on_imported && one_nic['MAC_IMPORTED']
1105
+ mac = one_nic['MAC_IMPORTED']
1106
+ else
1107
+ mac = one_nic['MAC']
1108
+ end
1087
1109
  vc_dev = query_nic(mac, vc_nics)
1088
1110
 
1089
1111
  if vc_dev
@@ -2401,6 +2423,15 @@ module VCenterDriver
2401
2423
 
2402
2424
  # Attach DISK to VM (hotplug)
2403
2425
  def attach_disk(disk)
2426
+ # Adding a new disk in newer vSphere versions
2427
+ # automatically cleans all system snapshots
2428
+ # https://github.com/OpenNebula/one/issues/5409
2429
+ if snapshots? || one_snapshots?
2430
+ error_msg = 'Existing sytem snapshots, cannot change disks. '
2431
+ error_msg << 'Please remove all snapshots and try again.'
2432
+ raise error_message
2433
+ end
2434
+
2404
2435
  spec_hash = {}
2405
2436
  device_change = []
2406
2437
 
@@ -2582,6 +2613,12 @@ module VCenterDriver
2582
2613
  def detach_disk(disk)
2583
2614
  return unless disk.exists?
2584
2615
 
2616
+ if snapshots? || one_snapshots?
2617
+ error_message = 'Existing sytem snapshots, cannot change disks'
2618
+ error_message << '. Please remove all snapshots and try again.'
2619
+ raise error_message
2620
+ end
2621
+
2585
2622
  spec_hash = {}
2586
2623
  spec_hash[:extraConfig] = [disk.config(:delete)]
2587
2624
  spec_hash[:deviceChange] = [{
@@ -2611,15 +2648,15 @@ module VCenterDriver
2611
2648
  # - The disk is managed by OpenNebula
2612
2649
  detachable= !(one_vm['LCM_STATE'].to_i == 11 && !disk.managed?)
2613
2650
  detachable &&= disk.exists?
2614
-
2651
+
2615
2652
  return unless detachable
2616
2653
 
2617
2654
  detach_disk(disk)
2618
2655
 
2619
2656
  # Check if we want to keep the non persistent disk
2620
2657
  keep_non_persistent_disks =
2621
- VCenterDriver::CONFIG[:keep_non_persistent_disks]
2622
-
2658
+ VCenterDriver::CONFIG[:keep_non_persistent_disks]
2659
+
2623
2660
  return if keep_non_persistent_disks == true
2624
2661
 
2625
2662
  disk.destroy
@@ -2816,7 +2853,7 @@ module VCenterDriver
2816
2853
  # Convert VM to template in vCenter
2817
2854
  mark_as_template
2818
2855
 
2819
- # Edit the Opennebula template
2856
+ # Edit the OpenNebula template
2820
2857
  one_client = OpenNebula::Client.new
2821
2858
  template_id = one_item['TEMPLATE/TEMPLATE_ID']
2822
2859
  new_template = OpenNebula::Template.new_with_id(template_id,
@@ -2867,6 +2904,15 @@ module VCenterDriver
2867
2904
  self['rootSnapshot'] && !self['rootSnapshot'].empty?
2868
2905
  end
2869
2906
 
2907
+ def one_snapshots?
2908
+ begin
2909
+ !one_item['TEMPLATE/SNAPSHOT'].nil?
2910
+ rescue StandardError
2911
+ # one_item may not be retrieved if deploy_id hasn't been set
2912
+ false
2913
+ end
2914
+ end
2915
+
2870
2916
  def instantiated_as_persistent?
2871
2917
  begin
2872
2918
  !one_item['TEMPLATE/CLONING_TEMPLATE_ID'].nil?
@@ -3032,7 +3078,8 @@ module VCenterDriver
3032
3078
  # Create a snapshot for the VM
3033
3079
  def create_snapshot(snap_id, snap_name)
3034
3080
  memory_dumps = true
3035
- memory_dumps = CONFIG[:memory_dumps] unless CONFIG[:memory_dumps].nil?
3081
+ memory_dumps = CONFIG[:memory_dumps] \
3082
+ unless CONFIG[:memory_dumps].nil?
3036
3083
 
3037
3084
  snapshot_hash = {
3038
3085
  :name => snap_id,
data/lib/vm_monitor.rb CHANGED
@@ -175,8 +175,6 @@ module VirtualMachineMonitor
175
175
  @monitor[:diskwrbytes] = previous_diskwrbytes +
176
176
  (write_kbpersec * 1024 * refresh_rate).to_i
177
177
  end
178
- # rubocop:enable Naming/VariableName
179
- # rubocop:enable Style/FormatStringToken
180
178
 
181
179
  # Generates a OpenNebula IM Driver valid string with the monitor info
182
180
  def info
data/lib/vm_template.rb CHANGED
@@ -40,7 +40,7 @@ module VCenterDriver
40
40
  def lock
41
41
  return unless @locking
42
42
 
43
- @locking_file = File.open('/tmp/vcenter-importer-lock', 'w')
43
+ @locking_file = File.open('/var/tmp/vcenter-importer-lock', 'w')
44
44
  @locking_file.flock(File::LOCK_EX)
45
45
  end
46
46
 
@@ -50,9 +50,9 @@ module VCenterDriver
50
50
 
51
51
  @locking_file.close
52
52
 
53
- return unless File.exist?('/tmp/vcenter-importer-lock')
53
+ return unless File.exist?('/var/tmp/vcenter-importer-lock')
54
54
 
55
- File.delete('/tmp/vcenter-importer-lock')
55
+ File.delete('/var/tmp/vcenter-importer-lock')
56
56
  end
57
57
 
58
58
  def vm?
@@ -550,6 +550,10 @@ module VCenterDriver
550
550
  net.ipConfig.ipAddress.each do |ip_config|
551
551
  ip = IPAddr.new(ip_config.ipAddress)
552
552
 
553
+ if ip.ipv6? && get_ipv6_prefix(ip.to_s, 10) == 'fe80'
554
+ next
555
+ end
556
+
553
557
  if force
554
558
  ipv4 = ip.to_s if ip.ipv4?
555
559
  ipv6 = ip.to_s if ip.ipv6?
@@ -729,6 +733,9 @@ module VCenterDriver
729
733
  nic, true)
730
734
  network_found.info
731
735
 
736
+ if nic[:mac]
737
+ nic_tmp << "MAC_IMPORTED=\"#{nic[:mac]}\",\n"
738
+ end
732
739
  # This is the existing nic info
733
740
  if nic[:mac] && ipv4.empty? && ipv6.empty?
734
741
  nic_tmp << "MAC=\"#{nic[:mac]}\",\n"
@@ -1573,9 +1580,8 @@ module VCenterDriver
1573
1580
  str << "]\n"
1574
1581
 
1575
1582
  if annotation.nil? || annotation.empty?
1576
- str << 'DESCRIPTION = "vCenter Template \
1577
- imported by OpenNebula' \
1578
- " from Cluster #{ccr_name}\"\n"
1583
+ str << 'DESCRIPTION = "vCenter Template imported by OpenNebula'\
1584
+ " from Cluster #{ccr_name}\"\n"
1579
1585
  else
1580
1586
  notes = annotation.gsub('\\', '\\\\').gsub('"', '\\"')
1581
1587
  str << "DESCRIPTION = \"#{notes}\"\n"
data/lib/vmm_importer.rb CHANGED
@@ -54,6 +54,14 @@ module VCenterDriver
54
54
 
55
55
  vc_vm = VCenterDriver::VirtualMachine.new_without_id(@vi_client,
56
56
  vm_ref)
57
+
58
+ # Importing Wild VMs with snapshots is not supported
59
+ # https://github.com/OpenNebula/one/issues/1268
60
+ if vc_vm.snapshots? && vc_vm.disk_keys.empty?
61
+ raise 'Disk metadata not present and snapshots exist, '\
62
+ 'cannot import this VM'
63
+ end
64
+
57
65
  vname = vc_vm['name']
58
66
 
59
67
  type = { :object => 'VM', :id => vname }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opennebula
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.1
4
+ version: 6.1.90.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenNebula
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-28 00:00:00.000000000 Z
11
+ date: 2021-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -223,8 +223,8 @@ files:
223
223
  - lib/opennebula/xml_element.rb
224
224
  - lib/opennebula/xml_pool.rb
225
225
  - lib/opennebula/xml_utils.rb
226
- - lib/opennebula/zone_pool.rb
227
226
  - lib/opennebula/zone.rb
227
+ - lib/opennebula/zone_pool.rb
228
228
  - lib/opennebula/flow/grammar.rb
229
229
  - lib/opennebula/flow/service_pool.rb
230
230
  - lib/opennebula/flow/service_template.rb
@@ -255,9 +255,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
255
255
  version: '0'
256
256
  required_rubygems_version: !ruby/object:Gem::Requirement
257
257
  requirements:
258
- - - '>='
258
+ - - '>'
259
259
  - !ruby/object:Gem::Version
260
- version: '0'
260
+ version: 1.3.1
261
261
  requirements: []
262
262
  rubyforge_project:
263
263
  rubygems_version: 2.0.14.1