# frozen_string_literal: true # Copyright 2019 Tristan Robert # This file is part of ForemanFogProxmox. # ForemanFogProxmox is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # ForemanFogProxmox is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with ForemanFogProxmox. If not, see . require 'fog/proxmox' require 'fog/proxmox/helpers/nic_helper' require 'fog/proxmox/helpers/disk_helper' module ForemanFogProxmox module ProxmoxVmNew include ProxmoxVmHelper def volume_server_defaults(controller = 'scsi', device = 0) id = "#{controller}#{device}" { id: id, storage: storages.first.identity.to_s, size: (8 * GIGA), options: { cache: 'none' } } end def volume_container_defaults(id = 'rootfs') { id: id, storage: storages.first.identity.to_s, size: (8 * GIGA), options: {} } end def new_volume(attr = {}) type = attr['type'] type ||= 'qemu' case type when 'lxc' new_volume_server(attr) when 'qemu' new_volume_container(attr) end end def new_volume_server(attr = {}) opts = volume_server_defaults.merge(attr.to_h).deep_symbolize_keys opts[:size] = opts[:size].to_s Fog::Proxmox::Compute::Disk.new(opts) end def new_volume_container(attr = {}) opts = volume_container_defaults.merge(attr.to_h).deep_symbolize_keys opts[:size] = opts[:size].to_s Fog::Proxmox::Compute::Disk.new(opts) end def interface_defaults(id = 'net0') { id: id, model: 'virtio', name: 'eth0', bridge: bridges.first.identity.to_s } end def interface_server_defaults(id = 'net0') { id: id, model: 'virtio', bridge: bridges.first.identity.to_s } end def interface_container_defaults(id = 'net0') { id: id, name: 'eth0', bridge: bridges.first.identity.to_s, dhcpv4: 1, dhcpv6: 1 } end def new_interface(attr = {}) type = attr['type'] type ||= 'qemu' case type when 'lxc' new_container_interface(attr) when 'qemu' new_server_interface(attr) end end def new_server_interface(attr = {}) logger.debug('new_server_interface') opts = interface_server_defaults.merge(attr.to_h).deep_symbolize_keys Fog::Proxmox::Compute::Interface.new(opts) end def new_container_interface(attr = {}) logger.debug('new_container_interface') opts = interface_container_defaults.merge(attr.to_h).deep_symbolize_keys Fog::Proxmox::Compute::Interface.new(opts) end def default_node nodes.first end def default_node_id default_node.node end def next_vmid default_node.servers.next_id end def vm_server_instance_defaults ActiveSupport::HashWithIndifferentAccess.new( name: "foreman_#{Time.now.to_i}", vmid: next_vmid, type: 'qemu', node_id: default_node_id, cores: 1, sockets: 1, kvm: 1, vga: 'std', memory: 512 * MEGA, ostype: 'l26', keyboard: 'en-us', cpu: 'kvm64', scsihw: 'virtio-scsi-pci', ide2: 'none,media=cdrom', templated: 0 ).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::NicHelper.flatten(interface_defaults)) end def vm_container_instance_defaults ActiveSupport::HashWithIndifferentAccess.new( name: "foreman_#{Time.now.to_i}", vmid: next_vmid, type: 'lxc', node_id: default_node_id, memory: 512 * MEGA, templated: 0 ).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::NicHelper.flatten(interface_defaults)) end def vm_instance_defaults super.merge(vmid: next_vmid, node_id: default_node_id) end def new_vm(new_attr = {}) new_attr = ActiveSupport::HashWithIndifferentAccess.new(new_attr) type = new_attr['type'] type ||= 'qemu' case type when 'lxc' vm = new_container_vm(new_attr) when 'qemu' vm = new_server_vm(new_attr) end logger.debug(format(_('new_vm() vm.config=%s'), config: vm.config.inspect)) vm end def new_container_vm(new_attr = {}) options = new_attr node_id = new_attr['node_id'] node = node_id ? client.nodes.get(node_id) : default_node options = options.merge(type: 'lxc').merge(vmid: next_vmid) options = vm_container_instance_defaults.merge(options) if new_attr.empty? vm = node.containers.new(parse_container_vm(options).deep_symbolize_keys) logger.debug(format(_('new_container_vm() vm.config=%s'), config: vm.config.inspect)) vm end def new_server_vm(new_attr = {}) options = new_attr node_id = new_attr['node_id'] node = node_id ? client.nodes.get(node_id) : default_node options = options.merge(type: 'qemu').merge(vmid: next_vmid) options = vm_server_instance_defaults.merge(options) if new_attr.empty? vm = node.servers.new(parse_server_vm(options).deep_symbolize_keys) logger.debug(format(_('new_server_vm() vm.config=%s'), config: vm.config.inspect)) vm end end end