def test_ca_control_channel_config_write(): # let's check minimal configuration misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict( command='config-write', arguments={"filename": world.f_cfg.data_join("new_CA_config_file")}) _send_directly_to_ca(cmd) srv_msg.copy_remote(world.f_cfg.data_join("new_CA_config_file")) # let's load json from downloaded file and check if it is the same what we configured kea with with open(os.path.join(world.cfg["test_result_dir"], 'downloaded_file'), 'r') as f: downloaded_config = json.load(f) del downloaded_config["Control-agent"]["loggers"] del world.ca_cfg["Control-agent"]["loggers"] del downloaded_config["Control-agent"]["hooks-libraries"] assert downloaded_config["Control-agent"] == world.ca_cfg["Control-agent"]
def test_HA_load_balancing_both_scopes_for_primary(dhcp_version, backend): # HA SERVER 1 misc.test_setup() srv_control.define_temporary_lease_db_backend(backend) if dhcp_version == "v6": srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::20') world.dhcp_cfg["subnet6"][0]["pools"][0].update( {"client-class": "HA_server1"}) world.dhcp_cfg["subnet6"][0]["pools"].append({ "pool": "2001:db8:1::100-2001:db8:1::120", "client-class": "HA_server2" }) else: srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.20') world.dhcp_cfg["subnet4"][0]["pools"][0].update( {"client-class": "HA_server1"}) world.dhcp_cfg["subnet4"][0]["pools"].append({ "pool": "192.168.50.100-192.168.50.120", "client-class": "HA_server2" }) srv_control.open_control_channel() srv_control.agent_control_channel(world.f_cfg.mgmt_address) srv_control.add_hooks('libdhcp_lease_cmds.so') srv_control.add_ha_hook('libdhcp_ha.so') world.dhcp_cfg["hooks-libraries"][1].update(LOAD_BALANCING) srv_control.update_ha_hook_parameter({ "heartbeat-delay": 1000, "max-ack-delay": 100, "max-response-delay": 1500, "max-unacked-clients": 2, "this-server-name": "server1" }) srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') # HA SERVER 2 # we don't need it, server1 wont detect server2 and will go straight to partner-down resp = wait_until_ha_state('partner-down', dhcp_version=dhcp_version) # wait_until_ha_state('load-balancing', dhcp_version=dhcp_version, dest=world.f_cfg.mgmt_address_2) assert "server2" in resp["arguments"]["scopes"] assert "server1" in resp["arguments"]["scopes"] misc.test_procedure() # get 10 leases some form server1 and some from server2 l_count = 40 set_of_leases_1 = generate_leases(leases_count=l_count, iaid=1, iapd=0, dhcp_version=dhcp_version) assert l_count == len( set_of_leases_1), "Server didn't give us all leases it had configured" srv_msg.check_leases(set_of_leases_1)
def test_control_channel_keashell_set_config_basic(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') # this command is with new configuration srv_msg.execute_kea_shell('--host 127.0.0.1 --port 8000 --service dhcp4 config-set <<<\'"Dhcp4":{"renew-timer":1000,"rebind-timer":2000,"valid-lifetime":4000,"interfaces-config":{"interfaces":["$(SERVER_IFACE)"]},"subnet4":[{"subnet":"192.168.51.0/24","interface":"$(SERVER_IFACE)","pools":[{"pool":"192.168.51.1-192.168.51.1"}]}],"lease-database":{"type":"memfile"},"control-socket":{"socket-type":"unix","socket-name":"%s"}}\'' % world.f_cfg.run_join('control_socket')) srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.51.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0')
def test_control_channel_keashell_dhcp_disable(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp4 dhcp-disable <<<\'\'') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_dont_wait_for_message()
def test_control_channel_keashell_dhcp_disable(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') srv_msg.execute_kea_shell('--host 127.0.0.1 --port 8000 --service dhcp4 dhcp-disable <<<\'\'') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_dont_wait_for_message()
def test_ca_control_channel_config_get_set(): misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command='config-get', arguments={}) response = _send_directly_to_ca(cmd) cfg = response["arguments"] # let's dump logging configuration del cfg["Control-agent"]["loggers"] del world.ca_cfg["Control-agent"]["loggers"] # empty list is default config part, in our generated config it's not existing del cfg["Control-agent"]["hooks-libraries"] assert world.ca_cfg["Control-agent"] == cfg["Control-agent"] cmd = dict(command='config-set', arguments=cfg) _send_directly_to_ca(cmd)
def test_control_channel_http_dhcp_disable(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') srv_msg.send_ctrl_cmd_via_http('{"command": "dhcp-disable","service": ["dhcp4"]}', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_dont_wait_for_message()
def setup_server(**kwargs): misc.test_setup() srv_control.config_srv_subnet('$(EMPTY)', '$(EMPTY)') config_model_args = {} init_cfg = {"interfaces-config": {"interfaces": ["$(SERVER_IFACE)"]}, "lease-database": {"type": "memfile"}, "control-socket": {"socket-type": 'unix', "socket-name":'$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket'}} for param, val in kwargs.items(): if val is None or param == 'check-config': continue if param in ['force-reload']: # these fields are passed to ConfigModel config_model_args['force_reload'] = val continue param = param.replace('_', '-') init_cfg[param] = val cfg = ConfigModel(init_cfg, **config_model_args) srv_control.agent_control_channel('host_address', 'host_port', 'socket_type', 'socket_name') # TODO: to force enablic ctrl-agent srv_control.build_and_send_config_files2(cfg.get_dict(), 'SSH', 'config-file') srv_control.start_srv('DHCP', 'started') # check actual configuration if requested if 'check-config' in kwargs and kwargs['check-config']: srv_config = cfg.compare_local_with_server() return cfg, srv_config return cfg
def test_control_channel_http_dhcp_disable(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "dhcp-disable","service": ["dhcp4"]}') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_dont_wait_for_message()
def test_control_channel_http_dhcp_disable_timer(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') srv_msg.send_ctrl_cmd_via_http( '{"command": "dhcp-disable","service": ["dhcp6"], "arguments": {"max-period": 5}}', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.forge_sleep('7', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5')
def test_control_channel_keashell_dhcp_disable_timer(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp6 dhcp-disable <<<\'"max-period": 5\'' ) misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.forge_sleep('7', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5')
def test_control_channel_http_dhcp_disable_and_enable(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "dhcp-disable","service": ["dhcp6"]}') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "dhcp-enable","service": ["dhcp6"]}') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5')
def test_control_channel_socket_reload_config(): # initial configuration is taken from file misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') # now configuration is set over kea-shell misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files('SSH', 'config-file') srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp4 config-reload <<<\'\'') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.51.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') # and now goes restart so configuration again is taken from files srv_control.start_srv('DHCP', 'restarted') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.51.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0')
def test_control_channel_keashell_dhcp_disable_and_enable(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp6 dhcp-disable <<<\'\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp6 dhcp-enable <<<\'\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5')
def test_control_channel_http_dhcp_disable_and_enable(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'ADVERTISE') srv_msg.response_check_include_option(1) srv_msg.response_check_include_option(2) srv_msg.response_check_include_option(3) srv_msg.response_check_option_content(3, 'sub-option', 5) srv_msg.response_check_suboption_content(5, 3, 'addr', '3000::1') srv_msg.send_ctrl_cmd_via_http( '{"command": "dhcp-disable","service": ["dhcp6"]}', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.send_ctrl_cmd_via_http( '{"command": "dhcp-enable","service": ["dhcp6"]}', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'ADVERTISE') srv_msg.response_check_include_option(1) srv_msg.response_check_include_option(2) srv_msg.response_check_include_option(3) srv_msg.response_check_option_content(3, 'sub-option', 5)
def test_HA_passive_backup_sync(dhcp_version, backend): misc.test_setup() srv_control.define_temporary_lease_db_backend(backend) if dhcp_version == 'v6': srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::ffff') elif dhcp_version == 'v4': srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.200') srv_control.open_control_channel() srv_control.agent_control_channel() srv_control.add_hooks('libdhcp_lease_cmds.so') srv_control.add_ha_hook('libdhcp_ha.so') world.dhcp_cfg["hooks-libraries"][1].update(PASSIVE_BACKUP) srv_control.update_ha_hook_parameter({"this-server-name": "server1"}) srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') # HA SERVER 2 misc.test_setup() srv_control.define_temporary_lease_db_backend(backend) # we have to clear data on second system, before test forge does not know that we have multiple systems srv_control.clear_some_data('all', dest=world.f_cfg.mgmt_address_2) if dhcp_version == 'v6': srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::ffff') elif dhcp_version == 'v4': srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.200') srv_control.open_control_channel() srv_control.agent_control_channel(world.f_cfg.mgmt_address_2) srv_control.add_hooks('libdhcp_lease_cmds.so') srv_control.add_ha_hook('libdhcp_ha.so') world.dhcp_cfg["hooks-libraries"][1].update(PASSIVE_BACKUP) srv_control.update_ha_hook_parameter({"this-server-name": "server2"}) srv_control.build_and_send_config_files(dest=world.f_cfg.mgmt_address_2) srv_control.start_srv('DHCP', 'started', dest=world.f_cfg.mgmt_address_2) wait_until_ha_state('passive-backup', dhcp_version=dhcp_version) set_of_leases_1 = generate_leases(leases_count=5, iaid=3, iapd=2, dhcp_version=dhcp_version) # we have no confirmation in syncing so just let's wait a bit srv_msg.forge_sleep(2, 'seconds') # check synced leases srv_msg.check_leases(set_of_leases_1, backend=backend) srv_msg.check_leases(set_of_leases_1, backend=backend, dest=world.f_cfg.mgmt_address_2)
def test_control_channel_http_config_set_basic(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::1') # Server has control agent configured on HTTP connection with address $(SRV4_ADDR):8000 and socket unix path: $(SOFTWARE_INSTALL_DIR)/var/kea/control_socket. srv_control.generate_config_files() srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-set", "service": ["dhcp6"], "arguments": $(SERVER_CONFIG) }') srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '2001:db8:1::1')
def test_control_channel_keashell_get_config(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') srv_msg.execute_kea_shell('--host 127.0.0.1 --port 8000 --service dhcp4 config-get <<<\'\'')
def test_control_channel_keashell_dhcp_disable_and_enable(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'ADVERTISE') srv_msg.response_check_include_option(1) srv_msg.response_check_include_option(2) srv_msg.response_check_include_option(3) srv_msg.response_check_option_content(3, 'sub-option', 5) srv_msg.response_check_suboption_content(5, 3, 'addr', '3000::1') srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp6 dhcp-disable <<<\'\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_dont_wait_for_message() srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp6 dhcp-enable <<<\'\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', 'client-id') srv_msg.client_does_include('Client', 'IA_Address') srv_msg.client_does_include('Client', 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'ADVERTISE') srv_msg.response_check_include_option(1) srv_msg.response_check_include_option(2) srv_msg.response_check_include_option(3) srv_msg.response_check_option_content(3, 'sub-option', 5)
def test_control_channel_http_config_set_basic(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::1') # Server has control agent configured on HTTP connection with address $(SRV4_ADDR):8000 and socket unix path: control_socket. srv_control.generate_config_files() srv_msg.send_ctrl_cmd_via_http( '{"command": "config-set", "service": ["dhcp6"], "arguments": $(SERVER_CONFIG) }', '$(SRV4_ADDR)') srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '2001:db8:1::1')
def test_control_channel_http_get_config(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') srv_msg.send_ctrl_cmd_via_http('{"command": "config-get","service":["dhcp4"],"arguments": {} }', '$(SRV4_ADDR)')
def test_control_channel_keashell_get_config(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp6 config-get <<<\'\'')
def test_control_channel_http_get_config(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.send_ctrl_cmd_via_http( '{"command": "config-get","service":["dhcp6"],"arguments": {} }', '$(SRV4_ADDR)')
def test_v4_full_disk_testing(): # check how kea4 behave when disk is full, using memfile and logs to file assert False, "this test may destroy your setup, remove this line if you really want to run it" misc.test_setup() _create_ramdisk() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.150') srv_control.add_hooks('libdhcp_legal_log.so') srv_control.open_control_channel() srv_control.agent_control_channel(world.f_cfg.mgmt_address) # set memfile and log location to created ramdisk world.dhcp_cfg["lease-database"] = { "type": "memfile", "name": "/tmp/kea_ram_disk/dhcp.leases" } world.dhcp_cfg["loggers"] = [{ "debuglevel": 99, "name": "kea-dhcp4", "output_options": [{ "output": "/tmp/kea_ram_disk/kea.log" }], "severity": "DEBUG" }] world.dhcp_cfg["hooks-libraries"][0].update({ "parameters": { "path": "/tmp/kea_ram_disk/", "base-name": "kea-forensic" } }) srv_control.add_hooks('libdhcp_lease_cmds.so') # srv_control.print_cfg() srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') _allocate_disk_space() print(_check_disk()) # we expected that kea will keep working properly, assigning addresses in memory, # turned out that when it can't save lease to memfile/db it return NAK/NoAddrAvail code # even if disk is reported with no empty space left kea is able to save multiple leases # mostly it's 36. # Kea will keep working when it can't write main logs # Kea will keep working when it can't write forensic logs, and log error about this event in main logs generate_leases(leases_count=100, dhcp_version='v4', iapd=0, mac="01:02:0c:03:0a:00") send_command(cmd={"command": "lease4-get-all"})
def test_control_channel_keashell_set_config_basic(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.forge_sleep('2', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') # this command is with new configuration srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp6 config-set <<<\'"Dhcp6": { "control-socket": { "socket-name": "$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket", "socket-type": "unix" }, "decline-probation-period": 86400, "dhcp-ddns": { "always-include-fqdn": false, "enable-updates": false, "generated-prefix": "myhost", "max-queue-size": 1024, "ncr-format": "JSON", "ncr-protocol": "UDP", "override-client-update": false, "override-no-update": false, "qualifying-suffix": "", "replace-client-name": "never", "sender-ip": "0.0.0.0", "sender-port": 0, "server-ip": "127.0.0.1", "server-port": 53001 }, "dhcp4o6-port": 0, "expired-leases-processing": { "flush-reclaimed-timer-wait-time": 25, "hold-reclaimed-time": 3600, "max-reclaim-leases": 100, "max-reclaim-time": 250, "reclaim-timer-wait-time": 10, "unwarned-reclaim-cycles": 5 }, "hooks-libraries": [ ], "host-reservation-identifiers": [ "hw-address", "duid" ], "interfaces-config": { "interfaces": [ "$(SERVER_IFACE)" ], "re-detect": true }, "lease-database": { "type": "memfile" }, "mac-sources": [ "any" ], "option-data": [ ], "option-def": [ ], "relay-supplied-options": [ "65" ], "server-id": { "enterprise-id": 0, "htype": 0, "identifier": "", "persist": true, "time": 0, "type": "LLT" }, "shared-networks": [ ], "subnet6": [ { "id": 1, "interface": "$(SERVER_IFACE)", "option-data": [ ], "pd-pools": [ ], "pools": [ { "option-data": [ ], "pool": "2001:db8:1::1-2001:db8:1::1" } ], "preferred-lifetime": 3000, "rapid-commit": false, "rebind-timer": 2000, "relay": { "ip-address": "::" }, "renew-timer": 1000, "reservation-mode": "all", "reservations": [ ], "subnet": "2001:db8:1::/64", "valid-lifetime": 4000 } ] }\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '2001:db8:1::1')
def test_ca_control_channel_shutdown(): misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command='shutdown') _send_directly_to_ca(cmd) cmd = dict(command='config-write', arguments={}) _send_directly_to_ca(cmd, exp_failed=True)
def test_ca_control_channel_version_get(): misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command='version-get', arguments={}) response = _send_directly_to_ca(cmd) assert response["arguments"]["extended"]
def test_control_channel_http_after_restart_load_config_file(): # initial configuration is taken from file misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') # now configuration is set over control-agent misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_config_files() srv_msg.send_ctrl_cmd_via_http('{"command": "config-set", "service": ["dhcp4"],"arguments": $(DHCP_CONFIG) }', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.51.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') # and now goes restart so configuration again is taken from files srv_control.start_srv('DHCP', 'restarted') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0')
def test_control_channel_http_change_socket_during_reconfigure(): # change address test needed also misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.add_hooks('libdhcp_host_cmds.so') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') result = srv_msg.send_ctrl_cmd_via_http('{"command":"config-get", "service": ["dhcp4"], "arguments": {} }', '$(SRV4_ADDR)') assert result[0]['result'] == 0 misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.50.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.open_control_channel(socket_name='control_socket2') srv_control.agent_control_channel('$(SRV4_ADDR)', socket_name='control_socket2') srv_control.generate_config_files() # reconfigure dhcp4 (new subnet, new socket) srv_msg.send_ctrl_cmd_via_http('{"command": "config-set", "service": ["dhcp4"],"arguments": $(DHCP_CONFIG) }', '$(SRV4_ADDR)') # reconfigure control-agent to switch to new dhcp4 socket srv_msg.send_ctrl_cmd_via_http('{"command": "config-set", "arguments": $(AGENT_CONFIG) }', '$(SRV4_ADDR)') misc.test_procedure() srv_msg.client_requests_option(1) srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_include_option(1) srv_msg.response_check_content('yiaddr', '192.168.51.1') srv_msg.response_check_option_content(1, 'value', '255.255.255.0') result = srv_msg.send_ctrl_cmd_via_http('{"command":"config-get", "service": ["dhcp4"], "arguments": {} }', '$(SRV4_ADDR)') assert result[0]['result'] == 0
def test_control_channel_keashell_set_config_basic(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel() srv_control.agent_control_channel('127.0.0.1') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.forge_sleep('2', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') # this command is with new configuration srv_msg.execute_kea_shell( '--host 127.0.0.1 --port 8000 --service dhcp6 config-set <<<\'"Dhcp6": { "control-socket": { "socket-name": "%s", "socket-type": "unix" }, "decline-probation-period": 86400, "dhcp-ddns": { "always-include-fqdn": false, "enable-updates": false, "generated-prefix": "myhost", "max-queue-size": 1024, "ncr-format": "JSON", "ncr-protocol": "UDP", "override-client-update": false, "override-no-update": false, "qualifying-suffix": "", "replace-client-name": "never", "sender-ip": "0.0.0.0", "sender-port": 0, "server-ip": "127.0.0.1", "server-port": 53001 }, "dhcp4o6-port": 0, "expired-leases-processing": { "flush-reclaimed-timer-wait-time": 25, "hold-reclaimed-time": 3600, "max-reclaim-leases": 100, "max-reclaim-time": 250, "reclaim-timer-wait-time": 10, "unwarned-reclaim-cycles": 5 }, "hooks-libraries": [ ], "host-reservation-identifiers": [ "hw-address", "duid" ], "interfaces-config": { "interfaces": [ "$(SERVER_IFACE)" ], "re-detect": true }, "lease-database": { "type": "memfile" }, "mac-sources": [ "any" ], "option-data": [ ], "option-def": [ ], "relay-supplied-options": [ "65" ], "server-id": { "enterprise-id": 0, "htype": 0, "identifier": "", "persist": true, "time": 0, "type": "LLT" }, "shared-networks": [ ], "subnet6": [ { "id": 1, "interface": "$(SERVER_IFACE)", "option-data": [ ], "pd-pools": [ ], "pools": [ { "option-data": [ ], "pool": "2001:db8:1::1-2001:db8:1::1" } ], "preferred-lifetime": 3000, "rapid-commit": false, "rebind-timer": 2000, "relay": { "ip-address": "::" }, "renew-timer": 1000, "reservation-mode": "all", "reservations": [ ], "subnet": "2001:db8:1::/64", "valid-lifetime": 4000 } ] }\'' % world.f_cfg.run_join('control_socket')) misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '2001:db8:1::1')
def _create_pgsql_dump(): # dump for postrgesql is bit different because we do not have config backend for postgres # but we will still use kea 1.6.3 to generate this. In future we will have to create new dump with # config backend data srv_msg.remove_file_from_server('$(SOFTWARE_INSTALL_PATH)/pg_db_v4.sql') world.f_cfg.multi_threading_enabled = False misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.10-192.168.50.10') srv_control.add_hooks('libdhcp_host_cmds.so') srv_control.add_hooks('libdhcp_cb_cmds.so') srv_control.add_hooks('libdhcp_mysql_cb.so') srv_control.open_control_channel() srv_control.agent_control_channel('$(MGMT_ADDRESS)') srv_control.enable_db_backend_reservation('PostgreSQL') srv_control.define_temporary_lease_db_backend('postgresql') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') hr = {"reservation": {"subnet-id": 1, "hw-address": "01:0a:0b:0c:0d:0e:0f", "ip-address": "192.168.50.205", "next-server": "192.0.2.1", "server-hostname": "hal9000", "boot-file-name": "/dev/null", "option-data": [{"name": "domain-name-servers", "data": "10.1.1.202,10.1.1.203"}], "client-classes": ["special_snowflake", "office"]}} _send_cmd("reservation-add", hr) misc.test_procedure() srv_msg.client_sets_value('Client', 'chaddr', 'ff:01:02:03:ff:04') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'OFFER') srv_msg.response_check_content('yiaddr', '192.168.50.10') misc.test_procedure() srv_msg.client_copy_option('server_id') srv_msg.client_does_include_with_value('requested_addr', '192.168.50.10') srv_msg.client_sets_value('Client', 'chaddr', 'ff:01:02:03:ff:04') srv_msg.client_send_msg('REQUEST') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', 'ACK') # wanted to do this with fabric_sudo_command(cmd, sudo_user='******' but it failed cmd = "sudo -S -u postgres pg_dump %s >%s/pg_db_v4.sql" % (world.f_cfg.db_name, world.f_cfg.software_install_path) fabric_run_command(cmd, ignore_errors=False, destination_host=world.f_cfg.mgmt_address) srv_msg.execute_shell_cmd("sed -i 's/$(DB_USER)/!db_user!/g' %s/pg_db_v4.sql" % world.f_cfg.software_install_path)
def test_control_channel_http_change_socket_during_reconfigure(): # change address test needed also misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.add_hooks('$(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_host_cmds.so') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket2') srv_control.generate_config_files() srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-set", "service": ["dhcp4"],"arguments": $(SERVER_CONFIG) }') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.51.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command":"list-commands","arguments": {} }')
def test_ca_control_channel_config_reload(): # let's check minimal configuration misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command='config-get', arguments={}) response = _send_directly_to_ca(cmd) cfg = response["arguments"] # let's dump logging configuration del cfg["Control-agent"]["loggers"] del world.ca_cfg["Control-agent"]["loggers"] # empty list is default config part, in our generated config it's not existing del cfg["Control-agent"]["hooks-libraries"] assert world.ca_cfg["Control-agent"] == cfg["Control-agent"] misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(MGMT_ADDRESS)') srv_control.build_and_send_config_files() cmd = dict(command='config-reload', arguments={}) _send_directly_to_ca(cmd) cmd = dict(command="list-commands", arguments={}) _send_directly_to_ca(cmd, exp_failed=True) cmd = dict(command='config-get', arguments={}) response = _send_directly_to_ca(cmd, address='$(MGMT_ADDRESS)') new_cfg = response["arguments"] # let's dump logging configuration del new_cfg["Control-agent"]["loggers"] del world.ca_cfg["Control-agent"]["loggers"] # empty list is default config part, in our generated config it's not existing del new_cfg["Control-agent"]["hooks-libraries"] # if test continue on this point we know that server was reconfigured with proper address # now let's check if the rest of the config is correct assert world.ca_cfg["Control-agent"] == new_cfg["Control-agent"]
def test_control_channel_keashell_after_restart_load_config_file(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp4 config-set <<<\'"Dhcp4":{"renew-timer":1000,"rebind-timer":2000,"valid-lifetime":4000,"interfaces-config":{"interfaces":["$(SERVER_IFACE)"]},"subnet4":[{"subnet":"192.168.51.0/24","interface":"$(SERVER_IFACE)","pools":[{"pool":"192.168.51.1-192.168.51.1"}]}],"lease-database":{"type":"memfile"},"control-socket":{"socket-type":"unix","socket-name":"$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket"}}\'') srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.51.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_control.start_srv('DHCP', 'restarted') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0')
def test_control_channel_http_get_config(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-get","service":["dhcp6"],"arguments": {} }')
def test_control_channel_keashell_get_config(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp4 config-get <<<\'\'')
def _setup_server_for_class_cmds(dhcp_version): if dhcp_version == 'v4': srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.50-192.168.50.50') else: srv_control.config_srv_subnet('2001:db8:a::/64', '2001:db8:a::1-2001:db8:a::1') srv_control.config_client_classification(0, 'Client_Class_1') srv_control.open_control_channel() srv_control.agent_control_channel() srv_control.add_hooks('libdhcp_class_cmds.so') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started')
def test_v6_full_disk_testing_pgsql(): # create new ramdisk with assert False, "this test may destroy your setup, remove this line if you really want to run it" full_current_location, pgsql_conf = _move_pgsql_to_ram_disk() misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::500') srv_control.add_hooks('libdhcp_legal_log.so') srv_control.open_control_channel() srv_control.agent_control_channel(world.f_cfg.mgmt_address) # decide what you want to do: # set memfile and log location to created ramdisk # world.dhcp_cfg["lease-database"] = {"type": "memfile", "name": "/tmp/kea_ram_disk/dhcp.leases"} # or set pgsql as lease backend # srv_control.define_temporary_lease_db_backend("postgresql") world.dhcp_cfg["hooks-libraries"][0].update({ "parameters": { "path": "/tmp/kea_ram_disk_pgsql", "base-name": "kea-forensic", 'name': '$(DB_NAME)', 'password': '******', 'type': 'postgresql', 'user': '******' } }) srv_control.add_hooks('libdhcp_lease_cmds.so') # srv_control.print_cfg() srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') _allocate_disk_space(location='/tmp/kea_ram_disk_pgsql/allocate_disk') print(_check_disk()) # we expected that kea will keep working properly, assigning addresses in memory, # turned out that when it can't save lease to memfile/db it return NAK/NoAddrAvail code # even if disk is reported with no empty space left kea is able to save multiple leases # mostly it's 36. # Kea will keep working when it can't write main logs # Kea will keep working when it can't write forensic logs, and log error about this event in main logs generate_leases(leases_count=100, dhcp_version='v6', iapd=0, mac="01:02:0c:03:0a:00") _move_pgsql_back_to_default(full_current_location, pgsql_conf)
def setup_server(**kwargs): misc.test_setup() srv_control.config_srv_subnet('$(EMPTY)', '$(EMPTY)') config_model_args = {} init_cfg = { "interfaces-config": { "interfaces": ["$(SERVER_IFACE)"] }, "lease-database": { "type": "memfile" }, "control-socket": { "socket-type": 'unix', "socket-name": world.f_cfg.run_join('control_socket') } } for param, val in kwargs.items(): if val is None or param == 'check-config': continue if param in ['force-reload']: # these fields are passed to ConfigModel config_model_args['force_reload'] = val continue param = param.replace('_', '-') init_cfg[param] = val cfg = ConfigModel(init_cfg, **config_model_args) srv_control.agent_control_channel( 'host_address', 'host_port', 'socket_name') # TODO: to force enabling ctrl-agent srv_control.build_and_send_config_files('SSH', 'config-file', cfg=cfg.get_dict()) srv_control.start_srv('DHCP', 'started') # check actual configuration if requested if 'check-config' in kwargs and kwargs['check-config']: srv_config = cfg.compare_local_with_server() return cfg, srv_config return cfg
def test_ca_control_channel_build_report(): # let's check minimal configuration misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command='build-report', arguments={}) response = _send_directly_to_ca(cmd) # there is no good way to check specific values, so let's just check that there is there assert "Valgrind" in response["text"] assert "CXX_VERSION" in response["text"] assert "MYSQL_VERSION" in response["text"] assert "Included Hooks" in response["text"]
def test_ca_control_channel_list(): misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::50-2001:db8:1::50') srv_control.open_control_channel() srv_control.agent_control_channel('$(SRV4_ADDR)') srv_control.build_and_send_config_files() srv_control.start_srv('DHCP', 'started') cmd = dict(command="list-commands", service=[], arguments={}) response = _send_directly_to_ca(cmd) for cmd in [ "build-report", "config-get", "config-reload", "config-set", "config-test", "config-write", "list-commands", "shutdown", "version-get" ]: assert cmd in response['arguments']
def _setup_server_for_class_cmds(dhcp_version): if dhcp_version == 'v4': srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.50-192.168.50.50') else: srv_control.config_srv_subnet('2001:db8:a::/64', '2001:db8:a::1-2001:db8:a::1') srv_control.config_client_classification('0', 'Client_Class_1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.add_hooks('$(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_class_cmds.so') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started')
def test_control_channel_keashell_test_config(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') misc.test_setup() srv_control.config_srv_subnet('2001:db8:a::/64', '2001:db8:a::1-2001:db8:a::1') srv_control.config_srv_prefix('2001:db8:1::', '0', '90', '96') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.config_srv_id('LLT', '00:01:00:02:52:7b:a8:f0:08:00:27:58:f1:e8') srv_control.config_srv_opt('sip-server-addr', '2001:db8::1,2001:db8::2') srv_control.config_srv_opt('new-posix-timezone', r'EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00') srv_control.host_reservation_in_subnet('address', '3000::1', '0', 'duid', '00:03:00:01:f6:f5:f4:f3:f2:01') srv_control.generate_config_files() srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp6 config-test <<<\'$(SERVER_CONFIG)\'') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') misc.test_setup() srv_control.config_srv_subnet('2001:db8:a::/64', '2001:db8:a::1-2001:db8:a::1') srv_control.config_srv_prefix('2001:db8:1::', '0', '90', '96') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.config_srv_id('LLT', '00:01:00:02:52:7b:a8:f0:08:00:27:58:f1:e8') srv_control.config_srv_opt('sip-server-addr', '2001:db8::1,2001:db8::2') srv_control.config_srv_opt('new-posix-timezone', r'EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00') # WRONG ADDRESS RESERVATION srv_control.host_reservation_in_subnet('address', '192.168.0.5', '0', 'duid', '00:03:00:01:f6:f5:f4:f3:f2:01') srv_control.generate_config_files() srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp6 config-test <<<\'$(SERVER_CONFIG)\'') srv_msg.forge_sleep('5', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1')
def test_control_channel_http_test_config(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.add_ddns_server('127.0.0.1', '53001') srv_control.add_ddns_server_options('enable-updates', 'true') srv_control.add_ddns_server_options('qualifying-suffix', 'my.domain.com') srv_control.host_reservation_in_subnet('hostname', 'reserved-name', '0', 'hw-address', 'ff:01:02:03:ff:04') srv_control.host_reservation_in_subnet_add_value('0', '0', 'address', '192.168.50.5') srv_control.generate_config_files() srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-test","service": ["dhcp4"], "arguments": $(SERVER_CONFIG) }') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.add_ddns_server('127.0.0.1', '53001') srv_control.add_ddns_server_options('enable-updates', 'true') srv_control.add_ddns_server_options('qualifying-suffix', 'my.domain.com') srv_control.host_reservation_in_subnet('hostname', 'reserved-name', '0', 'hw-address', 'ff:01:02:03:ff:04') srv_control.host_reservation_in_subnet_add_value('0', '0', 'address', '3000::1') srv_control.generate_config_files() srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-test","service": ["dhcp4"], "arguments": $(SERVER_CONFIG) }') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0')
def test_control_channel_http_config_write(): misc.test_setup() srv_control.config_srv_subnet('3000::/64', '3000::1-3000::f') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "list-commands", "service": ["dhcp6"],"arguments": {} }') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-write", "service": ["dhcp6"],"arguments": {"filename": "config-modified-2017-03-15.json"} } #TODO probably confing file location/name') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1') misc.test_setup() srv_control.config_srv_subnet('2001:db8:1::/64', '2001:db8:1::1-2001:db8:1::1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.generate_config_files() srv_msg.send_through_socket_server_site('$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket', '{"command": "config-set", "service": ["dhcp6"],"arguments": $(SERVER_CONFIG) }') srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '2001:db8:1::1') srv_control.start_srv('DHCP', 'restarted') misc.test_procedure() srv_msg.client_sets_value('Client', 'DUID', '00:03:00:01:66:55:44:33:22:11') srv_msg.client_does_include('Client', None, 'client-id') srv_msg.client_does_include('Client', None, 'IA_Address') srv_msg.client_does_include('Client', None, 'IA-NA') srv_msg.client_send_msg('SOLICIT') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ADVERTISE') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '2') srv_msg.response_check_include_option('Response', None, '3') srv_msg.response_check_option_content('Response', '3', None, 'sub-option', '5') srv_msg.response_check_suboption_content('Response', '5', '3', None, 'addr', '3000::1')
def test_control_channel_keashell_test_config(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('127.0.0.1', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.add_ddns_server('127.0.0.1', '53001') srv_control.add_ddns_server_options('enable-updates', 'true') srv_control.add_ddns_server_options('qualifying-suffix', 'my.domain.com') srv_control.host_reservation_in_subnet('hostname', 'reserved-name', '0', 'hw-address', 'ff:01:02:03:ff:04') srv_control.host_reservation_in_subnet_add_value('0', '0', 'address', '192.168.50.5') srv_control.generate_config_files() srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp4 config-test <<<\'$(SERVER_CONFIG)\'') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket_ANOTHER_ONE') srv_control.add_ddns_server('127.0.0.1', '53001') srv_control.add_ddns_server_options('enable-updates', 'true') srv_control.add_ddns_server_options('qualifying-suffix', 'my.domain.com') srv_control.host_reservation_in_subnet('hostname', 'reserved-name', '0', 'hw-address', 'ff:01:02:03:ff:04') srv_control.host_reservation_in_subnet_add_value('0', '0', 'address', '3000::1') srv_control.generate_config_files() srv_msg.execute_shell_with_args('python', '$(SOFTWARE_INSTALL_DIR)/sbin/kea-shell', '--host 127.0.0.1 --port 8000 --service dhcp4 config-set <<<\'$(SERVER_CONFIG)\'') srv_msg.forge_sleep('$(SLEEP_TIME_2)', 'seconds') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0')
def test_control_channel_http_config_write(): misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.1') srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "list-commands", "service": ["dhcp4"],"arguments": {} }') srv_msg.send_through_http('$(SRV4_ADDR)', '8000', '{"command": "config-write", "service": ["dhcp4"],"arguments": {"filename": "config-modified-2017-03-15.json"} } #TODO probably confing file location/name') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') misc.test_setup() srv_control.config_srv_subnet('192.168.51.0/24', '192.168.51.1-192.168.51.1') srv_control.agent_control_channel('$(SRV4_ADDR)', '8000', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.generate_config_files() srv_msg.send_through_socket_server_site('$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket', '{"command": "config-set", "service": ["dhcp4"],"arguments": $(SERVER_CONFIG) }') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.51.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_control.start_srv('DHCP', 'restarted') misc.test_procedure() srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0')
def test_v4_all_hooks_test_cooperation(): srv_msg.remove_file_from_server('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt') misc.test_setup() srv_control.config_srv_subnet('192.168.50.0/24', '192.168.50.1-192.168.50.10') # flex id srv_control.host_reservation_in_subnet('hostname', 'reserved-hostname', '0', 'flex-id', '\'docsis3.0\'') srv_control.host_reservation_in_subnet_add_value('0', '0', 'address', '192.168.50.10') srv_control.add_line('"host-reservation-identifiers": [ "flex-id","hw-address" ]') srv_control.add_hooks('$(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_flex_id.so') srv_control.add_parameter_to_hook('1', 'identifier-expression', 'option[60].hex') # legal log srv_control.add_hooks('$(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_legal_log.so') srv_control.add_hooks('$(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_lease_cmds.so') # Add hooks library located $(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_host_cmds.so. # Add hooks library located $(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_stat_cmds.so. # Add hooks library located $(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_subnet_cmds.so. # Add hooks library located $(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_host_cache.so. # # Add High-Availability hook library located $(SOFTWARE_INSTALL_DIR)/lib/kea/hooks/libdhcp_ha.so. # To HA hook configuration add this-server-name with value: "server1" # To HA hook configuration add mode with value: "load-balancing" # To HA hook configuration add heartbeat-delay with value: 1000 # To HA hook configuration add max-response-delay with value: 1001 # To HA hook configuration add max-unacked-clients with value: 0 # To HA hook configuration add max-ack-delay with value: 0 # # To HA hook configuration add peers with value: {"name":"server1","url":"http://$(MGMT_ADDRESS):8080/","role":"primary","auto-failover":true} # To HA hook configuration add peers with value: {"name":"server2","url":"http://$(MGMT_ADDRESS_2):8080/","role":"secondary","auto-failover":true} srv_control.open_control_channel('unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.agent_control_channel('$(MGMT_ADDRESS)', '8080', 'unix', '$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket') srv_control.build_and_send_config_files('SSH', 'config-file') srv_control.start_srv('DHCP', 'started') # Using UNIX socket on server in path $(SOFTWARE_INSTALL_DIR)/var/kea/control_socket send {"command": "list-commands","arguments": {}} # JSON response in arguments MUST include value: build-report # JSON response in arguments MUST include value: cache-clear # JSON response in arguments MUST include value: cache-flush # JSON response in arguments MUST include value: cache-get # JSON response in arguments MUST include value: cache-insert # JSON response in arguments MUST include value: cache-load # JSON response in arguments MUST include value: cache-remove # JSON response in arguments MUST include value: cache-write # JSON response in arguments MUST include value: config-get # JSON response in arguments MUST include value: config-reload # JSON response in arguments MUST include value: config-set # JSON response in arguments MUST include value: config-test # JSON response in arguments MUST include value: config-write # JSON response in arguments MUST include value: dhcp-disable # JSON response in arguments MUST include value: dhcp-enable # JSON response in arguments MUST include value: ha-continue # JSON response in arguments MUST include value: ha-heartbeat # JSON response in arguments MUST include value: ha-scopes # JSON response in arguments MUST include value: ha-sync # JSON response in arguments MUST include value: lease4-add # JSON response in arguments MUST include value: lease4-del # JSON response in arguments MUST include value: lease4-get # JSON response in arguments MUST include value: lease4-get-all # JSON response in arguments MUST include value: lease4-get-page # JSON response in arguments MUST include value: lease4-update # JSON response in arguments MUST include value: lease4-wipe # JSON response in arguments MUST include value: lease6-add # JSON response in arguments MUST include value: lease6-del # JSON response in arguments MUST include value: lease6-get # JSON response in arguments MUST include value: lease6-get-all # JSON response in arguments MUST include value: lease6-get-page # JSON response in arguments MUST include value: lease6-update # JSON response in arguments MUST include value: lease6-wipe # JSON response in arguments MUST include value: leases-reclaim # JSON response in arguments MUST include value: libreload # JSON response in arguments MUST include value: list-commands # JSON response in arguments MUST include value: network4-add # JSON response in arguments MUST include value: network4-del # JSON response in arguments MUST include value: network4-get # JSON response in arguments MUST include value: network4-list # JSON response in arguments MUST include value: network4-subnet-add # JSON response in arguments MUST include value: network4-subnet-del # JSON response in arguments MUST include value: network6-add # JSON response in arguments MUST include value: network6-del # JSON response in arguments MUST include value: network6-get # JSON response in arguments MUST include value: network6-list # JSON response in arguments MUST include value: network6-subnet-add # JSON response in arguments MUST include value: network6-subnet-del # JSON response in arguments MUST include value: reservation-add # JSON response in arguments MUST include value: reservation-del # JSON response in arguments MUST include value: reservation-get # JSON response in arguments MUST include value: shutdown # JSON response in arguments MUST include value: stat-lease4-get # JSON response in arguments MUST include value: stat-lease6-get # JSON response in arguments MUST include value: statistic-get # JSON response in arguments MUST include value: statistic-get-all # JSON response in arguments MUST include value: statistic-remove # JSON response in arguments MUST include value: statistic-remove-all # JSON response in arguments MUST include value: statistic-reset # JSON response in arguments MUST include value: statistic-reset-all # JSON response in arguments MUST include value: subnet4-add # JSON response in arguments MUST include value: subnet4-del # JSON response in arguments MUST include value: subnet4-get # JSON response in arguments MUST include value: subnet4-list # JSON response in arguments MUST include value: subnet6-add # JSON response in arguments MUST include value: subnet6-del # JSON response in arguments MUST include value: subnet6-get # JSON response in arguments MUST include value: subnet6-list # JSON response in arguments MUST include value: version-get # ha command # Using existing HTTP $(MGMT_ADDRESS):8080 connection send: {"command": "ha-heartbeat","service":["dhcp4"],"arguments": {} } # JSON response in arguments MUST include value: "state": "partner-down" # flex-id misc.test_procedure() srv_msg.client_does_include_with_value('vendor_class_id', 'docsis3.0') srv_msg.client_sets_value('Client', 'chaddr', 'ff:01:02:03:ff:04') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.10') # legal log misc.test_procedure() srv_msg.client_sets_value('Client', 'chaddr', 'ff:01:02:03:ff:04') srv_msg.client_does_include_with_value('client_id', '00010203040506') srv_msg.client_requests_option('1') srv_msg.client_send_msg('DISCOVER') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'OFFER') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '54') srv_msg.response_check_include_option('Response', None, '61') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.response_check_option_content('Response', '61', None, 'value', '00010203040506') misc.test_procedure() srv_msg.client_does_include_with_value('client_id', '00010203040506') srv_msg.client_sets_value('Client', 'chaddr', 'ff:01:02:03:ff:04') srv_msg.client_copy_option('server_id') srv_msg.client_does_include_with_value('requested_addr', '192.168.50.1') srv_msg.client_requests_option('1') srv_msg.client_send_msg('REQUEST') misc.pass_criteria() srv_msg.send_wait_for_message('MUST', None, 'ACK') srv_msg.response_check_content('Response', None, 'yiaddr', '192.168.50.1') srv_msg.response_check_include_option('Response', None, '1') srv_msg.response_check_include_option('Response', None, '54') srv_msg.response_check_include_option('Response', None, '61') srv_msg.response_check_option_content('Response', '1', None, 'value', '255.255.255.0') srv_msg.response_check_option_content('Response', '61', None, 'value', '00010203040506') srv_msg.copy_remote('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt') srv_msg.file_contains_line('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt', None, 'Address: 192.168.50.1 has been assigned for 1 hrs 6 mins 40') srv_msg.file_contains_line('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt', None, 'to a device with hardware address: hwtype=1 ff:01:02:03:ff:04, client-id: 00:01:02:03:04:05:06') # lease commands srv_msg.send_through_socket_server_site('$(SOFTWARE_INSTALL_DIR)/var/kea/control_socket', '{"command":"lease4-add","arguments":{"ip-address": "192.168.50.10","hostname": "newhostname.example.org","hw-address": "1a:1b:1c:1d:1e:1f","subnet-id":1,"valid-lft":500000}}') srv_msg.file_contains_line('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt', None, 'Administrator added a lease of address: 192.168.50.10 to a device with hardware address: 1a:1b:1c:1d:1e:1f for 5 days 18 hrs 53 mins 20 secs') # # Test Procedure: # Client sets chaddr value to 1a:1b:1c:1d:1e:1f. # Client sets ciaddr value to 192.168.50.10. # Client copies server_id option from received message. # Client sends REQUEST message. # # Pass Criteria: # Server MUST respond with ACK message. # Response MUST contain yiaddr 192.168.50.10. # Response MUST include option 54. # Response option 54 MUST contain value $(SRV4_ADDR). srv_msg.copy_remote('$(SOFTWARE_INSTALL_DIR)/var/kea/kea-legal*.txt')