Skip to content

Commit

Permalink
dns: T5144: Update smoketest for dynamic dns operation
Browse files Browse the repository at this point in the history
  • Loading branch information
indrajitr committed May 15, 2023
1 parent 28f8f62 commit 9766603
Showing 1 changed file with 70 additions and 67 deletions.
137 changes: 70 additions & 67 deletions smoketest/scripts/cli/test_service_dns_dynamic.py
Expand Up @@ -23,7 +23,6 @@
from vyos.configsession import ConfigSessionError
from vyos.util import cmd
from vyos.util import process_named_running
from vyos.util import read_file

PROCESS_NAME = 'ddclient'
DDCLIENT_CONF = '/run/ddclient/ddclient.conf'
Expand All @@ -35,7 +34,7 @@
def get_config_value(key):
tmp = cmd(f'sudo cat {DDCLIENT_CONF}')
tmp = re.findall(r'\n?{}=+(.*)'.format(key), tmp)
tmp = tmp[0].rstrip(',')
tmp = tmp[0].rstrip(', \\')
return tmp

class TestServiceDDNS(VyOSUnitTestSHIM.TestCase):
Expand All @@ -45,108 +44,111 @@ def tearDown(self):
self.cli_commit()

def test_dyndns_service(self):
from itertools import product
ddns = ['interface', interface, 'service']
users = [None, 'vyos_user']
services = ['cloudflare', 'afraid', 'dyndns', 'zoneedit']

for user, service in product(users, services):
password = 'vyos_pass'
zone = 'vyos.io'
ddns = ['address', interface, 'service']
services = {'cloudflare': {'protocol': 'cloudflare', 'zone': 'vyos.io'},
'freedns': {'protocol': 'freedns', 'username': 'vyos_user'},
'zoneedit': {'protocol': 'zoneedit1', 'username': 'vyos_user'}}
password = 'vyos_pass'
zone = 'vyos.io'

for svc, details in services.items():
self.cli_delete(base_path)
self.cli_set(base_path + ddns + [service, 'host-name', hostname])
if user is not None:
self.cli_set(base_path + ddns + [service, 'login', user])
self.cli_set(base_path + ddns + [service, 'password', password])
self.cli_set(base_path + ddns + [service, 'zone', zone])
self.cli_set(base_path + ddns + [svc, 'host-name', hostname])
for opt, value in details.items():
self.cli_set(base_path + ddns + [svc, opt, value])
self.cli_set(base_path + ddns + [svc, 'password', password])
self.cli_set(base_path + ddns + [svc, 'zone', zone])

# commit changes
if service == 'cloudflare':
if details['protocol'] == 'cloudflare':
self.cli_commit()
elif user is None:
# not set user is only allowed for cloudflare
with self.assertRaises(ConfigSessionError):
# remove zone to test not set user
self.cli_delete(base_path + ddns + [service, 'zone', 'vyos.io'])
self.cli_commit()
# this case is fininshed, user not set is not allowed when service isn't cloudflare
continue
else:
# zone option only works on cloudflare, an exception is raised
# for all others
# zone option does not work on all protocols, an exception is
# raised for all others
with self.assertRaises(ConfigSessionError):
self.cli_commit()
self.cli_delete(base_path + ddns + [service, 'zone', 'vyos.io'])
self.cli_delete(base_path + ddns + [svc, 'zone', zone])
# commit changes again - now it should work
self.cli_commit()

# we can only read the configuration file when we operate as 'root'
protocol = get_config_value('protocol')
login = None if user is None else get_config_value('login')
pwd = get_config_value('password')

# some services need special treatment
protoname = service
if service == 'cloudflare':
tmp = get_config_value('zone')
self.assertTrue(tmp == zone)
elif service == 'afraid':
protoname = 'freedns'
elif service == 'dyndns':
protoname = 'dyndns2'
elif service == 'zoneedit':
protoname = 'zoneedit1'

self.assertTrue(protocol == protoname)
self.assertTrue(login == user)
self.assertTrue(pwd == "'" + password + "'")
for opt in details.keys():
if opt == 'username':
self.assertTrue(get_config_value('login') == details[opt])
else:
self.assertTrue(get_config_value(opt) == details[opt])

