18f159f8ec
Add property for IPv6 address ('ip6'). Build default value similarly to IPv4 - common prefix + QID or Disp ID (for DispVMs). This all is disabled unless 'ipv6' feature is enabled. It is inherited from netvm (not template). Even when enabled, VM may decide to not use it - or simply not support it. QubesOS/qubes-issues#718
142 lines
5.1 KiB
Python
142 lines
5.1 KiB
Python
# pylint: disable=protected-access
|
|
|
|
#
|
|
# The Qubes OS Project, https://www.qubes-os.org/
|
|
#
|
|
# Copyright (C) 2014-2016 Joanna Rutkowska <joanna@invisiblethingslab.com>
|
|
# Copyright (C) 2014-2016 Wojtek Porczyk <woju@invisiblethingslab.com>
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
#
|
|
# This library 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
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
import unittest
|
|
|
|
import qubes
|
|
import qubes.vm.qubesvm
|
|
|
|
import qubes.tests
|
|
import qubes.tests.vm.qubesvm
|
|
|
|
class TC_00_NetVMMixin(
|
|
qubes.tests.vm.qubesvm.QubesVMTestsMixin, qubes.tests.QubesTestCase):
|
|
def setUp(self):
|
|
super(TC_00_NetVMMixin, self).setUp()
|
|
self.app = qubes.tests.vm.TestApp()
|
|
self.app.vmm.offline_mode = True
|
|
|
|
def setup_netvms(self, vm):
|
|
# usage of QubesVM here means that those tests should be after
|
|
# testing properties used here
|
|
self.netvm1 = qubes.vm.qubesvm.QubesVM(self.app, None, qid=2,
|
|
name=qubes.tests.VMPREFIX + 'netvm1',
|
|
provides_network=True, netvm=None)
|
|
self.netvm2 = qubes.vm.qubesvm.QubesVM(self.app, None, qid=3,
|
|
name=qubes.tests.VMPREFIX + 'netvm2',
|
|
provides_network=True, netvm=None)
|
|
self.nonetvm = qubes.vm.qubesvm.QubesVM(self.app, None, qid=4,
|
|
name=qubes.tests.VMPREFIX + 'nonet')
|
|
self.app.domains = qubes.app.VMCollection(self.app)
|
|
for domain in (vm, self.netvm1, self.netvm2, self.nonetvm):
|
|
self.app.domains._dict[domain.qid] = domain
|
|
self.app.default_netvm = self.netvm1
|
|
self.app.default_fw_netvm = self.netvm1
|
|
self.addCleanup(self.cleanup_netvms)
|
|
|
|
def cleanup_netvms(self):
|
|
self.netvm1.close()
|
|
self.netvm2.close()
|
|
self.nonetvm.close()
|
|
try:
|
|
self.app.domains.close()
|
|
except AttributeError:
|
|
pass
|
|
del self.netvm1
|
|
del self.netvm2
|
|
del self.nonetvm
|
|
del self.app.default_netvm
|
|
del self.app.default_fw_netvm
|
|
|
|
|
|
@qubes.tests.skipUnlessDom0
|
|
def test_140_netvm(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyDefaultValue(vm, 'netvm', self.app.default_netvm)
|
|
self.assertPropertyValue(vm, 'netvm', self.netvm2, self.netvm2,
|
|
self.netvm2.name)
|
|
del vm.netvm
|
|
self.assertPropertyDefaultValue(vm, 'netvm', self.app.default_netvm)
|
|
self.assertPropertyValue(vm, 'netvm', self.netvm2.name, self.netvm2,
|
|
self.netvm2.name)
|
|
self.assertPropertyValue(vm, 'netvm', None, None, '')
|
|
|
|
def test_141_netvm_invalid(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyInvalidValue(vm, 'netvm', 'invalid')
|
|
self.assertPropertyInvalidValue(vm, 'netvm', 123)
|
|
|
|
def test_142_netvm_netvm(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyInvalidValue(vm, 'netvm', self.nonetvm)
|
|
|
|
def test_143_netvm_loopback(self):
|
|
vm = self.get_vm()
|
|
self.app.domains = {1: vm, vm: vm}
|
|
self.addCleanup(self.app.domains.clear)
|
|
self.assertPropertyInvalidValue(vm, 'netvm', vm)
|
|
|
|
def test_144_netvm_loopback2(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
vm.netvm = None
|
|
self.netvm2.netvm = self.netvm1
|
|
vm.provides_network = True
|
|
self.netvm1.netvm = vm
|
|
self.assertPropertyInvalidValue(vm, 'netvm', self.netvm2)
|
|
|
|
def test_150_ip(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyDefaultValue(vm, 'ip', '10.137.0.' + str(vm.qid))
|
|
vm.ip = '192.168.1.1'
|
|
self.assertEqual(vm.ip, '192.168.1.1')
|
|
|
|
def test_151_ip_invalid(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyInvalidValue(vm, 'ip', 'abcd')
|
|
self.assertPropertyInvalidValue(vm, 'ip', 'a.b.c.d')
|
|
self.assertPropertyInvalidValue(vm, 'ip', '1111.2222.3333.4444')
|
|
# TODO: implement and add here: 0.0.0.0, 333.333.333.333
|
|
|
|
def test_160_ip6(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
self.assertPropertyDefaultValue(vm, 'ip6', None)
|
|
vm.netvm.features['ipv6'] = True
|
|
self.assertPropertyDefaultValue(vm, 'ip6',
|
|
'{}::a89:{:x}'.format(qubes.config.qubes_ipv6_prefix, vm.qid))
|
|
vm.ip6 = 'abcd:efff::1'
|
|
self.assertEqual(vm.ip6, 'abcd:efff::1')
|
|
|
|
def test_161_ip6_invalid(self):
|
|
vm = self.get_vm()
|
|
self.setup_netvms(vm)
|
|
vm.netvm.features['ipv6'] = True
|
|
self.assertPropertyInvalidValue(vm, 'ip', 'zzzz')
|
|
self.assertPropertyInvalidValue(vm, 'ip',
|
|
'1:2:3:4:5:6:7:8:0:a:b:c:d:e:f:0')
|