foreman_opennebula 2.3.0 → 3.0.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
  SHA256:
3
- metadata.gz: 20707d6bbb40864fa2888689e0da98ed358ae564a69993c92573184e8c118ee8
4
- data.tar.gz: 2906546d3690e96fb8f16cfa78d6cd2b2fc3028040768f59c5c02f111afc8c76
3
+ metadata.gz: dda5882a295555eb9c4e145959787fee3af1c522681ac2ca1d7d85ae35ac4d14
4
+ data.tar.gz: 7f9a76c97effc394aed06300c501ddeaf09d7a706fab6f2e28d4a228cc9147b2
5
5
  SHA512:
6
- metadata.gz: 73357e8428988e16540a71085caf9c1d96ecbe117fb592dae130e598b7e2bce1b03eea83250f841b07ee16f28dbd4e1fe417dc0dd78f0026222608711a266547
7
- data.tar.gz: 13e5f25bbf9380e8e00e1ad4b665a51e860457c00d5de388a711b49ca317b3726b73c45b8b030b77fd022bf38808c0bd69ba08985a01c50985efaf2b7bf7b7e2
6
+ metadata.gz: 1f2011131086920a71f02a797d545e9d097cb3c05a042106015dd2bdc25b9bc5d4eb7a0300095bfbacf4cea459608e3126eec1dfdf21cc28d7dc908cc78ff582
7
+ data.tar.gz: 7916313a9f48a3c22753030a29e0a0eeb9047a8d124dd3d211a0ed2285cd2b5e01e49c5254bb2cf547883687e0df313eb310f31e69bba22f1b125c803df76189
data/README.md CHANGED
@@ -7,6 +7,10 @@ This plugin enables managing of OpenNebula as a Compute Resource in Foreman.
7
7
  See [How_to_Install_a_Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Plugin)
8
8
  for how to install Foreman plugins
9
9
 
10
+ 1. Apply the DB migrations.
11
+ 2. Create a compute resource.
12
+ 3. For every Foreman subnet select a corresponding OpenNebula network.
13
+
10
14
  ## Copyright
11
15
 
12
16
  Copyright (c) 2024 IVI.RU LLC