self.assertTrue(get_config_value('use') == 'if')
self.assertTrue(get_config_value('if') == interface)

# Check for running process
self.assertTrue(process_named_running(PROCESS_NAME))

def test_dyndns_rfc2136(self):
# Check if DDNS service can be configured and runs
ddns = ['interface', interface, 'rfc2136', 'vyos']
ddns = ['address', interface, 'rfc2136', 'vyos']
ddns_key_file = '/config/auth/my.key'

with open(ddns_key_file, 'w') as f:
f.write('S3cretKey')

self.cli_set(base_path + ddns + ['key', ddns_key_file])
self.cli_set(base_path + ddns + ['record', 'test.ddns.vyos.io'])
self.cli_set(base_path + ddns + ['host-name', 'test.ddns.vyos.io'])
self.cli_set(base_path + ddns + ['server', 'ns1.vyos.io'])
self.cli_set(base_path + ddns + ['ttl', '300'])
self.cli_set(base_path + ddns + ['zone', 'vyos.io'])

# ensure an exception will be raised as no key is present
if os.path.exists(ddns_key_file):
os.unlink(ddns_key_file)

# check validate() - the key file does not exist yet
with self.assertRaises(ConfigSessionError):
self.cli_commit()

with open(ddns_key_file, 'w') as f:
f.write('S3cretKey')

# commit changes
self.cli_commit()

# TODO: inspect generated configuration file

# Check for running process
self.assertTrue(process_named_running(PROCESS_NAME))

def test_dyndns_dual(self):
ddns = ['address', interface, 'service']
services = {'cloudflare': {'protocol': 'cloudflare', 'zone': 'vyos.io'},
'freedns': {'protocol': 'freedns', 'username': 'vyos_user'}}
password = 'vyos_pass'
ip_version = 'both'

for svc, details in services.items():
self.cli_delete(base_path)
self.cli_set(base_path + ddns + [svc, 'host-name', hostname])
for opt, value in details.items():
self.cli_set(base_path + ddns + [svc, opt, value])
self.cli_set(base_path + ddns + [svc, 'password', password])
self.cli_set(base_path + ddns + [svc, 'ip-version', ip_version])

# commit changes
self.cli_commit()

for opt in details.keys():
if opt == 'username':
self.assertTrue(get_config_value('login') == details[opt])
else:
self.assertTrue(get_config_value(opt) == details[opt])

self.assertTrue(get_config_value('usev4') == 'ifv4')
self.assertTrue(get_config_value('usev6') == 'ifv6')
self.assertTrue(get_config_value('ifv4') == interface)
self.assertTrue(get_config_value('ifv6') == interface)

# Check for running process
self.assertTrue(process_named_running(PROCESS_NAME))

def test_dyndns_ipv6(self):
ddns = ['interface', interface, 'service', 'dynv6']
ddns = ['address', interface, 'service', 'dynv6']
proto = 'dyndns2'
user = 'none'
password = 'paSS_4ord'
srv = 'ddns.vyos.io'
ip_version = 'ipv6'

self.cli_set(base_path + ['interface', interface, 'ipv6-enable'])
self.cli_set(base_path + ddns + ['host-name', hostname])
self.cli_set(base_path + ddns + ['login', user])
self.cli_set(base_path + ddns + ['username', user])
self.cli_set(base_path + ddns + ['password', password])
self.cli_set(base_path + ddns + ['protocol', proto])
self.cli_set(base_path + ddns + ['server', srv])
self.cli_set(base_path + ddns + ['ip-version', ip_version])

# commit changes
self.cli_commit()
Expand All @@ -163,9 +165,10 @@ def test_dyndns_ipv6(self):
# Check some generating config parameters
self.assertEqual(protocol, proto)
self.assertEqual(login, user)
self.assertEqual(pwd, f"'{password}'")
self.assertEqual(pwd, password)
self.assertEqual(server, srv)
self.assertEqual(usev6, f"ifv6, if={interface}")
self.assertEqual(usev6, 'ifv6')
self.assertEqual(get_config_value('ifv6'), interface)

if __name__ == '__main__':
unittest.main(verbosity=2)

0 comments on commit 9766603

Please sign in to comment.