def test_if_marathon_apps_are_resolved(self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from MesosDNS and Mesos mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[]) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Set non-standard socket for the applicaiton new_apps = { "apps": [ SCHEDULER_APP_ALWAYSTHERE_DIFFERENTPORT, ] } mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data=new_apps) # Check if the location now resolves correctly to the new app socket generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001")
def test_if_webui_url_by_fwrk_id_has_prio_over_webui_url_by_fwrk_name( self, master_ar_process_pertest, mocker, valid_user_header): # This one is tricky, we need to create a state-summary entry that has # a framework entry with "name" field equal to the "id" field of a # different entry # Remove the data from Marathon mock mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) # Remove the data from MesosDNS mock mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Fabricate state-summary data needed for the tests fwrk_a = framework_from_template(SCHEDULER_FWRK_ALWAYSTHERE_ID, "scheduler-alwaysthere", "http://127.0.0.15:16001") fwrk_b = framework_from_template( "0535dd9a-2644-4945-a365-6fe0145f103f-0000", SCHEDULER_FWRK_ALWAYSTHERE_ID, "http://127.0.0.1:16000") mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[fwrk_a, fwrk_b]) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/{}/foo/bar/'.format(SCHEDULER_FWRK_ALWAYSTHERE_ID), "http://127.0.0.15:16001")
def test_mesos_leader_reresolve_in_proxy_pass( self, nginx_class, valid_user_header, dns_server_mock, path, dest_port, ): # Change the TTL of `leader.mesos.` entry dns_server_mock.set_dns_entry( 'leader.mesos.', ip='127.0.0.2', ttl=self.LONG_TTL) ar = nginx_class(upstream_mesos="http://leader.mesos:5050") with GuardedSubprocess(ar): generic_correct_upstream_dest_test( ar, valid_user_header, path, "http://127.0.0.2:{}".format(dest_port), ) # Update the `leader.mesos.` entry with new value dns_server_mock.set_dns_entry( 'leader.mesos.', ip='127.0.0.3', ttl=self.LONG_TTL) # This should be equal to 1.5 times the value of `valid=` DNS TTL # override in `resolver` config option -> 5s * 1.5 = 7.5s time.sleep(5 * 1.5) generic_correct_upstream_dest_test( ar, valid_user_header, path, "http://127.0.0.3:{}".format(dest_port), )
def test_if_mesos_dns_subrequest_does_not_pass_auth_header_to_mesos_dns( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Mesos and Marathon mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_NOWEBUI]) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=SCHEDULER_SRV_ALWAYSTHERE_DIFFERENTPORT) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='record_requests') generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001") r_reqs = mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='get_recorded_requests') assert len(r_reqs) == 1 header_is_absent(r_reqs[0]['headers'], 'Authorization')
def test_if_mesos_dns_subrequest_does_not_pass_auth_header_to_mesos_dns( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Mesos and Marathon mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_NOWEBUI]) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=SCHEDULER_SRV_ALWAYSTHERE_DIFFERENTPORT) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='record_requests') generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" ) r_reqs = mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='get_recorded_requests') assert len(r_reqs) == 1 header_is_absent(r_reqs[0]['headers'], 'Authorization')
def test_if_request_is_sent_to_correct_upstream(self, agent_ar_process, valid_user_header): generic_correct_upstream_dest_test(agent_ar_process, valid_user_header, '/system/v1/logs/v1/foo/bar', 'http:///run/dcos/dcos-log.sock', )
def test_if_request_is_sent_to_the_current_marathon_leader( self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test( master_ar_process, valid_user_header, '/system/v1/leader/marathon/foo/bar', 'http://127.0.0.2:80', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test(master_ar_process, valid_user_header, '/system/health/v1/foo/bar', 'http://127.0.0.1:1050', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test( master_ar_process, valid_user_header, '/exhibitor/some/path', 'http://127.0.0.1:8181', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test( master_ar_process, valid_user_header, '/system/v1/metrics/foo/bar', 'http:///run/dcos/dcos-metrics-master.sock', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test(master_ar_process, valid_user_header, '/system/health/v1/foo/bar', 'http://127.0.0.1:1050', )
def test_if_request_is_sent_to_correct_upstream(self, agent_ar_process, valid_user_header): generic_correct_upstream_dest_test( agent_ar_process, valid_user_header, '/system/v1/logs/v1/foo/bar', 'http:///run/dcos/dcos-log.sock', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header): generic_correct_upstream_dest_test( master_ar_process, valid_user_header, agent_prefix + "/foo/bar", 'http://127.0.0.2:15001', )
def test_if_webui_url_path_is_normalized( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Marathon mock mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) # Remove the data from MesosDNS mock mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Test webui_url entry withouth trailing slash: fwrk = framework_from_template( SCHEDULER_FWRK_ALWAYSTHERE_ID, "scheduler-alwaysthere", "http://127.0.0.15:16001") mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[fwrk]) generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" ) generic_correct_upstream_request_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', '/foo/bar/', http_ver='websockets' ) # Test webui_url entry with trailing slash: fwrk = framework_from_template( SCHEDULER_FWRK_ALWAYSTHERE_ID, "scheduler-alwaysthere", "http://127.0.0.15:16001/") mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[fwrk]) generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" ) generic_correct_upstream_request_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', '/foo/bar/', http_ver='websockets' )
def test_if_request_is_sent_to_correct_upstream(self, agent_ar_process_perclass, valid_user_header, path, expected_upstream): generic_correct_upstream_dest_test( agent_ar_process_perclass, valid_user_header, path, expected_upstream, )
def test_if_request_is_sent_to_correct_upstream( self, master_ar_process_perclass, valid_user_header, path, expected_upstream): generic_correct_upstream_dest_test(master_ar_process_perclass, valid_user_header, path, expected_upstream, )
def test_if_request_is_sent_to_the_current_mesos_leader( self, master_ar_process, valid_user_header): # FIXME: using MesosDNS `leader.mesos` alias makes things hard to test. # Dropping in in favour of cache+API call would improve reliability as # well. So no "changing the leader and testing results tests for now" generic_correct_upstream_dest_test( master_ar_process, valid_user_header, '/system/v1/leader/mesos/foo/bar', 'http://127.0.0.2:80', )
def test_if_request_is_sent_to_correct_upstream(self, master_ar_process, valid_user_header, agent, endpoint, prefix): # FIXME - these are very simple tests for now, need to think how to test # streaming api better. ATM we only test if HTTP is set to 1.1 for streaming # stuff. uri_path = '/system/v1/agent/{}{}'.format(agent, prefix) generic_correct_upstream_dest_test( master_ar_process, valid_user_header, uri_path, endpoint, )
def test_if_leader_is_local_state_is_handled(self, nginx_class, valid_user_header): ar = nginx_class() path_sent = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' path_expected = '/foo/bar?a1=GET+param&a2=foobarism' with GuardedSubprocess(ar): generic_correct_upstream_dest_test(ar, valid_user_header, path_sent, "http://127.0.0.1:15055") generic_correct_upstream_request_test(ar, valid_user_header, path_sent, path_expected) generic_upstream_headers_verify_test(ar, valid_user_header, path_sent)
def test_if_request_is_sent_to_correct_upstream(self, agent_ar_process_perclass, valid_user_header, path, expected_upstream, vhost): req_headers = copy.deepcopy(valid_user_header) if vhost is not None: req_headers["Host"] = vhost generic_correct_upstream_dest_test( agent_ar_process_perclass, req_headers, path, expected_upstream, )
def test_if_leader_is_nonlocal_state_is_handled(self, nginx_class, valid_user_header, dns_server_mock): ar = nginx_class() path_sent = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' path_expected = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' dns_server_mock.set_dns_entry('leader.mesos.', ip='127.0.0.3') with GuardedSubprocess(ar): generic_correct_upstream_dest_test(ar, valid_user_header, path_sent, "http://127.0.0.3:80") generic_correct_upstream_request_test(ar, valid_user_header, path_sent, path_expected) generic_upstream_headers_verify_test( ar, valid_user_header, path_sent, assert_headers={"DCOS-Forwarded": "true"})
def test_if_webui_url_has_prio_over_mesos_dns(self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Marathon mock mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) # Set a different port for webui-based framework data: mocker.send_command( endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_DIFFERENTPORT]) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001")
def test_if_webui_url_has_prio_over_mesos_dns( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Marathon mock mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) # Set a different port for webui-based framework data: mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_DIFFERENTPORT]) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" )
def test_if_marathon_apps_have_prio_over_webui_url( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from MesosDNS mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Make svcapps resolve the app upstream to a different address, # framework data implicitly has default port (127.0.0.1:16000) new_apps = {"apps": [SCHEDULER_APP_ALWAYSTHERE_DIFFERENTPORT, ]} mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data=new_apps) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" )
def test_if_marathon_apps_have_prio_over_mesos_dns( self, master_ar_process_pertest, mocker, valid_user_header): # Disable resolving service data using webui mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_NOWEBUI]) # Make svcapps resolve the app upstream to a different address, # framework data implicitly has default port (127.0.0.1:16000) new_apps = {"apps": [SCHEDULER_APP_ALWAYSTHERE_DIFFERENTPORT, ]} mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data=new_apps) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" )
def test_if_mesos_dns_resolving_works(self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from Mesos and Marathon mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_NOWEBUI]) # Set non-standard port for the framework: mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=SCHEDULER_SRV_ALWAYSTHERE_DIFFERENTPORT) # Check if the location now resolves correctly to the new framework # socket generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001")
def test_if_leader_is_local_state_is_handled( self, nginx_class, valid_user_header): ar = nginx_class() path_sent = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' path_expected = '/foo/bar?a1=GET+param&a2=foobarism' with GuardedSubprocess(ar): generic_correct_upstream_dest_test( ar, valid_user_header, path_sent, "http://127.0.0.1:15055") generic_correct_upstream_request_test( ar, valid_user_header, path_sent, path_expected) generic_upstream_headers_verify_test( ar, valid_user_header, path_sent)
def test_if_webui_url_is_resolved_using_framework_id( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from MesosDNS and Marathon mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Set non-standard socket for the framework mocker.send_command( endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_DIFFERENTPORT]) # Check if the location now resolves correctly to the new framework # socket generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/{}/foo/bar/'.format(SCHEDULER_FWRK_ALWAYSTHERE_ID), "http://127.0.0.15:16001")
def test_if_marathon_apps_are_resolved( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from MesosDNS and Mesos mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[]) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Set non-standard socket for the applicaiton new_apps = {"apps": [SCHEDULER_APP_ALWAYSTHERE_DIFFERENTPORT, ]} mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data=new_apps) # Check if the location now resolves correctly to the new app socket generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" )
def test_if_leader_is_nonlocal_state_is_handled( self, nginx_class, valid_user_header, dns_server_mock): ar = nginx_class() path_sent = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' path_expected = '/dcos-history-service/foo/bar?a1=GET+param&a2=foobarism' dns_server_mock.set_dns_entry('leader.mesos.', ip='127.0.0.3') with GuardedSubprocess(ar): generic_correct_upstream_dest_test( ar, valid_user_header, path_sent, "http://127.0.0.3:80") generic_correct_upstream_request_test( ar, valid_user_header, path_sent, path_expected) generic_upstream_headers_verify_test( ar, valid_user_header, path_sent, assert_headers={"DCOS-Forwarded": "true"})
def test_if_webui_url_is_resolved_using_framework_name( self, master_ar_process_pertest, mocker, valid_user_header): # Remove the data from MesosDNS and Marathon mocks w.r.t. resolved service mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Set non-standard port for the framework: mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[SCHEDULER_FWRK_ALWAYSTHERE_DIFFERENTPORT]) # Check if the location now resolves correctly to the new framework # socket generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/scheduler-alwaysthere/foo/bar/', "http://127.0.0.15:16001" )
def test_if_webui_url_by_fwrk_id_has_prio_over_webui_url_by_fwrk_name( self, master_ar_process_pertest, mocker, valid_user_header): # This one is tricky, we need to create a state-summary entry that has # a framework entry with "name" field equal to the "id" field of a # different entry # Remove the data from Marathon mock mocker.send_command(endpoint_id='http://127.0.0.1:8080', func_name='set_apps_response', aux_data={"apps": []}) # Remove the data from MesosDNS mock mocker.send_command(endpoint_id='http://127.0.0.1:8123', func_name='set_srv_response', aux_data=EMPTY_SRV) # Fabricate state-summary data needed for the tests fwrk_a = framework_from_template( SCHEDULER_FWRK_ALWAYSTHERE_ID, "scheduler-alwaysthere", "http://127.0.0.15:16001") fwrk_b = framework_from_template( "0535dd9a-2644-4945-a365-6fe0145f103f-0000", SCHEDULER_FWRK_ALWAYSTHERE_ID, "http://127.0.0.1:16000") mocker.send_command(endpoint_id='http://127.0.0.2:5050', func_name='set_frameworks_response', aux_data=[fwrk_a, fwrk_b]) # Check that svcapps resolve to different port generic_correct_upstream_dest_test( master_ar_process_pertest, valid_user_header, '/service/{}/foo/bar/'.format(SCHEDULER_FWRK_ALWAYSTHERE_ID), "http://127.0.0.15:16001" )