@@ -0,0 +1,111 @@
1
+ module FogExtensions
2
+ module OpenNebula
3
+ module Flavor
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ attribute :cpu_model
8
+ attribute :nic_default
9
+ attribute :pci
10
+ attribute :vmgroup
11
+ attribute :template_id
12
+
13
+ # rubocop:disable Style/StringConcatenation
14
+ def to_s
15
+ '' + get_cpu \
16
+ + get_vcpu \
17
+ + get_memory \
18
+ + get_disk \
19
+ + get_nic \
20
+ + get_os \
21
+ + get_graphics \
22
+ + get_pci \
23
+ + get_raw \
24
+ + get_sched_requirements \
25
+ + get_sched_ds_requirements \
26
+ + get_sched_rank \
27
+ + get_sched_ds_rank \
28
+ + get_context \
29
+ + get_user_variables \
30
+ + get_cpu_model \
31
+ + get_nic_default \
32
+ + get_vmgroup \
33
+ + get_template_id
34
+ end
35
+ # rubocop:enable Style/StringConcatenation
36
+
37
+ def get_cpu_model
38
+ return '' unless attributes[:cpu_model]
39
+
40
+ ret = "CPU_MODEL=#{attributes[:cpu_model]}\n"
41
+ ret.tr!('{', '[')
42
+ ret.tr!('}', ']')
43
+ ret.delete!('>')
44
+ ret
45
+ end
46
+
47
+ def get_nic_default
48
+ return '' unless attributes[:nic_default]
49
+
50
+ ret = "NIC_DEFAULT=#{attributes[:nic_default]}\n"
51
+ ret.tr!('{', '[')
52
+ ret.tr!('}', ']')
53
+ ret.delete!('>')
54
+ ret
55
+ end
56
+
57
+ def get_vmgroup
58
+ return '' unless attributes[:vmgroup]
59
+
60
+ ret = "VMGROUP=#{attributes[:vmgroup]}\n"
61
+ ret.tr!('{', '[')
62
+ ret.tr!('}', ']')
63
+ ret.delete!('>')
64
+ ret
65
+ end
66
+
67
+ def get_template_id
68
+ return '' unless attributes[:template_id]
69
+
70
+ ret = "TEMPLATE_ID=#{attributes[:template_id]}\n"
71
+ ret.tr!('{', '[')
72
+ ret.tr!('}', ']')
73
+ ret.delete!('>')
74
+ ret
75
+ end
76
+
77
+ def get_nic
78
+ return '' if nic.nil?
79
+
80
+ ret = ''
81
+ if nic.is_a? Array
82
+ nic.each do |n|
83
+ next if n.vnet.nil?
84
+ val = [%(MODEL="#{n.model}"), %(NETWORK_ID="#{n.vnet.id}")]
85
+ val << %(IP="#{n.ip}") if n.ip.present?
86
+ ret += %(NIC=[#{val.join(',')}]\n)
87
+ end
88
+ end
89
+ ret
90
+ end
91
+
92
+ def get_pci
93
+ return '' unless attributes[:pci]
94
+
95
+ ret = ''
96
+ if attributes[:pci].is_a? Array
97
+ attributes[:pci].each do |pci|
98
+ ret += "PCI=#{pci}\n"
99
+ end
100
+ else
101
+ ret = "PCI=#{attributes[:pci]}\n"
102
+ end
103
+ ret.tr!('{', '[')
104
+ ret.tr!('}', ']')
105
+ ret.delete!('>')
106
+ ret
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,11 @@
1
+ module FogExtensions
2
+ module OpenNebula
3
+ module Interface
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ attribute :ip
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,135 @@
1
+ module FogExtensions
2
+ module OpenNebula
3
+ module Server
4
+ extend ActiveSupport::Concern
5
+ include ActionView::Helpers::NumberHelper
6
+
7
+ attr_writer :template_id, :image_id, :disk_size, :vmgroup_id,
8
+ :vmgroup_role, :scheduler_hint_filter, :scheduler_hint_data
9
+
10
+ included do
11
+ def cpu
12
+ onevm_object.present? ? onevm_object['TEMPLATE/CPU'] : attributes[:cpu]
13
+ end
14
+
15
+ def vcpu
16
+ onevm_object.present? ? onevm_object['TEMPLATE/VCPU'] : attributes[:vcpu]
17
+ end
18
+
19
+ def start
20
+ onevm_object.resume
21
+ end
22
+
23
+ def stop
24
+ onevm_object.poweroff(true)
25
+ end
26
+ end
27
+
28
+ def reboot
29
+ onevm_object.reboot
30
+ true
31
+ end
32
+
33
+ def reset
34
+ onevm_object.reboot(true)
35
+ true
36
+ end
37
+
38
+ def template_id
39
+ onevm_object.present? ? onevm_object['TEMPLATE/TEMPLATE_ID'] : @template_id
40
+ end
41
+
42
+ def vmgroup_id
43
+ onevm_object.present? ? onevm_object['TEMPLATE/VMGROUP/VMGROUP_ID'] : @vmgroup_id
44
+ end
45
+
46
+ def vmgroup_role
47
+ onevm_object.present? ? onevm_object['TEMPLATE/VMGROUP/ROLE'] : @vmgroup_role
48
+ end
49
+
50
+ def sched_requirements
51
+ return unless onevm_object
52
+ onevm_object['USER_TEMPLATE/SCHED_REQUIREMENTS']
53
+ end
54
+
55
+ def scheduler_hint_filter
56
+ if sched_requirements
57
+ case sched_requirements
58
+ when /^CLUSTER_ID = \d+$/
59
+ 'Cluster'
60
+ when /^ID = \d+$/
61
+ 'Host'
62
+ else
63
+ 'Raw'
64
+ end
65
+ else
66
+ @scheduler_hint_filter
67
+ end
68
+ end
69
+
70
+ def scheduler_hint_data
71
+ if sched_requirements
72
+ scheduler_hint_filter == 'Raw' ? sched_requirements : sched_requirements[/\d+/]
73
+ else
74
+ @scheduler_hint_data
75
+ end
76
+ end
77
+
78
+ def disks
79
+ return if onevm_object.nil?
80
+ [onevm_object.to_hash['VM']['TEMPLATE']['DISK']].flatten.compact.map do |disk|
81
+ OpenStruct.new(disk.transform_keys(&:downcase))
82
+ end
83
+ end
84
+
85
+ def image_id
86
+ disks.try(:first).try(:image_id) || @image_id
87
+ end
88
+
89
+ def disk_size
90
+ disks.try(:first).try(:size) || @disk_size
91
+ end
92
+
93
+ def interfaces
94
+ [onevm_object.to_hash['VM']['TEMPLATE']['NIC']].flatten.compact.map do |nic|
95
+ OpenStruct.new(nic.transform_keys(&:downcase))
96
+ end
97
+ end
98
+
99
+ def select_nic(fog_nics, nic)
100
+ fog_nics.detect { |fn| fn.network_id == nic.compute_attributes['vnet'] }
101
+ end
102
+
103
+ def host
104
+ onevm_object['HISTORY_RECORDS/HISTORY[last()]/HOSTNAME']
105
+ end
106
+
107
+ def sched_message
108
+ onevm_object['USER_TEMPLATE/SCHED_MESSAGE']
109
+ end
110
+
111
+ def display
112
+ graphics = onevm_object.to_hash['VM']['TEMPLATE']['GRAPHICS']
113
+ graphics['TYPE'].downcase!
114
+ graphics.transform_keys(&:downcase).symbolize_keys
115
+ end
116
+
117
+ def poweroff?
118
+ (status == 8)
119
+ end
120
+
121
+ def to_s
122
+ name
123
+ end
124
+
125
+ def vm_description
126
+ _('%{cpu} CPU, %{vcpu} VCPU, %{memory} memory and %{disk} disk') % {
127
+ :cpu => cpu,
128
+ :vcpu => vcpu,
129
+ :memory => number_to_human_size(memory.to_i.megabytes),
130
+ :disk => number_to_human_size(disk_size.to_i.megabytes)
131
+ }
132
+ end
133
+ end
134
+ end
135
+ end
@@ -207,8 +207,19 @@ module ForemanOpennebula
207
207
  associate_by('mac', vm.interfaces.map(&:mac))
208
208
  end
209
209
 
210
+ def host_interfaces_attrs(host)
211
+ setup_nics_attrs(host)
212
+ super
213
+ end
214
+
210
215
  private
211
216
 
217
+ def setup_nics_attrs(host)
218
+ host.interfaces.each do |nic|
219
+ nic.compute_attributes['vnet'] = nic.subnet&.opennebula_vnet.to_s
220
+ end
221
+ end
222
+
212
223
  def client
213
224
  @client ||= Fog::Compute.new(
214
225
  provider: 'OpenNebula',
@@ -0,0 +1,4 @@
1
+ <!-- insert_after ':root:last-child' -->
2
+
3
+ <%= select_f f, :opennebula_vnet, ForemanOpennebula::Opennebula.first.available_networks, :id, :name, { include_blank: true },
4
+ :label => _("OpenNebula Virtual Network"), :help_inline => _("Reference at OpenNebula Virtual Network object") %>
@@ -0,0 +1,5 @@
1
+ class AddOpennebulaVnetToSubnets < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :subnets, :opennebula_vnet, :integer, null: true
4
+ end
5
+ end
@@ -18,6 +18,14 @@ module ForemanOpennebula
18
18
  requires_foreman '>= 3.7'
19
19
  compute_resource ForemanOpennebula::Opennebula
20
20
  register_global_js_file 'global'
21
+
22
+ parameter_filter Subnet, :opennebula_vnet
23
+ end
24
+ end
25
+
26
+ initializer 'foreman_opennebula.load_app_instance_data' do |app|
27
+ ForemanOpennebula::Engine.paths['db/migrate'].existent.each do |path|
28
+ app.config.paths['db/migrate'] << path
21
29
  end
22
30
  end
23
31
 
@@ -25,16 +33,14 @@ module ForemanOpennebula
25
33
  require 'fog/opennebula/models/compute/server'
26
34
  require 'fog/opennebula/models/compute/flavor'
27
35
  require 'fog/opennebula/models/compute/interface'
28
- require File.expand_path('../../app/models/concerns/fog_extensions/opennebula/server', __dir__)
29
- require File.expand_path('../../app/models/concerns/fog_extensions/opennebula/flavor', __dir__)
30
- require File.expand_path('../../app/models/concerns/fog_extensions/opennebula/interface', __dir__)
31
- require File.expand_path('../../app/helpers/concerns/foreman_opennebula/hosts_helper_extensions', __dir__)
36
+ require File.expand_path('../../app/models/concerns/fog_extensions/open_nebula/server', __dir__)
37
+ require File.expand_path('../../app/models/concerns/fog_extensions/open_nebula/flavor', __dir__)
38
+ require File.expand_path('../../app/models/concerns/fog_extensions/open_nebula/interface', __dir__)
32
39
  require File.expand_path('../../app/helpers/concerns/foreman_opennebula/form_helper_extensions', __dir__)
33
40
 
34
41
  ::Fog::Compute::OpenNebula::Server.include(FogExtensions::OpenNebula::Server)
35
42
  ::Fog::Compute::OpenNebula::Flavor.include(FogExtensions::OpenNebula::Flavor)
36
43
  ::Fog::Compute::OpenNebula::Interface.include(FogExtensions::OpenNebula::Interface)
37
- ::HostsHelper.include(ForemanOpennebula::HostsHelperExtensions)
38
44
  # ::FormHelper.include(ForemanOpennebula::FormHelperExtensions)
39
45
  ::ActionView::Base.include(ForemanOpennebula::FormHelperExtensions)
40
46
  rescue => e
@@ -1,3 +1,3 @@
1
1
  module ForemanOpennebula
2
- VERSION = '2.3.0'.freeze
2
+ VERSION = '3.0.0'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'foreman_opennebula/engine'
2
+ require 'deface'
2
3
 
3
4
  module ForemanOpennebula
4
5
  end
data/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "repository": {
14
14
  "type": "git",
15
- "url": "https://github.com/pyslarvt/foreman-opennebula.git"
15
+ "url": "https://github.com/theforeman/foreman_opennebula.git"
16
16
  },
17
17
  "author": {
18
18
  "name": "Vitaly Pyslar",
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_opennebula
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitaly Pyslar
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-08-12 00:00:00.000000000 Z
10
+ date: 2025-09-09 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rake
@@ -52,6 +51,48 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '1.36'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rubocop-minitest
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rubocop-performance
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop-rails
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
55
96
  - !ruby/object:Gem::Dependency
56
97
  name: fog-opennebula
57
98
  requirement: !ruby/object:Gem::Requirement
@@ -66,9 +107,23 @@ dependencies:
66
107
  - - "~>"
67
108
  - !ruby/object:Gem::Version
68
109
  version: '0.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: deface
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
69
124
  description: Provision and manage OpenNebula VMs from Foreman
70
125
  email:
71
- - ops@ivi.ru
126
+ - vpyslar@ivi.ru
72
127
  executables: []
73
128
  extensions: []
74
129
  extra_rdoc_files: []
@@ -81,11 +136,15 @@ files:
81
136
  - app/controllers/foreman_opennebula/hosts_controller.rb
82
137
  - app/helpers/concerns/foreman_opennebula/form_helper_extensions.rb
83
138
  - app/helpers/concerns/foreman_opennebula/hosts_helper_extensions.rb
139
+ - app/models/concerns/fog_extensions/open_nebula/flavor.rb
140
+ - app/models/concerns/fog_extensions/open_nebula/interface.rb
141
+ - app/models/concerns/fog_extensions/open_nebula/server.rb
84
142
  - app/models/concerns/fog_extensions/opennebula/flavor.rb
85
143
  - app/models/concerns/fog_extensions/opennebula/interface.rb
86
144
  - app/models/concerns/fog_extensions/opennebula/server.rb
87
145
  - app/models/concerns/foreman_opennebula/key_pair_compute_resource.rb
88
146
  - app/models/foreman_opennebula/opennebula.rb
147
+ - app/overrides/subnets/_fields/opennebula_fields.html.erb.deface
89
148
  - app/views/api/v2/compute_resources/opennebula.json.rabl
90
149
  - app/views/compute_resources/form/_opennebula.html.erb
91
150
  - app/views/compute_resources/show/_opennebula.html.erb
@@ -97,6 +156,7 @@ files:
97
156
  - app/views/compute_resources_vms/show/_opennebula.html.erb
98
157
  - app/views/images/form/_opennebula.html.erb
99
158
  - config/routes.rb
159
+ - db/migrate/20241120000000_add_opennebula_vnet_to_subnets.foreman_opennebula.rb
100
160
  - lib/foreman_opennebula.rb
101
161
  - lib/foreman_opennebula/engine.rb
102
162
  - lib/foreman_opennebula/version.rb
@@ -119,7 +179,6 @@ licenses:
119
179
  - GPL-3.0
120
180
  metadata:
121
181
  is_foreman_plugin: 'true'
122
- post_install_message:
123
182
  rdoc_options: []
124
183
  require_paths:
125
184
  - lib
@@ -134,12 +193,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
193
  - !ruby/object:Gem::Version
135
194
  version: '0'
136
195
  requirements: []
137
- rubyforge_project:
138
- rubygems_version: 2.7.6.3
139
- signing_key:
196
+ rubygems_version: 3.6.3
140
197
  specification_version: 4
141
198
  summary: Foreman OpenNebula plugin
142
199
  test_files:
200
+ - test/factories/foreman_opennebula_factories.rb
143
201
  - test/test_plugin_helper.rb
144
202
  - test/unit/foreman_opennebula_test.rb
145
- - test/factories/foreman_opennebula_factories.rb