foreman_opennebula 3.2.0 → 4.0.1

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: c48a6d24abe1e59d488b278f70f0d7531f943e75c526c4365c3055aa36977634
4
- data.tar.gz: 96d5d5e61d383a2af6e5fa221ac126346e69edf0f714f28aab18427c29c5e61b
3
+ metadata.gz: ffb18f309d9da945b2ff975b7f90e3457217de8fa3559c8fecc93d9803f1b0dc
4
+ data.tar.gz: 56ba4265b669eafe7c7ce0606b991aa283c9c0515009d821bf3fdf890d2d70de
5
5
  SHA512:
6
- metadata.gz: c069c85d6a9fed4f8d9f059845eed3a151eebf0675cae9ec96d8cd28a11aa4874d6f6d83df5f6d29ee45afa17b53734502dc39e0ec21a9985bc9ea95e3cd88bf
7
- data.tar.gz: d8bab1c6c864aeffb797c2904b81d033d1baa4e873232eb5c64d09edd7c39c0ce3521a1a52bf196faca6ae95a347cabf6046c97230c783e84029958e71e4bb1a
6
+ metadata.gz: 044d6b750d7c7715b342ab8266d5577cae10f667145d6a8392ab6cc62698b359bd2f615d8d7017916a17d4d9a718db85679f710fc5528e7fea9ba2979ac3bec0
7
+ data.tar.gz: eb4219d532c55ddaa6a1b2d24295da9ef1bb290b29cfdf61c071ea2018b05c85f0467911206669d847801c3d60e84a7f3ac9eafd68870d2ad43e163ef15002f0
data/README.md CHANGED
@@ -7,13 +7,15 @@ 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.
10
+ 1. Apply the database migrations.
11
11
  2. Create a compute resource.
12
- 3. For every Foreman subnet select a corresponding OpenNebula network.
12
+ 3. Select an OpenNebula network on the subnet configuration page.
13
+
14
+ To use the console, install the websockify Python module.
13
15
 
14
16
  ## Copyright
15
17
 
16
- Copyright (c) 2024 IVI.RU LLC
18
+ Copyright (c) 2025 IVI.RU LLC
17
19
 
18
20
  This program is free software: you can redistribute it and/or modify
19
21
  it under the terms of the GNU General Public License as published by
@@ -37,9 +37,9 @@ module ForemanOpennebula
37
37
  logger.info "removing key from compute resource #{name} "\
38
38
  "(#{provider_friendly_name}): #{remote_key_pair}"
39
39
  opennebula_user = available_users.detect { |u| u.name == user }
40
- template_hash = opennebula_user.to_hash['USER']['TEMPLATE']
41
- template_hash.delete('SSH_PUBLIC_KEY')
42
- template_str = template_hash.map { |k, v| "#{k}=\"#{v}\"" }.join("\n")
40
+ opennebula_user.delete_element('TEMPLATE/SSH_PRIVATE_KEY')
41
+ opennebula_user.delete_element('TEMPLATE/SSH_PUBLIC_KEY')
42
+ template_str = opennebula_user.template_str
43
43
  opennebula_user.update(template_str)
44
44
  KeyPair.destroy_by :compute_resource_id => id
45
45
  rescue => e
@@ -56,11 +56,13 @@ module ForemanOpennebula
56
56
  def setup_key_pair
57
57
  key = SSHKey.generate(comment: "foreman-#{id}#{Foreman.uuid}")
58
58
  opennebula_user = available_users.detect { |u| u.name == user }
59
- template_hash = opennebula_user.to_hash['USER']['TEMPLATE']
60
- template_hash['SSH_PUBLIC_KEY'] = key.ssh_public_key
61
- template_str = template_hash.map { |k, v| "#{k}=\"#{v}\"" }.join("\n")
59
+ opennebula_user.add_element('TEMPLATE',
60
+ 'SSH_PRIVATE_KEY' => key.private_key,
61
+ 'SSH_PUBLIC_KEY' => key.ssh_public_key)
62
+ template_str = opennebula_user.template_str
62
63
  opennebula_user.update(template_str)
63
- KeyPair.create! :name => key.comment, :compute_resource_id => id, :secret => key.private_key
64
+ KeyPair.create! :name => key.comment, :compute_resource_id => id,
65
+ :secret => key.private_key, :public => key.ssh_public_key
64
66
  rescue => e
65
67
  Foreman::Logging.exception('Failed to generate key pair', e)
66
68
  destroy_key_pair
@@ -13,13 +13,15 @@ module ForemanOpennebula
13
13
  Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
14
14
  end
15
15
 
16
- initializer 'foreman_opennebula.register_plugin', :before => :finisher_hook do |_app|
17
- Foreman::Plugin.register :foreman_opennebula do
18
- requires_foreman '>= 3.7'
19
- compute_resource ForemanOpennebula::Opennebula
20
- register_global_js_file 'global'
16
+ initializer 'foreman_opennebula.register_plugin', :before => :finisher_hook do |app|
17
+ app.reloader.to_prepare do
18
+ Foreman::Plugin.register :foreman_opennebula do
19
+ requires_foreman '>= 3.14.0'
20
+ compute_resource ForemanOpennebula::Opennebula
21
+ register_global_js_file 'global'
21
22
 
