Exemple #1
0
    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")
Exemple #2
0
    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")
Exemple #3
0
    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),
                )
Exemple #4
0
    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')
Exemple #5
0
    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')
Exemple #6
0
    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',
                                           )
Exemple #7
0
    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',
        )
Exemple #8
0
    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',
                                           )
Exemple #9
0
    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',
        )
Exemple #10
0
    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',
                                           )
Exemple #12
0
    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',
        )
Exemple #13
0
    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'
            )
Exemple #15
0
    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,
        )
Exemple #16
0
    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,
                                           )
Exemple #17
0
    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',
        )
Exemple #18
0
    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,
        )
Exemple #19
0
    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)
Exemple #20
0
    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,
        )
Exemple #21
0
    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"})
Exemple #22
0
    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")
Exemple #23
0
    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"
            )
Exemple #26
0
    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")
Exemple #27
0
    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)
Exemple #28
0
    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")
Exemple #29
0
    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"
            )
Exemple #30
0
    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"})
Exemple #31
0
    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"
            )
Exemple #32
0
    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"
            )