foreman_fog_proxmox 0.7.0 → 0.8.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.
Potentially problematic release.
This version of foreman_fog_proxmox might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +5 -4
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +12 -5
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +33 -14
- data/app/helpers/proxmox_container_helper.rb +32 -38
- data/app/helpers/proxmox_server_helper.rb +34 -39
- data/app/helpers/proxmox_vm_helper.rb +1 -20
- data/app/models/concerns/fog_extensions/proxmox/interface.rb +29 -0
- data/app/models/concerns/fog_extensions/proxmox/node.rb +13 -0
- data/app/models/concerns/fog_extensions/proxmox/server.rb +4 -1
- data/app/models/concerns/host_ext/proxmox/interfaces.rb +37 -0
- data/app/models/concerns/orchestration/proxmox/compute.rb +38 -0
- data/app/models/foreman_fog_proxmox/proxmox.rb +71 -36
- data/app/overrides/compute_resources_vms/form/remove_new_vm_from_removable_layout.rb +24 -0
- data/app/views/compute_resources/form/_proxmox.html.erb +1 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +3 -6
- data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +22 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +6 -5
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +3 -3
- data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/server/_volume.html.erb +5 -4
- data/app/views/compute_resources_vms/show/_proxmox.html.erb +1 -1
- data/lib/foreman_fog_proxmox/engine.rb +4 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +28 -29
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +28 -27
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +0 -25
- data/test/unit/foreman_fog_proxmox/proxmox_test.rb +215 -5
- data/test/unit/foreman_fog_proxmox/proxmox_test_helpers.rb +10 -2
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 481cace7d30a49fb40a61fe50041ff10a278d674fd0420eca29c6bb756dfff9d
|
4
|
+
data.tar.gz: ff60cb1dd7b8793c19146431ed0c41b7f15a9e7a2379474f7b6ef80f6c8ee213
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6eb265bcc6d768b55d10df5987bd3fa003960f7adbb54072d54edb46a84e5f5bb51b16565665f497ef2848ae996a80f58132ebe8c2be8370ce044cb945a9ff6
|
7
|
+
data.tar.gz: ccc4f415b32b1ef39a628a2d30048464612c35707c5be757248e0e69dddf2c314f5dbbf066c0f219506a164e61610935af7794f76bdf26864f4897e42b7ac139
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
It is intended to satisfy this [feature](http://projects.theforeman.org/issues/2186).
|
12
12
|
|
13
|
-
If you like it and need more features you can [support](SUPPORT.md) it.
|
13
|
+
If you like it and need more features you can [support](.github/SUPPORT.md) it.
|
14
14
|
|
15
15
|
## Compatibility versions
|
16
16
|
|
@@ -18,7 +18,7 @@ If you like it and need more features you can [support](SUPPORT.md) it.
|
|
18
18
|
|--|--|--|--|--|
|
19
19
|
|<0.6|<5.3|<0.6|<=1.20|>=2.3|
|
20
20
|
|=0.6|=5.3|=0.6|=1.21|>=2.3|
|
21
|
-
|
21
|
+
|>=0.7|=5.4|>=0.7|>=1.22|>=2.3|
|
22
22
|
|
23
23
|
## Installation
|
24
24
|
|
@@ -142,6 +142,7 @@ cp config/settings.yaml.test config/settings.yaml
|
|
142
142
|
```shell
|
143
143
|
cp config/model.mappings.example config/model.mappings
|
144
144
|
cp config/database.yml.example config/database.yml
|
145
|
+
cp config/ignored_environments.yml.sample config/ignored_environments.yml
|
145
146
|
bundle exec bin/rake db:migrate
|
146
147
|
bundle exec bin/rake db:seed
|
147
148
|
```
|
@@ -202,10 +203,10 @@ See details in [foreman plugin development](https://projects.theforeman.org/proj
|
|
202
203
|
|
203
204
|
## Contributing
|
204
205
|
|
205
|
-
You can reach the [contributors](CONTRIBUTORS.md).
|
206
|
+
You can reach the [contributors](.github/CONTRIBUTORS.md).
|
206
207
|
Bug reports and pull requests are welcome on GitHub at [ForemanFogProxmox](https://github.com/theforeman/foreman_fog_proxmox).
|
207
208
|
|
208
|
-
Please read more information about [how to contribute](CONTRIBUTING.md).
|
209
|
+
Please read more information about [how to contribute](.github/CONTRIBUTING.md).
|
209
210
|
|
210
211
|
## License
|
211
212
|
|
@@ -15,12 +15,19 @@
|
|
15
15
|
// You should have received a copy of the GNU General Public License
|
16
16
|
// along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
$(document).on('ContentLoad', tfm.numFields.initAll);
|
19
|
+
$(document).ready(sslVerifyPeerSelected);
|
20
|
+
|
21
|
+
function sslVerifyPeerSelected(){
|
22
|
+
var selected = $("#compute_resource_ssl_verify_peer").is(':checked');
|
23
|
+
var ssl_certs_block = $('#compute_resource_ssl_certs').parents('.clearfix');
|
24
|
+
var ssl_certs_textarea = $('#compute_resource_ssl_certs');
|
21
25
|
if (selected) {
|
22
|
-
|
26
|
+
ssl_certs_block.show();
|
27
|
+
ssl_certs_textarea.show();
|
23
28
|
} else {
|
24
|
-
|
29
|
+
ssl_certs_block.hide();
|
30
|
+
ssl_certs_textarea.text('');
|
31
|
+
ssl_certs_textarea.hide();
|
25
32
|
}
|
26
33
|
}
|
@@ -79,36 +79,55 @@ function storageIsoSelected(item) {
|
|
79
79
|
}
|
80
80
|
}
|
81
81
|
|
82
|
+
function attributesPrefixSelector(profile, type) {
|
83
|
+
return profile ? '#compute_attribute_vm_attrs_' + type + '_attributes_': '#host_compute_attributes_' + type + '_attributes_';
|
84
|
+
}
|
85
|
+
|
86
|
+
function volumesAttributesSelector(profile,index,selector) {
|
87
|
+
return attributesPrefixSelector(profile,'volumes') + index + '_' + selector;
|
88
|
+
}
|
89
|
+
|
90
|
+
function getIndex(item) {
|
91
|
+
var id = $(item).attr('id');
|
92
|
+
var pattern = /(host_compute_attributes_volumes_attributes_||compute_attribute_vm_attrs_volumes_attributes_)(\d+)[_](.*)/i;
|
93
|
+
pattern_a = pattern.exec(id);
|
94
|
+
var index = pattern_a[2];
|
95
|
+
console.log("index=" + index);
|
96
|
+
return index;
|
97
|
+
}
|
98
|
+
|
99
|
+
function isProfile() {
|
100
|
+
return $(volumesAttributesSelector(true,0,'id')) !== undefined;
|
101
|
+
}
|
102
|
+
|
82
103
|
function controllerSelected(item) {
|
83
104
|
var controller = $(item).val();
|
84
105
|
var index = getIndex(item);
|
85
106
|
var max = computeControllerMaxDevice(controller);
|
86
|
-
var
|
107
|
+
var profile = isProfile();
|
108
|
+
console.log("profile="+profile);
|
109
|
+
var device_selector = volumesAttributesSelector(profile,index,'device');
|
110
|
+
var id_selector = volumesAttributesSelector(profile,index,'id');
|
87
111
|
$(device_selector).attr('data-soft-max', max);
|
88
112
|
var device = $(device_selector).limitedSpinner('value');
|
89
|
-
|
113
|
+
var id = controller + device;
|
114
|
+
$(id_selector).val(id);
|
90
115
|
tfm.numFields.initAll();
|
91
116
|
}
|
92
117
|
|
93
118
|
function deviceSelected(item) {
|
94
119
|
var device = $(item).limitedSpinner('value');
|
95
|
-
console.log("device=" + device);
|
96
120
|
var index = getIndex(item);
|
97
|
-
var
|
121
|
+
var profile = isProfile();
|
122
|
+
console.log("profile="+profile);
|
123
|
+
var controller_selector = volumesAttributesSelector(profile,index,'controller');
|
124
|
+
var id_selector = volumesAttributesSelector(profile,index,'id');
|
98
125
|
var controller = $(controller_selector).val();
|
99
|
-
|
126
|
+
var id = controller + device;
|
127
|
+
$(id_selector).val(id);
|
100
128
|
tfm.numFields.initAll();
|
101
129
|
}
|
102
130
|
|
103
|
-
function getIndex(item) {
|
104
|
-
var id = $(item).attr('id');
|
105
|
-
var pattern = /(host_compute_attributes_volumes_attributes_)(\d+)[_](.*)/i;
|
106
|
-
pattern_a = pattern.exec(id);
|
107
|
-
var index = pattern_a[2];
|
108
|
-
console.log("index=" + index);
|
109
|
-
return index;
|
110
|
-
}
|
111
|
-
|
112
131
|
function computeControllerMaxDevice(controller) {
|
113
132
|
switch (controller) {
|
114
133
|
case 'ide':
|
@@ -45,7 +45,7 @@ module ProxmoxContainerHelper
|
|
45
45
|
memory_a = %w[memory swap]
|
46
46
|
memory = parse_container_memory(config.select { |key,_value| memory_a.include? key })
|
47
47
|
interfaces_attributes = args['interfaces_attributes']
|
48
|
-
|
48
|
+
interfaces_to_add, interfaces_to_delete = parse_container_interfaces(interfaces_attributes)
|
49
49
|
general_a = %w[node_id name type config_attributes volumes_attributes interfaces_attributes firmware_type provision_method container_volumes server_volumes]
|
50
50
|
logger.debug("general_a: #{general_a}")
|
51
51
|
parsed_vm = args.reject { |key,value| general_a.include?(key) || ostemplate_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
@@ -57,7 +57,8 @@ module ProxmoxContainerHelper
|
|
57
57
|
parsed_config = config.reject { |key,value| config_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
58
58
|
logger.debug("parse_container_config(): #{parsed_config}")
|
59
59
|
parsed_vm = parsed_vm.merge(parsed_config).merge(cpu).merge(memory).merge(ostemplate)
|
60
|
-
|
60
|
+
interfaces_to_add.each { |interface| parsed_vm = parsed_vm.merge(interface) }
|
61
|
+
parsed_vm = parsed_vm.merge(delete: interfaces_to_delete.join(',')) unless interfaces_to_delete.empty?
|
61
62
|
volumes.each { |volume| parsed_vm = parsed_vm.merge(volume) }
|
62
63
|
logger.debug("parse_container_vm(): #{parsed_vm}")
|
63
64
|
parsed_vm
|
@@ -98,24 +99,17 @@ module ProxmoxContainerHelper
|
|
98
99
|
disk = {}
|
99
100
|
id = args['id']
|
100
101
|
id = "mp#{args['device']}" if args.has_key?('device')
|
101
|
-
delete = args['_delete'].to_i == 1
|
102
102
|
logger.debug("parse_container_volume() args=#{args}")
|
103
|
-
return args if ForemanFogProxmox::Value.empty?(id) || server_disk?(id)
|
103
|
+
return args if ForemanFogProxmox::Value.empty?(id) || Fog::Proxmox::DiskHelper.server_disk?(id)
|
104
104
|
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
disk.store(:size, args['size'].to_i)
|
114
|
-
options = args.reject { |key,_value| %w[id volid device storage size _delete].include? key}
|
115
|
-
disk.store(:options, options)
|
116
|
-
logger.debug("parse_container_volume(): add disk=#{disk}")
|
117
|
-
Fog::Proxmox::DiskHelper.flatten(disk)
|
118
|
-
end
|
105
|
+
disk.store(:id, id)
|
106
|
+
disk.store(:volid, args['volid'])
|
107
|
+
disk.store(:storage, args['storage'].to_s)
|
108
|
+
disk.store(:size, args['size'].to_i)
|
109
|
+
options = args.reject { |key,_value| %w[id volid device storage size _delete].include? key}
|
110
|
+
disk.store(:options, options)
|
111
|
+
logger.debug("parse_container_volume(): disk=#{disk}")
|
112
|
+
Fog::Proxmox::DiskHelper.flatten(disk)
|
119
113
|
end
|
120
114
|
|
121
115
|
def parse_container_volumes(args)
|
@@ -126,34 +120,34 @@ module ProxmoxContainerHelper
|
|
126
120
|
volumes
|
127
121
|
end
|
128
122
|
|
129
|
-
def parse_container_interfaces(
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
123
|
+
def parse_container_interfaces(interfaces_attributes)
|
124
|
+
interfaces_to_add = []
|
125
|
+
interfaces_to_delete = []
|
126
|
+
interfaces_attributes.each_value { |value| add_container_interface(value,interfaces_to_delete,interfaces_to_add) } if interfaces_attributes
|
127
|
+
logger.debug("parse_container_interfaces(): interfaces_to_add=#{interfaces_to_add}, interfaces_to_delete=#{interfaces_to_delete}")
|
128
|
+
[interfaces_to_add, interfaces_to_delete]
|
134
129
|
end
|
135
130
|
|
136
|
-
def
|
137
|
-
|
131
|
+
def add_container_interface(interface_attributes, interfaces_to_delete, interfaces_to_add)
|
132
|
+
interface_attributes.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
138
133
|
nic = {}
|
139
|
-
id =
|
134
|
+
id = interface_attributes['id']
|
140
135
|
logger.debug("parse_container_interface(): id=#{id}")
|
141
|
-
delete =
|
136
|
+
delete = interface_attributes['_delete'].to_i == 1
|
142
137
|
if delete
|
143
|
-
|
144
|
-
nic.store(:delete, id)
|
145
|
-
nic
|
138
|
+
interfaces_to_delete.push(id.to_s)
|
146
139
|
else
|
147
140
|
nic.store(:id, id)
|
148
|
-
nic.store(:
|
149
|
-
nic.store(:
|
150
|
-
nic.store(:
|
151
|
-
nic.store(:
|
152
|
-
nic.store(:
|
153
|
-
nic.store(:
|
141
|
+
nic.store(:macaddr, interface_attributes['macaddr']) if interface_attributes['macaddr']
|
142
|
+
nic.store(:name, interface_attributes['name'].to_s)
|
143
|
+
nic.store(:bridge, interface_attributes['bridge'].to_s) if interface_attributes['bridge']
|
144
|
+
nic.store(:ip, interface_attributes['ip'].to_s) if interface_attributes['ip']
|
145
|
+
nic.store(:ip6, interface_attributes['ip6'].to_s) if interface_attributes['ip6']
|
146
|
+
nic.store(:rate, interface_attributes['rate'].to_i) if interface_attributes['rate']
|
147
|
+
nic.store(:tag, interface_attributes['tag'].to_i) if interface_attributes['tag']
|
154
148
|
logger.debug("parse_container_interface(): add nic=#{nic}")
|
155
|
-
Fog::Proxmox::NicHelper.flatten(nic)
|
156
|
-
end
|
149
|
+
interfaces_to_add.push(Fog::Proxmox::NicHelper.flatten(nic))
|
150
|
+
end
|
157
151
|
end
|
158
152
|
|
159
153
|
end
|
@@ -45,7 +45,7 @@ module ProxmoxServerHelper
|
|
45
45
|
memory_a = %w[memory min_memory balloon shares]
|
46
46
|
memory = parse_server_memory(config.select { |key,_value| memory_a.include? key })
|
47
47
|
interfaces_attributes = args['interfaces_attributes']
|
48
|
-
|
48
|
+
interfaces_to_add, interfaces_to_delete = parse_server_interfaces(interfaces_attributes)
|
49
49
|
general_a = %w[node_id type config_attributes volumes_attributes interfaces_attributes firmware_type provision_method container_volumes server_volumes]
|
50
50
|
logger.debug("general_a: #{general_a}")
|
51
51
|
parsed_vm = args.reject { |key,value| general_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
@@ -57,7 +57,8 @@ module ProxmoxServerHelper
|
|
57
57
|
parsed_config = config.reject { |key,value| config_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
58
58
|
logger.debug("parse_server_config(): #{parsed_config}")
|
59
59
|
parsed_vm = parsed_vm.merge(parsed_config).merge(cpu).merge(memory).merge(cdrom)
|
60
|
-
|
60
|
+
interfaces_to_add.each { |interface| parsed_vm = parsed_vm.merge(interface) }
|
61
|
+
parsed_vm = parsed_vm.merge(delete: interfaces_to_delete.join(',')) unless interfaces_to_delete.empty?
|
61
62
|
volumes.each { |volume| parsed_vm = parsed_vm.merge(volume) }
|
62
63
|
logger.debug("parse_server_vm(): #{parsed_vm}")
|
63
64
|
parsed_vm
|
@@ -108,20 +109,14 @@ module ProxmoxServerHelper
|
|
108
109
|
return args if ForemanFogProxmox::Value.empty?(id) || id == 'rootfs'
|
109
110
|
delete = args['_delete'].to_i == 1
|
110
111
|
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
disk.store(:size, args['size'].to_i) if args.has_key?('size')
|
120
|
-
options = args.reject { |key,_value| %w[id volid controller device storage size _delete].include? key}
|
121
|
-
disk.store(:options, options)
|
122
|
-
logger.debug("parse_server_volume(): add disk=#{disk}")
|
123
|
-
Fog::Proxmox::DiskHelper.flatten(disk)
|
124
|
-
end
|
112
|
+
disk.store(:id, id)
|
113
|
+
disk.store(:volid, args['volid']) if args.has_key?('volid')
|
114
|
+
disk.store(:storage, args['storage'].to_s) if args.has_key?('storage')
|
115
|
+
disk.store(:size, args['size'].to_i) if args.has_key?('size')
|
116
|
+
options = args.reject { |key,_value| %w[id volid controller device storage size _delete].include? key}
|
117
|
+
disk.store(:options, options)
|
118
|
+
logger.debug("parse_server_volume(): disk=#{disk}")
|
119
|
+
Fog::Proxmox::DiskHelper.flatten(disk)
|
125
120
|
end
|
126
121
|
|
127
122
|
def parse_server_volumes(args)
|
@@ -131,35 +126,35 @@ module ProxmoxServerHelper
|
|
131
126
|
volumes
|
132
127
|
end
|
133
128
|
|
134
|
-
def parse_server_interfaces(
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
129
|
+
def parse_server_interfaces(interfaces_attributes)
|
130
|
+
interfaces_to_add = []
|
131
|
+
interfaces_to_delete = []
|
132
|
+
interfaces_attributes.each_value { |value| add_server_interface(value,interfaces_to_delete,interfaces_to_add)} if interfaces_attributes
|
133
|
+
logger.debug("parse_server_interfaces(): interfaces_to_delete=#{interfaces_to_delete} interfaces_to_add=#{interfaces_to_add}")
|
134
|
+
[interfaces_to_add, interfaces_to_delete]
|
139
135
|
end
|
140
136
|
|
141
|
-
def
|
142
|
-
|
137
|
+
def add_server_interface(interface_attributes, interfaces_to_delete, interfaces_to_add)
|
138
|
+
interface_attributes.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
143
139
|
nic = {}
|
144
|
-
id =
|
145
|
-
logger.debug("
|
146
|
-
delete =
|
140
|
+
id = interface_attributes['id']
|
141
|
+
logger.debug("add_server_interface(): id=#{id}")
|
142
|
+
delete = interface_attributes['_delete'].to_i == 1
|
147
143
|
if delete
|
148
|
-
|
149
|
-
nic.store(:delete, id)
|
150
|
-
nic
|
144
|
+
interfaces_to_delete.push(id.to_s)
|
151
145
|
else
|
152
146
|
nic.store(:id, id)
|
153
|
-
nic.store(:
|
154
|
-
nic.store(:
|
155
|
-
nic.store(:
|
156
|
-
nic.store(:
|
157
|
-
nic.store(:
|
158
|
-
nic.store(:
|
159
|
-
nic.store(:
|
160
|
-
|
161
|
-
|
162
|
-
|
147
|
+
nic.store(:macaddr, interface_attributes['macaddr']) if interface_attributes['macaddr']
|
148
|
+
nic.store(:tag, interface_attributes['tag'].to_i) if interface_attributes['tag']
|
149
|
+
nic.store(:model, interface_attributes['model'].to_s)
|
150
|
+
nic.store(:bridge, interface_attributes['bridge'].to_s) if interface_attributes['bridge']
|
151
|
+
nic.store(:firewall, interface_attributes['firewall'].to_i) if interface_attributes['firewall']
|
152
|
+
nic.store(:rate, interface_attributes['rate'].to_i) if interface_attributes['rate']
|
153
|
+
nic.store(:link_down, interface_attributes['link_down'].to_i) if interface_attributes['link_down']
|
154
|
+
nic.store(:queues, interface_attributes['queues'].to_i) if interface_attributes['queues']
|
155
|
+
logger.debug("add_server_interface(): add nic=#{nic}")
|
156
|
+
interfaces_to_add.push(Fog::Proxmox::NicHelper.flatten(nic))
|
157
|
+
end
|
163
158
|
end
|
164
159
|
|
165
160
|
end
|
@@ -33,10 +33,8 @@ module ProxmoxVmHelper
|
|
33
33
|
type = vm.config.attributes['type']
|
34
34
|
type = vm.type unless type
|
35
35
|
main = vm.attributes.select { |key,_value| main_a.include? key }
|
36
|
-
disks_regexp = /^(scsi|sata|mp|rootfs|virtio|ide)(\d+){0,1}$/
|
37
|
-
nics_regexp = /^(net)(\d+)/
|
38
36
|
main_a += %w[templated]
|
39
|
-
config = vm.config.attributes.reject { |key,_value| main_a.include?(key) ||
|
37
|
+
config = vm.config.attributes.reject { |key,_value| main_a.include?(key) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key) }
|
40
38
|
vm_h = vm_h.merge(main)
|
41
39
|
vm_h = vm_h.merge({'config_attributes': config})
|
42
40
|
vm_h
|
@@ -80,21 +78,4 @@ module ProxmoxVmHelper
|
|
80
78
|
config_hash.store(key, memory)
|
81
79
|
end
|
82
80
|
|
83
|
-
def parse_type_and_vmid(uuid)
|
84
|
-
uuid_regexp = /^(lxc|qemu)\_(\d+)$/
|
85
|
-
raise ::Foreman::Exception.new _("Invalid uuid=[%{uuid}]." % { uuid: uuid }) unless uuid.match(uuid_regexp)
|
86
|
-
id_a = uuid.scan(uuid_regexp).first
|
87
|
-
type = id_a[0]
|
88
|
-
vmid = id_a[1]
|
89
|
-
return type, vmid
|
90
|
-
end
|
91
|
-
|
92
|
-
def mount_point_disk?(id)
|
93
|
-
/^(mp)(\d+)$/.match?(id)
|
94
|
-
end
|
95
|
-
|
96
|
-
def server_disk?(id)
|
97
|
-
/^(scsi|sata|virtio|ide)(\d+)$/.match?(id)
|
98
|
-
end
|
99
|
-
|
100
81
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2018 Tristan Robert
|
4
|
+
|
5
|
+
# This file is part of ForemanFogProxmox.
|
6
|
+
|
7
|
+
# ForemanFogProxmox is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
|
12
|
+
# ForemanFogProxmox is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
|
17
|
+
# You should have received a copy of the GNU General Public License
|
18
|
+
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
module FogExtensions
|
21
|
+
module Proxmox
|
22
|
+
module Interface
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
def mac
|
25
|
+
macaddr
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -26,6 +26,19 @@ module FogExtensions
|
|
26
26
|
vms += containers.all
|
27
27
|
vms
|
28
28
|
end
|
29
|
+
def each(collection_filters = {})
|
30
|
+
if block_given?
|
31
|
+
Kernel.loop do
|
32
|
+
break unless collection_filters[:marker]
|
33
|
+
page = all(collection_filters)
|
34
|
+
# We need to explicitly use the base 'each' method here on the page,
|
35
|
+
# otherwise we get infinite recursion
|
36
|
+
base_each = Fog::Collection.instance_method(:each)
|
37
|
+
base_each.bind(page).call { |item| yield item }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end
|
29
42
|
end
|
30
43
|
end
|
31
44
|
end
|
@@ -57,11 +57,14 @@ module FogExtensions
|
|
57
57
|
def interfaces
|
58
58
|
config.interfaces
|
59
59
|
end
|
60
|
+
def nics
|
61
|
+
config.interfaces.collect { |nic| nic.to_s }
|
62
|
+
end
|
60
63
|
def volumes
|
61
64
|
config.disks.reject { |disk| disk.cdrom? }
|
62
65
|
end
|
63
66
|
def disks
|
64
|
-
config.disks.collect { |disk| disk.
|
67
|
+
config.disks.collect { |disk| disk.to_s }
|
65
68
|
end
|
66
69
|
def vga
|
67
70
|
config.vga
|