Skip to content

Commit

Permalink
Add tests for PersistentNetNamesConfig
Browse files Browse the repository at this point in the history
Method generate_link_file is also moved out of the actor to make it mockable.
  • Loading branch information
drehak committed Aug 1, 2020
1 parent 8bfdee8 commit d6d1a86
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
import os
import re
import errno

from leapp.actors import Actor
from leapp.libraries.actor.persistentnetnamesconfig import generate_link_file
from leapp.models import PersistentNetNamesFacts, PersistentNetNamesFactsInitramfs
from leapp.models import RenamedInterface, RenamedInterfaces, InitrdIncludes
from leapp.tags import ApplicationsPhaseTag, IPUWorkflowTag

LINK_FILE_TEMPLATE = """# Generated by LEAPP
[Match]
MACAddress={}
[Link]
Name={}
"""


class PersistentNetNamesConfig(Actor):
"""
Expand All @@ -31,20 +22,6 @@ class PersistentNetNamesConfig(Actor):
tags = (ApplicationsPhaseTag, IPUWorkflowTag)
initrd_files = []

def generate_link_file(self, interface):

try:
os.makedirs('/etc/systemd/network')
except OSError as e:
if e.errno != errno.EEXIST:
raise

link_file = '/etc/systemd/network/10-leapp-{}.link'.format(interface.name)
with open(link_file, 'w') as f:
f.write(LINK_FILE_TEMPLATE.format(interface.mac, interface.name))

self.initrd_files.append(link_file)

def process(self):
rhel7_ifaces = next(self.consume(PersistentNetNamesFacts)).interfaces
rhel8_ifaces = next(self.consume(PersistentNetNamesFactsInitramfs)).interfaces
Expand All @@ -68,9 +45,7 @@ def process(self):
'rhel8_name': rhel8_name}))
continue

# TODO(msekleta): we need to introduce another actor which will
# # install generated link files to RHEL-8 initrd image
self.generate_link_file(iface)
self.initrd_files.append(generate_link_file(iface))

self.produce(RenamedInterfaces(renamed=renamed_interfaces))
self.produce(InitrdIncludes(files=self.initrd_files))
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import os
import errno


LINK_FILE_TEMPLATE = """# Generated by LEAPP
[Match]
MACAddress={}
[Link]
Name={}
"""


def generate_link_file(interface):
try:
os.makedirs('/etc/systemd/network')
except OSError as e:
if e.errno != errno.EEXIST:
raise

link_file = '/etc/systemd/network/10-leapp-{}.link'.format(interface.name)
with open(link_file, 'w') as f:
f.write(LINK_FILE_TEMPLATE.format(interface.mac, interface.name))

return link_file
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
from leapp.libraries.actor import persistentnetnamesconfig
from leapp.models import PersistentNetNamesFacts, PersistentNetNamesFactsInitramfs
from leapp.models import RenamedInterface, RenamedInterfaces, InitrdIncludes
from leapp.models import Interface, PCIAddress


def generate_link_file_mocked(interface):
return '/etc/systemd/network/10-leapp-{}.link'.format(interface.name)


def interface_mocked(i=0):
return Interface(
name='n{}'.format(i),
devpath='dp{}'.format(i),
driver='d{}'.format(i),
vendor='v{}'.format(i),
pci_info=PCIAddress(
domain='pd{}'.format(i),
bus='pb{}'.format(i),
function='pf{}'.format(i),
device='pd{}'.format(i)
),
mac='m{}'.format(i)
)


def generate_interfaces(count):
return [interface_mocked(i) for i in range(count)]


def test_identical(current_actor_context):
interfaces = generate_interfaces(4)
current_actor_context.feed(PersistentNetNamesFacts(interfaces=interfaces))
current_actor_context.feed(PersistentNetNamesFactsInitramfs(interfaces=interfaces))
current_actor_context.run()

renamed_interfaces = current_actor_context.consume(RenamedInterfaces)[0]
initrd_files = current_actor_context.consume(InitrdIncludes)[0]
assert not renamed_interfaces.renamed
assert not initrd_files.files


def test_renamed_single_noneth(monkeypatch, current_actor_context):
monkeypatch.setattr(persistentnetnamesconfig, 'generate_link_file', generate_link_file_mocked)

interfaces = generate_interfaces(4)
current_actor_context.feed(PersistentNetNamesFacts(interfaces=interfaces))
interfaces[0].name = 'n4'
current_actor_context.feed(PersistentNetNamesFactsInitramfs(interfaces=interfaces))
current_actor_context.run()

renamed_interfaces = current_actor_context.consume(RenamedInterfaces)[0]
initrd_files = current_actor_context.consume(InitrdIncludes)[0]
assert not renamed_interfaces.renamed
assert len(initrd_files.files) == 1
assert '/etc/systemd/network/10-leapp-n0.link' in initrd_files.files


def test_renamed_swap_noneth(monkeypatch, current_actor_context):
monkeypatch.setattr(persistentnetnamesconfig, 'generate_link_file', generate_link_file_mocked)

interfaces = generate_interfaces(4)
current_actor_context.feed(PersistentNetNamesFacts(interfaces=interfaces))
interfaces[0].name = 'n3'
interfaces[3].name = 'n0'
current_actor_context.feed(PersistentNetNamesFactsInitramfs(interfaces=interfaces))
current_actor_context.run()

renamed_interfaces = current_actor_context.consume(RenamedInterfaces)[0]
initrd_files = current_actor_context.consume(InitrdIncludes)[0]
assert not renamed_interfaces.renamed
assert len(initrd_files.files) == 2
assert '/etc/systemd/network/10-leapp-n0.link' in initrd_files.files
assert '/etc/systemd/network/10-leapp-n3.link' in initrd_files.files


def test_renamed_single_eth(monkeypatch, current_actor_context):
monkeypatch.setattr(persistentnetnamesconfig, 'generate_link_file', generate_link_file_mocked)

interfaces = generate_interfaces(4)
for i in range(4):
interfaces[i].name = 'eth{}'.format(i)
current_actor_context.feed(PersistentNetNamesFacts(interfaces=interfaces))
interfaces[0].name = 'eth4'
current_actor_context.feed(PersistentNetNamesFactsInitramfs(interfaces=interfaces))
current_actor_context.run()

renamed_interfaces = current_actor_context.consume(RenamedInterfaces)[0]
initrd_files = current_actor_context.consume(InitrdIncludes)[0]
assert len(renamed_interfaces.renamed) == 1
assert renamed_interfaces.renamed[0].rhel7_name == 'eth0'
assert renamed_interfaces.renamed[0].rhel8_name == 'eth4'
assert not initrd_files.files


def test_renamed_swap_eth(monkeypatch, current_actor_context):
monkeypatch.setattr(persistentnetnamesconfig, 'generate_link_file', generate_link_file_mocked)

interfaces = generate_interfaces(4)
for i in range(4):
interfaces[i].name = 'eth{}'.format(i)
current_actor_context.feed(PersistentNetNamesFacts(interfaces=interfaces))
interfaces[0].name = 'eth3'
interfaces[3].name = 'eth0'
current_actor_context.feed(PersistentNetNamesFactsInitramfs(interfaces=interfaces))
current_actor_context.run()

renamed_interfaces = current_actor_context.consume(RenamedInterfaces)[0]
initrd_files = current_actor_context.consume(InitrdIncludes)[0]
assert len(renamed_interfaces.renamed) == 2
for interface in renamed_interfaces.renamed:
if interface.rhel7_name == 'eth0':
assert interface.rhel8_name == 'eth3'
elif interface.rhel7_name == 'eth3':
assert interface.rhel8_name == 'eth0'
assert not initrd_files.files

0 comments on commit d6d1a86

Please sign in to comment.