# frozen_string_literal: true # Copyright 2018 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 'test_plugin_helper' require 'models/compute_resources/compute_resource_test_helpers' require 'factories/foreman_fog_proxmox/proxmox_node_mock_factory' require 'factories/foreman_fog_proxmox/proxmox_server_mock_factory' require 'factories/foreman_fog_proxmox/proxmox_container_mock_factory' require 'active_support/core_ext/hash/indifferent_access' module ForemanFogProxmox class ProxmoxInterfacesTest < ActiveSupport::TestCase include ComputeResourceTestHelpers include ProxmoxNodeMockFactory include ProxmoxServerMockFactory include ProxmoxContainerMockFactory include ProxmoxVMHelper describe 'host_interfaces_attrs' do before do @cr = FactoryBot.build_stubbed(:proxmox_cr) end it 'raises Foreman::Exception when server proxmox NIC id does not match net[k] with k integer' do compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'dsfqsfqzef' }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'eth0', :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'qemu' }) ) err = assert_raises Foreman::Exception do @cr.host_interfaces_attrs(host) end assert err.message.end_with?('Invalid proxmox NIC id on interface[0]. Must be net[n] with n integer >= 0') end it 'sets interface identifier with server compute id, ip and ip6 and mac adress' do ip = '192.168.56.100' mac_address = '36:25:8C:53:0C:50' ip6 = Array.new(4) { format('%s', x: rand(16**4)) }.join(':') + '::1' compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0' }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :mac => mac_address, :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'qemu' }) ) nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?) nic_attr = nic_attributes.first assert_equal 'net0', nic_attr[:id] assert_equal ip, nic_attr[:ip] assert_equal ip6, nic_attr[:ip6] assert_equal mac_address, nic_attr[:macaddr] end it 'raises Foreman::Exception when container proxmox NIC id does not match net[k] with k integer' do compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'dsfqsfqzef' }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'eth0', :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'lxc' }) ) err = assert_raises Foreman::Exception do @cr.host_interfaces_attrs(host) end assert err.message.end_with?('Invalid proxmox NIC id on interface[0]. Must be net[n] with n integer >= 0') end it 'sets container compute ip/CIDR, gw and ip6' do ip = '192.168.56.100' cidr = '31' ip6 = Array.new(4) { format('%s', x: rand(16**4)) }.join(':') + '::1' compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0', 'cidr' => cidr, 'gw' => ip, 'ip' => ip, 'dhcp6' => '1' }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'lxc' }) ) nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?) nic_attr = nic_attributes.first assert_equal 'net0', nic_attr[:id] assert_equal Fog::Proxmox::IpHelper.to_cidr(ip, cidr), nic_attr[:ip] assert_equal ip, nic_attr['gw'] assert_equal 'dhcp', nic_attr[:ip6] end it 'sets container compute ip DHCP, gw6 and ip6' do ip = '192.168.56.100' cidr6 = '100' ip6 = '2001:0:1234::c1c0:abcd:876' compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0', 'cidr6' => cidr6, 'dhcp' => '1', 'gw6' => ip6 }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'lxc' }) ) nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?) nic_attr = nic_attributes.first assert_equal 'net0', nic_attr[:id] assert_equal 'dhcp', nic_attr[:ip] assert_equal Fog::Proxmox::IpHelper.to_cidr6(ip6, cidr6), nic_attr[:ip6] assert_equal ip6, nic_attr['gw6'] end it 'sets container compute ip DHCP, mac adress and firewall' do ip = '192.168.56.100' mac_address = '36:25:8C:53:0C:50' ip6 = '2001:0:1234::c1c0:abcd:876' firewall = '1' compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0', 'dhcp' => '1', 'ip6' => ip6, 'firewall' => firewall }) physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :mac => mac_address, :compute_attributes => compute_attributes) host = FactoryBot.build( :host_empty, :interfaces => [physical_nic], :compute_attributes => ActiveSupport::HashWithIndifferentAccess.new({ type: 'lxc' }) ) nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?) nic_attr = nic_attributes.first assert_equal 'net0', nic_attr[:id] assert_equal 'dhcp', nic_attr[:ip] assert_equal mac_address, nic_attr[:hwaddr] assert_equal ip6, nic_attr[:ip6] assert_equal firewall, nic_attr['firewall'] end end end end