22
- parameter_filter Subnet, :opennebula_vnet
23
+ parameter_filter Subnet, :opennebula_vnet
24
+ end
23
25
  end
24
26
  end
25
27
 
@@ -1,3 +1,3 @@
1
1
  module ForemanOpennebula
2
- VERSION = '3.2.0'.freeze
2
+ VERSION = '4.0.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_opennebula
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitaly Pyslar
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 2025-09-09 00:00:00.000000000 Z
11
+ date: 2025-09-24 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: rake
@@ -55,44 +56,50 @@ dependencies:
55
56
  name: rubocop-minitest
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
- - - ">="
59
+ - - "~>"
59
60
  - !ruby/object:Gem::Version
60
- version: '0'
61
+ version: '0.38'
61
62
  type: :development
62
63
  prerelease: false
63
64
  version_requirements: !ruby/object:Gem::Requirement
64
65
  requirements:
65
- - - ">="
66
+ - - "~>"
66
67
  - !ruby/object:Gem::Version
67
- version: '0'
68
+ version: '0.38'
68
69
  - !ruby/object:Gem::Dependency
69
70
  name: rubocop-performance
70
71
  requirement: !ruby/object:Gem::Requirement
71
72
  requirements:
72
- - - ">="
73
+ - - "~>"
73
74
  - !ruby/object:Gem::Version
74
- version: '0'
75
+ version: '1.26'
75
76
  type: :development
76
77
  prerelease: false
77
78
  version_requirements: !ruby/object:Gem::Requirement
78
79
  requirements:
79
- - - ">="
80
+ - - "~>"
80
81
  - !ruby/object:Gem::Version
81
- version: '0'
82
+ version: '1.26'
82
83
  - !ruby/object:Gem::Dependency
83
84
  name: rubocop-rails
84
85
  requirement: !ruby/object:Gem::Requirement
85
86
  requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.33'
86
90
  - - ">="
87
91
  - !ruby/object:Gem::Version
88
- version: '0'
92
+ version: 2.33.3
89
93
  type: :development
90
94
  prerelease: false
91
95
  version_requirements: !ruby/object:Gem::Requirement
92
96
  requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.33'
93
100
  - - ">="
94
101
  - !ruby/object:Gem::Version
95
- version: '0'
102
+ version: 2.33.3
96
103
  - !ruby/object:Gem::Dependency
97
104
  name: fog-opennebula
98
105
  requirement: !ruby/object:Gem::Requirement
@@ -111,16 +118,16 @@ dependencies:
111
118
  name: deface
112
119
  requirement: !ruby/object:Gem::Requirement
113
120
  requirements:
114
- - - ">="
121
+ - - "~>"
115
122
  - !ruby/object:Gem::Version
116
- version: '0'
123
+ version: '1.9'
117
124
  type: :runtime
118
125
  prerelease: false
119
126
  version_requirements: !ruby/object:Gem::Requirement
120
127
  requirements:
121
- - - ">="
128
+ - - "~>"
122
129
  - !ruby/object:Gem::Version
123
- version: '0'
130
+ version: '1.9'
124
131
  description: Provision and manage OpenNebula VMs from Foreman
125
132
  email:
126
133
  - vpyslar@ivi.ru
@@ -135,13 +142,9 @@ files:
135
142
  - app/assets/javascripts/foreman_opennebula/vmgroup_selected.js
136
143
  - app/controllers/foreman_opennebula/hosts_controller.rb
137
144
  - app/helpers/concerns/foreman_opennebula/form_helper_extensions.rb
138
- - app/helpers/concerns/foreman_opennebula/hosts_helper_extensions.rb
139
145
  - app/models/concerns/fog_extensions/open_nebula/flavor.rb
140
146
  - app/models/concerns/fog_extensions/open_nebula/interface.rb
141
147
  - app/models/concerns/fog_extensions/open_nebula/server.rb
142
- - app/models/concerns/fog_extensions/opennebula/flavor.rb
143
- - app/models/concerns/fog_extensions/opennebula/interface.rb
144
- - app/models/concerns/fog_extensions/opennebula/server.rb
145
148
  - app/models/concerns/foreman_opennebula/key_pair_compute_resource.rb
146
149
  - app/models/foreman_opennebula/opennebula.rb
147
150
  - app/overrides/subnets/_fields/opennebula_fields.html.erb.deface
@@ -150,7 +153,6 @@ files:
150
153
  - app/views/compute_resources/show/_opennebula.html.erb
151
154
  - app/views/compute_resources_vms/form/opennebula/_base.html.erb
152
155
  - app/views/compute_resources_vms/form/opennebula/_custom_attribute.html.erb
