summaryrefslogtreecommitdiff
path: root/smoketest/scripts/cli/test_service_dhcpv6-server.py
blob: 278524585272df4bca1648d76815dc75ed1778bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python3
#
# Copyright (C) 2020 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

import re
import os
import unittest

from vyos.configsession import ConfigSession
from vyos.configsession import ConfigSessionError
from vyos.template import inc_ip
from vyos.util import cmd
from vyos.util import process_named_running
from vyos.util import read_file

PROCESS_NAME = 'dhcpd'
DHCPD_CONF = '/run/dhcp-server/dhcpdv6.conf'
base_path = ['service', 'dhcpv6-server']

subnet = '2001:db8:f00::/64'
dns_1 = '2001:db8::1'
dns_2 = '2001:db8::2'
domain = 'vyos.net'
nis_servers = ['2001:db8:ffff::1', '2001:db8:ffff::2']
interface = 'eth1'
interface_addr = inc_ip(subnet, 1) + '/64'

class TestServiceDHCPServer(unittest.TestCase):
    def setUp(self):
        self.session = ConfigSession(os.getpid())
        self.session.set(['interfaces', 'ethernet', interface, 'address', interface_addr])

    def tearDown(self):
        self.session.delete(base_path)
        self.session.delete(['interfaces', 'ethernet', interface, 'address', interface_addr])
        self.session.commit()
        del self.session

    def test_single_pool_range(self):
        shared_net_name = 'SMOKE-1'
        search_domains  = ['foo.vyos.net', 'bar.vyos.net']
        lease_time = '1200'
        max_lease_time = '72000'
        min_lease_time = '600'
        preference = '10'
        sip_server = 'sip.vyos.net'
        sntp_server = inc_ip(subnet, 100)
        range_start = inc_ip(subnet, 256)  # ::100
        range_stop = inc_ip(subnet, 65535) # ::ffff

        pool = base_path + ['shared-network-name', shared_net_name, 'subnet', subnet]

        self.session.set(base_path + ['preference', preference])

        # we use the first subnet IP address as default gateway
        self.session.set(pool + ['name-server', dns_1])
        self.session.set(pool + ['name-server', dns_2])
        self.session.set(pool + ['name-server', dns_2])
        self.session.set(pool + ['lease-time', 'default', lease_time])
        self.session.set(pool + ['lease-time', 'maximum', max_lease_time])
        self.session.set(pool + ['lease-time', 'minimum', min_lease_time])
        self.session.set(pool + ['nis-domain', domain])
        self.session.set(pool + ['nisplus-domain', domain])
        self.session.set(pool + ['sip-server', sip_server])
        self.session.set(pool + ['sntp-server', sntp_server])
        self.session.set(pool + ['address-range', 'start', range_start, 'stop', range_stop])

        for server in nis_servers:
            self.session.set(pool + ['nis-server', server])
            self.session.set(pool + ['nisplus-server', server])

        for search in search_domains:
            self.session.set(pool + ['domain-search', search])

        client_base = 1
        for client in ['client1', 'client2', 'client3']:
            cid = '00:01:00:01:12:34:56:78:aa:bb:cc:dd:ee:{}'.format(client_base)
            self.session.set(pool + ['static-mapping', client, 'identifier', cid])
            self.session.set(pool + ['static-mapping', client, 'ipv6-address', inc_ip(subnet, client_base)])
            client_base += 1

        # commit changes
        self.session.commit()

        config = read_file(DHCPD_CONF)
        self.assertIn(f'option dhcp6.preference {preference};', config)

        self.assertIn(f'subnet6 {subnet}' + r' {', config)
        search = '"' + '", "'.join(search_domains) + '"'
        nissrv = ', '.join(nis_servers)
        self.assertIn(f'range6 {range_start} {range_stop};', config)
        self.assertIn(f'default-lease-time {lease_time};', config)
        self.assertIn(f'default-lease-time {lease_time};', config)
        self.assertIn(f'max-lease-time {max_lease_time};', config)
        self.assertIn(f'min-lease-time {min_lease_time};', config)
        self.assertIn(f'option dhcp6.domain-search {search};', config)
        self.assertIn(f'option dhcp6.name-servers {dns_1}, {dns_2};', config)
        self.assertIn(f'option dhcp6.nis-domain-name "{domain}";', config)
        self.assertIn(f'option dhcp6.nis-servers {nissrv};', config)
        self.assertIn(f'option dhcp6.nisp-domain-name "{domain}";', config)
        self.assertIn(f'option dhcp6.nisp-servers {nissrv};', config)
        self.assertIn(f'set shared-networkname = "{shared_net_name}";', config)

        client_base = 1
        for client in ['client1', 'client2', 'client3']:
            cid = '00:01:00:01:12:34:56:78:aa:bb:cc:dd:ee:{}'.format(client_base)
            ip = inc_ip(subnet, client_base)
            self.assertIn(f'host {shared_net_name}_{client}' + ' {', config)
            self.assertIn(f'fixed-address6 {ip};', config)
            self.assertIn(f'host-identifier option dhcp6.client-id {cid};', config)
            client_base += 1

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

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