153
- - app/views/compute_resources_vms/form/opennebula/_network.html.erb
154
156
  - app/views/compute_resources_vms/form/opennebula/_scheduler_hint_data.html.erb
155
157
  - app/views/compute_resources_vms/form/opennebula/_vmgroup_role.html.erb
156
158
  - app/views/compute_resources_vms/index/_opennebula.html.erb
@@ -180,6 +182,7 @@ licenses:
180
182
  - GPL-3.0
181
183
  metadata:
182
184
  is_foreman_plugin: 'true'
185
+ post_install_message:
183
186
  rdoc_options: []
184
187
  require_paths:
185
188
  - lib
@@ -194,7 +197,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
197
  - !ruby/object:Gem::Version
195
198
  version: '0'
196
199
  requirements: []
197
- rubygems_version: 3.6.3
200
+ rubygems_version: 3.4.20
201
+ signing_key:
198
202
  specification_version: 4
199
203
  summary: Foreman OpenNebula plugin
200
204
  test_files:
@@ -1,20 +0,0 @@
1
- module ForemanOpennebula
2
- module HostsHelperExtensions
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- def provider_partial_exist?(compute_resource, partial)
7
- return false unless compute_resource
8
-
9
- compute_resource_name = compute_resource.provider.downcase
10
-
11
- return false if controller_name == 'compute_attributes' &&
12
- compute_resource_name == 'opennebula' && partial == 'network'
13
-
14
- ActionController::Base.view_paths.any? do |path|
15
- File.exist?(File.join(path, 'compute_resources_vms', 'form', compute_resource_name, "_#{partial}.html.erb"))
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,109 +0,0 @@
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
- def to_s
14
- '' + get_cpu \
15
- + get_vcpu \
16
- + get_memory \
17
- + get_disk \
18
- + get_nic \
19
- + get_os \
20
- + get_graphics \
21
- + get_pci \
22
- + get_raw \
23
- + get_sched_requirements \
24
- + get_sched_ds_requirements \
25
- + get_sched_rank \
26
- + get_sched_ds_rank \
27
- + get_context \
28
- + get_user_variables \
29
- + get_cpu_model \
30
- + get_nic_default \
31
- + get_vmgroup \
32
- + get_template_id
33
- end
34
-
35
- def get_cpu_model
36
- return '' unless attributes[:cpu_model]
37
-
38
- ret = "CPU_MODEL=#{attributes[:cpu_model]}\n"
39
- ret.tr!('{', '[')
40
- ret.tr!('}', ']')
41
- ret.delete!('>')
42
- ret
43
- end
44
-
45
- def get_nic_default
46
- return '' unless attributes[:nic_default]
47
-
48
- ret = "NIC_DEFAULT=#{attributes[:nic_default]}\n"
49
- ret.tr!('{', '[')
50
- ret.tr!('}', ']')
51
- ret.delete!('>')
52
- ret
53
- end
54
-
55
- def get_vmgroup
56
- return '' unless attributes[:vmgroup]
57
-
58
- ret = "VMGROUP=#{attributes[:vmgroup]}\n"
59
- ret.tr!('{', '[')
60
- ret.tr!('}', ']')
61
- ret.delete!('>')
62
- ret
63
- end
64
-
65
- def get_template_id
66
- return '' unless attributes[:template_id]
67
-
68
- ret = "TEMPLATE_ID=#{attributes[:template_id]}\n"
69
- ret.tr!('{', '[')
70
- ret.tr!('}', ']')
71
- ret.delete!('>')
72
- ret
73
- end
74
-
75
- def get_nic
76
- return '' if nic.nil?
77
-
78
- ret = ''
79
- if nic.is_a? Array
80
- nic.each do |n|
81
- next if n.vnet.nil?
82
- val = [%(MODEL="#{n.model}"), %(NETWORK_ID="#{n.vnet.id}")]
83
- val << %(IP="#{n.ip}") if n.ip.present?
84
- ret += %(NIC=[#{val.join(',')}]\n)
85
- end
86
- end
87
- ret
88
- end
89
-
90
- def get_pci
91
- return '' unless attributes[:pci]
92
-
93
- ret = ''
94
- if attributes[:pci].is_a? Array
95
- attributes[:pci].each do |pci|
96
- ret += "PCI=#{pci}\n"
97
- end
98
- else
99
- ret = "PCI=#{attributes[:pci]}\n"
100
- end
101
- ret.tr!('{', '[')
102
- ret.tr!('}', ']')
103
- ret.delete!('>')
104
- ret
105
- end
106
- end
107
- end
108
- end
109
- end
@@ -1,11 +0,0 @@
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
@@ -1,135 +0,0 @@
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
@@ -1,2 +0,0 @@
1
- <%= select_f f, :vnet, compute_resource.available_networks, :id, :name, { :include_blank => true },
2
- { :label => _('Network'), :label_size => "col-md-3", :size => "col-md-8" } %>