コード例 #1
0
    def __init__(self,
                 logger: logging.Logger,
                 yaml_file: str,
                 enable_cache=True) -> None:
        self.test_dir = os.path.join(
            os.path.dirname(
                os.environ.get('PYTEST_CURRENT_TEST').split("::")[0]),
            "test_cache_data")

        self.cache: Optional[Cache] = None

        if enable_cache:
            self.cache = Cache(logger)

        # This is a brutal hack: we load all the YAML, store it as objects, then
        # build IR and econf from the re-serialized YAML from these resources.
        # The reason is that it's kind of the only way we can apply deltas in
        # a meaningful way.
        self.resources: Dict[str, Any] = {}

        # Load the initial YAML.
        self.apply_yaml(yaml_file, allow_updates=False)
        self.secret_handler = NullSecretHandler(logger, "/tmp/secrets/src",
                                                "/tmp/secrets/cache", "0")

        # Save builds to make this simpler to call.
        self.builds: List[Tuple[IR, EnvoyConfig]] = []
コード例 #2
0
def test_knative_counters():
    aconf = Config()
    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(knative_ingress_example, k8s=True)
    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")
    ir = IR(aconf, secret_handler=secret_handler)
    feats = ir.features()

    assert feats['knative_ingress_count'] == 1, f"Expected a Knative ingress, did not find one"
    assert feats['cluster_ingress_count'] == 0, f"Expected no Knative cluster ingresses, found at least one"
コード例 #3
0
def _test_errorresponse(yaml, expectations, expect_fail=False):
    aconf = Config()

    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf,
            file_checker=lambda path: True,
            secret_handler=secret_handler)

    error_response = IRErrorResponse(
        ir, aconf, ir.ambassador_module.get('error_response_overrides', None),
        ir.ambassador_module)

    error_response.setup(ir, aconf)
    if aconf.errors:
        print("errors: %s" % repr(aconf.errors))

    ir_conf = error_response.config()
    if expect_fail:
        assert ir_conf is None
        return
    assert ir_conf

    # There should be no default body format override
    body_format = ir_conf.get('body_format', None)
    assert body_format is None

    mappers = ir_conf.get('mappers', None)
    assert mappers
    assert len(mappers) == len(expectations), \
            f"unexpected len(mappers) {len(expectations)} != len(expectations) {len(expectations)}"

    for i in range(len(expectations)):
        expected_filter, expected_body_format_override = expectations[i]
        m = mappers[i]

        print(
            "checking with expected_body_format_override %s and expected_filter %s"
            % (expected_body_format_override, expected_filter))
        print("checking m: ", m)
        actual_filter = m['filter']
        assert m['filter'] == expected_filter
        if expected_body_format_override:
            actual_body_format_override = m['body_format_override']
            assert actual_body_format_override == expected_body_format_override
コード例 #4
0
ファイル: test_irauth.py プロジェクト: ppeble/ambassador
def _get_envoy_config(yaml):
    aconf = Config()
    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf, file_checker=lambda path: True, secret_handler=secret_handler)

    assert ir

    return EnvoyConfig.generate(ir, "V2")
コード例 #5
0
def _get_envoy_config(yaml, version='V3'):
    aconf = Config()
    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(default_listener_manifests() + yaml, k8s=True)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf, file_checker=lambda path: True, secret_handler=secret_handler)

    assert ir

    return EnvoyConfig.generate(ir, version)
コード例 #6
0
def config(config_dir_path: Parameter.REQUIRED,
           output_json_path: Parameter.REQUIRED,
           *,
           debug=False,
           debug_scout=False,
           check=False,
           k8s=False,
           ir=None,
           aconf=None,
           exit_on_error=False):
    """
    Generate an Envoy configuration

    :param config_dir_path: Configuration directory to scan for Ambassador YAML files
    :param output_json_path: Path to output envoy.json
    :param debug: If set, generate debugging output
    :param debug_scout: If set, generate debugging output when talking to Scout
    :param check: If set, generate configuration only if it doesn't already exist
    :param k8s: If set, assume configuration files are annotated K8s manifests
    :param exit_on_error: If set, will exit with status 1 on any configuration error
    :param ir: Pathname to which to dump the IR (not dumped if not present)
    :param aconf: Pathname to which to dump the aconf (not dumped if not present)
    """

    if debug:
        logger.setLevel(logging.DEBUG)

    if debug_scout:
        logging.getLogger('ambassador.scout').setLevel(logging.DEBUG)

    try:
        logger.debug("CHECK MODE  %s" % check)
        logger.debug("CONFIG DIR  %s" % config_dir_path)
        logger.debug("OUTPUT PATH %s" % output_json_path)

        dump_aconf: Optional[str] = aconf
        dump_ir: Optional[str] = ir

        # Bypass the existence check...
        output_exists = False

        if check:
            # ...oh no wait, they explicitly asked for the existence check!
            # Assume that the file exists (ie, we'll do nothing) unless we
            # determine otherwise.
            output_exists = True

            try:
                parse_json(open(output_json_path, "r").read())
            except FileNotFoundError:
                logger.debug("output file does not exist")
                output_exists = False
            except OSError:
                logger.warning("output file is not sane?")
                output_exists = False
            except json.decoder.JSONDecodeError:
                logger.warning("output file is not valid JSON")
                output_exists = False

            logger.info("Output file %s" %
                        ("exists" if output_exists else "does not exist"))

        rc = RichStatus.fromError("impossible error")

        if not output_exists:
            # Either we didn't need to check, or the check didn't turn up
            # a valid config. Regenerate.
            logger.info("Generating new Envoy configuration...")

            aconf = Config()
            fetcher = ResourceFetcher(logger, aconf)
            fetcher.load_from_filesystem(config_dir_path, k8s=k8s)
            aconf.load_all(fetcher.sorted())

            if dump_aconf:
                with open(dump_aconf, "w") as output:
                    output.write(aconf.as_json())
                    output.write("\n")

            # If exit_on_error is set, log _errors and exit with status 1
            if exit_on_error and aconf.errors:
                raise Exception("errors in: {0}".format(', '.join(
                    aconf.errors.keys())))

            secret_handler = NullSecretHandler(logger, config_dir_path,
                                               config_dir_path, "0")

            ir = IR(aconf,
                    file_checker=file_checker,
                    secret_handler=secret_handler)

            if dump_ir:
                with open(dump_ir, "w") as output:
                    output.write(ir.as_json())
                    output.write("\n")

            # clize considers kwargs with False for default value as flags,
            # resulting in the logic below.
            # https://clize.readthedocs.io/en/stable/basics.html#accepting-flags

            logger.info("Writing envoy V2 configuration")
            v2config = V2Config(ir)
            rc = RichStatus.OK(msg="huh_v2")

            if rc:
                with open(output_json_path, "w") as output:
                    output.write(v2config.as_json())
                    output.write("\n")
            else:
                logger.error("Could not generate new Envoy configuration: %s" %
                             rc.error)

        scout = Scout()
        result = scout.report(action="config", mode="cli")
        show_notices(result)
    except Exception as e:
        handle_exception("EXCEPTION from config",
                         e,
                         config_dir_path=config_dir_path,
                         output_json_path=output_json_path)

        # This is fatal.
        sys.exit(1)
コード例 #7
0
def dump(config_dir_path: Parameter.REQUIRED,
         *,
         secret_dir_path=None,
         watt=False,
         debug=False,
         debug_scout=False,
         k8s=False,
         recurse=False,
         stats=False,
         nopretty=False,
         everything=False,
         aconf=False,
         ir=False,
         v2=False,
         v3=False,
         diag=False,
         features=False,
         profile=False):
    """
    Dump various forms of an Ambassador configuration for debugging

    Use --aconf, --ir, and --envoy to control what gets dumped. If none are requested, the IR
    will be dumped.

    :param config_dir_path: Configuration directory to scan for Ambassador YAML files
    :param secret_dir_path: Directory into which to save secrets
    :param watt: If set, input must be a WATT snapshot
    :param debug: If set, generate debugging output
    :param debug_scout: If set, generate debugging output
    :param k8s: If set, assume configuration files are annotated K8s manifests
    :param recurse: If set, recurse into directories below config_dir_path
    :param stats: If set, dump statistics to stderr
    :param nopretty: If set, do not pretty print the dumped JSON
    :param aconf: If set, dump the Ambassador config
    :param ir: If set, dump the IR
    :param v2: If set, dump the Envoy V2 config
    :param v3: If set, dump the Envoy V3 config
    :param diag: If set, dump the Diagnostics overview
    :param everything: If set, dump everything
    :param features: If set, dump the feature set
    :param profile: If set, profile with the cProfile module
    """

    if not secret_dir_path:
        secret_dir_path = "/tmp/cli-secrets"

        if not os.path.isdir(secret_dir_path):
            secret_dir_path = os.path.dirname(secret_dir_path)

    if debug:
        logger.setLevel(logging.DEBUG)

    if debug_scout:
        logging.getLogger('ambassador.scout').setLevel(logging.DEBUG)

    if everything:
        aconf = True
        ir = True
        v2 = True
        v3 = True
        diag = True
        features = True
    elif not (aconf or ir or v2 or v3 or diag or features):
        aconf = True
        ir = True
        v2 = True
        v3 = False
        diag = False
        features = False

    dump_aconf = aconf
    dump_ir = ir
    dump_v2 = v2
    dump_v3 = v3
    dump_diag = diag
    dump_features = features

    od = {}
    diagconfig: Optional[EnvoyConfig] = None

    _profile: Optional[cProfile.Profile] = None
    _rc = 0

    if profile:
        _profile = cProfile.Profile()
        _profile.enable()

    try:
        total_timer = Timer("total")
        total_timer.start()

        fetch_timer = Timer("fetch resources")
        with fetch_timer:
            aconf = Config()

            fetcher = ResourceFetcher(logger, aconf)

            if watt:
                fetcher.parse_watt(open(config_dir_path, "r").read())
            else:
                fetcher.load_from_filesystem(config_dir_path,
                                             k8s=k8s,
                                             recurse=True)

        load_timer = Timer("load fetched resources")
        with load_timer:
            aconf.load_all(fetcher.sorted())

        # aconf.post_error("Error from string, boo yah")
        # aconf.post_error(RichStatus.fromError("Error from RichStatus"))

        irgen_timer = Timer("ir generation")
        with irgen_timer:
            secret_handler = NullSecretHandler(logger, config_dir_path,
                                               secret_dir_path, "0")

            ir = IR(aconf,
                    file_checker=file_checker,
                    secret_handler=secret_handler)

        aconf_timer = Timer("aconf")
        with aconf_timer:
            if dump_aconf:
                od['aconf'] = aconf.as_dict()

        ir_timer = Timer("ir")
        with ir_timer:
            if dump_ir:
                od['ir'] = ir.as_dict()

        v2_timer = Timer("v2")
        with v2_timer:
            if dump_v2:
                v2config = V2Config(ir)
                diagconfig = v2config
                od['v2'] = v2config.as_dict()
        v3_timer = Timer("v3")
        with v3_timer:
            if dump_v3:
                v3config = V3Config(ir)
                diagconfig = v3config
                od['v3'] = v3config.as_dict()
        diag_timer = Timer("diag")
        with diag_timer:
            if dump_diag:
                if not diagconfig:
                    diagconfig = V2Config(ir)
                    diagconfigv3 = V3Config(ir)
                econf = typecast(EnvoyConfig, diagconfig)
                econfv3 = typecast(EnvoyConfig, diagconfigv3)
                diag = Diagnostics(ir, econf)
                diagv3 = Diagnostics(ir, econfv3)
                od['diag'] = diag.as_dict()
                od['elements'] = econf.elements
                od['diagv3'] = diagv3.as_dict()
                od['elementsv3'] = econfv3.elements

        features_timer = Timer("features")
        with features_timer:
            if dump_features:
                od['features'] = ir.features()

        # scout = Scout()
        # scout_args = {}
        #
        # if ir and not os.environ.get("AMBASSADOR_DISABLE_FEATURES", None):
        #     scout_args["features"] = ir.features()
        #
        # result = scout.report(action="dump", mode="cli", **scout_args)
        # show_notices(result)

        dump_timer = Timer("dump JSON")

        with dump_timer:
            js = dump_json(od, pretty=not nopretty)
            jslen = len(js)

        write_timer = Timer("write JSON")
        with write_timer:
            sys.stdout.write(js)
            sys.stdout.write("\n")

        total_timer.stop()

        route_count = 0
        vhost_count = 0
        filter_chain_count = 0
        filter_count = 0
        apiversion = 'v2' if v2 else 'v3'
        if apiversion in od:
            for listener in od[apiversion]['static_resources']['listeners']:
                for fc in listener['filter_chains']:
                    filter_chain_count += 1
                    for f in fc['filters']:
                        filter_count += 1
                        for vh in f['typed_config']['route_config'][
                                'virtual_hosts']:
                            vhost_count += 1
                            route_count += len(vh['routes'])

        if stats:
            sys.stderr.write("STATS:\n")
            sys.stderr.write("  config bytes:  %d\n" % jslen)
            sys.stderr.write("  vhosts:        %d\n" % vhost_count)
            sys.stderr.write("  filter chains: %d\n" % filter_chain_count)
            sys.stderr.write("  filters:       %d\n" % filter_count)
            sys.stderr.write("  routes:        %d\n" % route_count)
            sys.stderr.write("  routes/vhosts: %.3f\n" %
                             float(float(route_count) / float(vhost_count)))
            sys.stderr.write("TIMERS:\n")
            sys.stderr.write("  fetch resources:  %.3fs\n" %
                             fetch_timer.average)
            sys.stderr.write("  load resources:   %.3fs\n" %
                             load_timer.average)
            sys.stderr.write("  ir generation:    %.3fs\n" %
                             irgen_timer.average)
            sys.stderr.write("  aconf:            %.3fs\n" %
                             aconf_timer.average)
            sys.stderr.write("  envoy v2:         %.3fs\n" % v2_timer.average)
            sys.stderr.write("  diag:             %.3fs\n" %
                             diag_timer.average)
            sys.stderr.write("  features:         %.3fs\n" %
                             features_timer.average)
            sys.stderr.write("  dump json:        %.3fs\n" %
                             dump_timer.average)
            sys.stderr.write("  write json:       %.3fs\n" %
                             write_timer.average)
            sys.stderr.write("  ----------------------\n")
            sys.stderr.write("  total: %.3fs\n" % total_timer.average)
    except Exception as e:
        handle_exception("EXCEPTION from dump",
                         e,
                         config_dir_path=config_dir_path)
        _rc = 1

    if _profile:
        _profile.disable()
        _profile.dump_stats("ambassador.profile")

    sys.exit(_rc)
コード例 #8
0
ファイル: utils.py プロジェクト: Ashokm96/ambassador
def _secret_handler():
    source_root = tempfile.TemporaryDirectory(prefix="null-secret-",
                                              suffix="-source")
    cache_dir = tempfile.TemporaryDirectory(prefix="null-secret-",
                                            suffix="-cache")
    return NullSecretHandler(logger, source_root.name, cache_dir.name, "fake")
コード例 #9
0
def _test_headercaseoverrides(yaml, expectations, expect_norules=False):
    aconf = Config()

    yaml = yaml + '''
---
apiVersion: getambassador.io/v2
kind: Mapping
name: httpbin-mapping
service: httpbin
prefix: /httpbin/
'''

    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf, file_checker=lambda path: True, secret_handler=secret_handler)
    assert ir

    econf = EnvoyConfig.generate(ir, "V2")
    assert econf, "could not create an econf"

    found_module_rules = False
    found_cluster_rules = False
    conf = econf.as_dict()

    for listener in conf['static_resources']['listeners']:
        for filter_chain in listener['filter_chains']:
            for f in filter_chain['filters']:
                typed_config = f['typed_config']
                if 'http_protocol_options' not in typed_config:
                    continue

                http_protocol_options = typed_config['http_protocol_options']
                if expect_norules:
                    assert 'header_key_format' not in http_protocol_options, \
                            f"'header_key_format' found unexpected typed_config {typed_config}"
                    continue

                assert 'header_key_format' in http_protocol_options, \
                        f"'header_key_format' not found, typed_config {typed_config}"

                header_key_format = http_protocol_options['header_key_format']
                assert 'custom' in header_key_format, \
                        f"'custom' not found, typed_config {typed_config}"

                rules = header_key_format['custom']['rules']
                assert len(rules) == len(expectations)
                for e in expectations:
                    hdr = e.lower()
                    assert hdr in rules
                    rule = rules[hdr]
                    assert rule == e, f"unexpected rule {rule} in {rules}"
                found_module_rules = True
    for cluster in conf['static_resources']['clusters']:
        if 'httpbin' not in cluster['name']:
            continue

        http_protocol_options = cluster.get('http_protocol_options', None)
        if not http_protocol_options:
            if expect_norules:
                continue
            assert 'http_protocol_options' in cluster, \
                    f"'http_protocol_options' missing from cluster: {cluster}"

        if expect_norules:
            assert 'header_key_format' not in http_protocol_options, \
                    f"'header_key_format' found unexpected cluster: {cluster}"
            continue

        assert 'header_key_format' in http_protocol_options, \
                f"'header_key_format' not found, cluster {cluster}"

        header_key_format = http_protocol_options['header_key_format']
        assert 'custom' in header_key_format, \
                f"'custom' not found, cluster {cluster}"

        rules = header_key_format['custom']['rules']
        assert len(rules) == len(expectations)
        for e in expectations:
            hdr = e.lower()
            assert hdr in rules
            rule = rules[hdr]
            assert rule == e, f"unexpected rule {rule} in {rules}"
        found_cluster_rules = True

    if expect_norules:
        assert not found_module_rules
        assert not found_cluster_rules
    else:
        assert found_module_rules
        assert found_cluster_rules
コード例 #10
0
def test_lookup():
    aconf = Config()

    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf, file_checker=lambda path: True, secret_handler=secret_handler)

    t1 = IRBuffer(ir, aconf, rkey='-foo-', name='buffer', max_request_bytes=4096)

    t2 = IRTestResource(ir, aconf, rkey='-foo-', name='buffer', max_request_bytes=8192)

    assert t1.lookup('max_request_bytes') == 4096
    assert t1.lookup('max_request_bytes', 57) == 4096
    assert t1.lookup('max_request_bytes2', 57) == 57

    assert t1.lookup('max_request_words') == 1
    assert t1.lookup('max_request_words', 77) == 1
    assert t1.lookup('max_request_words', default_key='altered') == 2
    assert t1.lookup('max_request_words', 77, default_key='altered') == 2
    assert t1.lookup('max_request_words', default_key='altered2') == None
    assert t1.lookup('max_request_words', 77, default_key='altered2') == 77

    assert t1.lookup('max_request_words', default_class='test_resource') == 3
    assert t1.lookup('max_request_words', 77, default_class='test_resource') == 3
    assert t1.lookup('max_request_words', 77, default_class='test_resource2') == 1
    assert t1.lookup('max_request_words', default_key='altered', default_class='test_resource') == 4
    assert t1.lookup('max_request_words', 77, default_key='altered', default_class='test_resource') == 4
    assert t1.lookup('max_request_words', default_key='altered2', default_class='test_resource') == None
    assert t1.lookup('max_request_words', 77, default_key='altered2', default_class='test_resource') == 77

    assert t1.lookup('funk') == None
    assert t1.lookup('funk', 77) == 77

    assert t1.lookup('funk', default_class='test_resource') == 8
    assert t1.lookup('funk', 77, default_class='test_resource') == 8
    assert t1.lookup('funk', 77, default_class='test_resource2') == 77

    assert t2.lookup('max_request_bytes') == 8192
    assert t2.lookup('max_request_bytes', 57) == 8192
    assert t2.lookup('max_request_bytes2', 57) == 57

    assert t2.lookup('max_request_words') == 3
    assert t2.lookup('max_request_words', 77) == 3
    assert t2.lookup('max_request_words', default_key='altered') == 4
    assert t2.lookup('max_request_words', 77, default_key='altered') == 4
    assert t2.lookup('max_request_words', default_key='altered2') == None
    assert t2.lookup('max_request_words', 77, default_key='altered2') == 77

    assert t2.lookup('max_request_words', default_class='/') == 1
    assert t2.lookup('max_request_words', 77, default_class='/') == 1
    assert t2.lookup('max_request_words', 77, default_class='/2') == 1
    assert t2.lookup('max_request_words', default_key='altered', default_class='/') == 2
    assert t2.lookup('max_request_words', 77, default_key='altered', default_class='/') == 2
    assert t2.lookup('max_request_words', default_key='altered2', default_class='/') == None
    assert t2.lookup('max_request_words', 77, default_key='altered2', default_class='/') == 77

    assert t2.lookup('funk') == 8
    assert t2.lookup('funk', 77) == 8

    assert t2.lookup('funk', default_class='test_resource') == 8
    assert t2.lookup('funk', 77, default_class='test_resource') == 8
    assert t2.lookup('funk', 77, default_class='test_resource2') == 77
コード例 #11
0
def test_qualify_service():
    aconf = Config()

    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf,
            file_checker=lambda path: True,
            secret_handler=secret_handler)

    assert ir, "could not create an IR"

    assert qualify_service_name(ir, "backoffice", None) == "backoffice"
    assert qualify_service_name(ir, "backoffice", "default") == "backoffice"
    assert qualify_service_name(ir, "backoffice",
                                "otherns") == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                None) == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                "default") == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                "otherns") == "backoffice.otherns"

    assert normalize_service_name(ir, "backoffice", None,
                                  'ConsulResolver') == "backoffice"
    assert normalize_service_name(ir, "backoffice", "default",
                                  'ConsulResolver') == "backoffice"
    assert normalize_service_name(ir, "backoffice", "otherns",
                                  'ConsulResolver') == "backoffice"
    assert normalize_service_name(ir, "backoffice.otherns", None,
                                  'ConsulResolver') == "backoffice.otherns"
    assert normalize_service_name(ir, "backoffice.otherns", "default",
                                  'ConsulResolver') == "backoffice.otherns"
    assert normalize_service_name(ir, "backoffice.otherns", "otherns",
                                  'ConsulResolver') == "backoffice.otherns"

    assert qualify_service_name(ir, "backoffice:80", None) == "backoffice:80"
    assert qualify_service_name(ir, "backoffice:80",
                                "default") == "backoffice:80"
    assert qualify_service_name(ir, "backoffice:80",
                                "otherns") == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                None) == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                "default") == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                "otherns") == "backoffice.otherns:80"

    assert normalize_service_name(ir, "backoffice:80", None,
                                  'ConsulResolver') == "backoffice:80"
    assert normalize_service_name(ir, "backoffice:80", "default",
                                  'ConsulResolver') == "backoffice:80"
    assert normalize_service_name(ir, "backoffice:80", "otherns",
                                  'ConsulResolver') == "backoffice:80"
    assert normalize_service_name(ir, "backoffice.otherns:80", None,
                                  'ConsulResolver') == "backoffice.otherns:80"
    assert normalize_service_name(ir, "backoffice.otherns:80", "default",
                                  'ConsulResolver') == "backoffice.otherns:80"
    assert normalize_service_name(ir, "backoffice.otherns:80", "otherns",
                                  'ConsulResolver') == "backoffice.otherns:80"

    assert qualify_service_name(ir, "http://backoffice",
                                None) == "http://backoffice"
    assert qualify_service_name(ir, "http://backoffice",
                                "default") == "http://backoffice"
    assert qualify_service_name(ir, "http://backoffice",
                                "otherns") == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                None) == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                "default") == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                "otherns") == "http://backoffice.otherns"

    assert normalize_service_name(ir, "http://backoffice", None,
                                  'ConsulResolver') == "http://backoffice"
    assert normalize_service_name(ir, "http://backoffice", "default",
                                  'ConsulResolver') == "http://backoffice"
    assert normalize_service_name(ir, "http://backoffice", "otherns",
                                  'ConsulResolver') == "http://backoffice"
    assert normalize_service_name(
        ir, "http://backoffice.otherns", None,
        'ConsulResolver') == "http://backoffice.otherns"
    assert normalize_service_name(
        ir, "http://backoffice.otherns", "default",
        'ConsulResolver') == "http://backoffice.otherns"
    assert normalize_service_name(
        ir, "http://backoffice.otherns", "otherns",
        'ConsulResolver') == "http://backoffice.otherns"

    assert qualify_service_name(ir, "http://backoffice:80",
                                None) == "http://backoffice:80"
    assert qualify_service_name(ir, "http://backoffice:80",
                                "default") == "http://backoffice:80"
    assert qualify_service_name(ir, "http://backoffice:80",
                                "otherns") == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                None) == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                "default") == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                "otherns") == "http://backoffice.otherns:80"

    assert normalize_service_name(ir, "http://backoffice:80", None,
                                  'ConsulResolver') == "http://backoffice:80"
    assert normalize_service_name(ir, "http://backoffice:80", "default",
                                  'ConsulResolver') == "http://backoffice:80"
    assert normalize_service_name(ir, "http://backoffice:80", "otherns",
                                  'ConsulResolver') == "http://backoffice:80"
    assert normalize_service_name(
        ir, "http://backoffice.otherns:80", None,
        'ConsulResolver') == "http://backoffice.otherns:80"
    assert normalize_service_name(
        ir, "http://backoffice.otherns:80", "default",
        'ConsulResolver') == "http://backoffice.otherns:80"
    assert normalize_service_name(
        ir, "http://backoffice.otherns:80", "otherns",
        'ConsulResolver') == "http://backoffice.otherns:80"

    assert qualify_service_name(ir, "https://backoffice",
                                None) == "https://backoffice"
    assert qualify_service_name(ir, "https://backoffice",
                                "default") == "https://backoffice"
    assert qualify_service_name(ir, "https://backoffice",
                                "otherns") == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                None) == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                "default") == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                "otherns") == "https://backoffice.otherns"

    assert normalize_service_name(ir, "https://backoffice", None,
                                  'ConsulResolver') == "https://backoffice"
    assert normalize_service_name(ir, "https://backoffice", "default",
                                  'ConsulResolver') == "https://backoffice"
    assert normalize_service_name(ir, "https://backoffice", "otherns",
                                  'ConsulResolver') == "https://backoffice"
    assert normalize_service_name(
        ir, "https://backoffice.otherns", None,
        'ConsulResolver') == "https://backoffice.otherns"
    assert normalize_service_name(
        ir, "https://backoffice.otherns", "default",
        'ConsulResolver') == "https://backoffice.otherns"
    assert normalize_service_name(
        ir, "https://backoffice.otherns", "otherns",
        'ConsulResolver') == "https://backoffice.otherns"

    assert qualify_service_name(ir, "https://backoffice:443",
                                None) == "https://backoffice:443"
    assert qualify_service_name(ir, "https://backoffice:443",
                                "default") == "https://backoffice:443"
    assert qualify_service_name(ir, "https://backoffice:443",
                                "otherns") == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                None) == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                "default") == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                "otherns") == "https://backoffice.otherns:443"

    assert normalize_service_name(ir, "https://backoffice:443", None,
                                  'ConsulResolver') == "https://backoffice:443"
    assert normalize_service_name(ir, "https://backoffice:443", "default",
                                  'ConsulResolver') == "https://backoffice:443"
    assert normalize_service_name(ir, "https://backoffice:443", "otherns",
                                  'ConsulResolver') == "https://backoffice:443"
    assert normalize_service_name(
        ir, "https://backoffice.otherns:443", None,
        'ConsulResolver') == "https://backoffice.otherns:443"
    assert normalize_service_name(
        ir, "https://backoffice.otherns:443", "default",
        'ConsulResolver') == "https://backoffice.otherns:443"
    assert normalize_service_name(
        ir, "https://backoffice.otherns:443", "otherns",
        'ConsulResolver') == "https://backoffice.otherns:443"

    assert qualify_service_name(ir, "localhost", None) == "localhost"
    assert qualify_service_name(ir, "localhost", "default") == "localhost"
    assert qualify_service_name(ir, "localhost", "otherns") == "localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "localhost.otherns",
                                None) == "localhost.otherns"
    assert qualify_service_name(ir, "localhost.otherns",
                                "default") == "localhost.otherns"
    assert qualify_service_name(ir, "localhost.otherns",
                                "otherns") == "localhost.otherns"

    assert normalize_service_name(ir, "localhost", None,
                                  'ConsulResolver') == "localhost"
    assert normalize_service_name(ir, "localhost", "default",
                                  'ConsulResolver') == "localhost"
    assert normalize_service_name(ir, "localhost", "otherns",
                                  'ConsulResolver') == "localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(ir, "localhost.otherns", None,
                                  'ConsulResolver') == "localhost.otherns"
    assert normalize_service_name(ir, "localhost.otherns", "default",
                                  'ConsulResolver') == "localhost.otherns"
    assert normalize_service_name(ir, "localhost.otherns", "otherns",
                                  'ConsulResolver') == "localhost.otherns"

    assert qualify_service_name(ir, "localhost:80", None) == "localhost:80"
    assert qualify_service_name(ir, "localhost:80",
                                "default") == "localhost:80"
    assert qualify_service_name(ir, "localhost:80",
                                "otherns") == "localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "localhost.otherns:80",
                                None) == "localhost.otherns:80"
    assert qualify_service_name(ir, "localhost.otherns:80",
                                "default") == "localhost.otherns:80"
    assert qualify_service_name(ir, "localhost.otherns:80",
                                "otherns") == "localhost.otherns:80"

    assert normalize_service_name(ir, "localhost:80", None,
                                  'ConsulResolver') == "localhost:80"
    assert normalize_service_name(ir, "localhost:80", "default",
                                  'ConsulResolver') == "localhost:80"
    assert normalize_service_name(ir, "localhost:80", "otherns",
                                  'ConsulResolver') == "localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(ir, "localhost.otherns:80", None,
                                  'ConsulResolver') == "localhost.otherns:80"
    assert normalize_service_name(ir, "localhost.otherns:80", "default",
                                  'ConsulResolver') == "localhost.otherns:80"
    assert normalize_service_name(ir, "localhost.otherns:80", "otherns",
                                  'ConsulResolver') == "localhost.otherns:80"

    assert qualify_service_name(ir, "http://localhost",
                                None) == "http://localhost"
    assert qualify_service_name(ir, "http://localhost",
                                "default") == "http://localhost"
    assert qualify_service_name(ir, "http://localhost",
                                "otherns") == "http://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "http://localhost.otherns",
                                None) == "http://localhost.otherns"
    assert qualify_service_name(ir, "http://localhost.otherns",
                                "default") == "http://localhost.otherns"
    assert qualify_service_name(ir, "http://localhost.otherns",
                                "otherns") == "http://localhost.otherns"

    assert normalize_service_name(ir, "http://localhost", None,
                                  'ConsulResolver') == "http://localhost"
    assert normalize_service_name(ir, "http://localhost", "default",
                                  'ConsulResolver') == "http://localhost"
    assert normalize_service_name(ir, "http://localhost", "otherns",
                                  'ConsulResolver') == "http://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(
        ir, "http://localhost.otherns", None,
        'ConsulResolver') == "http://localhost.otherns"
    assert normalize_service_name(
        ir, "http://localhost.otherns", "default",
        'ConsulResolver') == "http://localhost.otherns"
    assert normalize_service_name(
        ir, "http://localhost.otherns", "otherns",
        'ConsulResolver') == "http://localhost.otherns"

    assert qualify_service_name(ir, "http://localhost:80",
                                None) == "http://localhost:80"
    assert qualify_service_name(ir, "http://localhost:80",
                                "default") == "http://localhost:80"
    assert qualify_service_name(ir, "http://localhost:80",
                                "otherns") == "http://localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                None) == "http://localhost.otherns:80"
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                "default") == "http://localhost.otherns:80"
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                "otherns") == "http://localhost.otherns:80"

    assert normalize_service_name(ir, "http://localhost:80", None,
                                  'ConsulResolver') == "http://localhost:80"
    assert normalize_service_name(ir, "http://localhost:80", "default",
                                  'ConsulResolver') == "http://localhost:80"
    assert normalize_service_name(ir, "http://localhost:80", "otherns",
                                  'ConsulResolver') == "http://localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(
        ir, "http://localhost.otherns:80", None,
        'ConsulResolver') == "http://localhost.otherns:80"
    assert normalize_service_name(
        ir, "http://localhost.otherns:80", "default",
        'ConsulResolver') == "http://localhost.otherns:80"
    assert normalize_service_name(
        ir, "http://localhost.otherns:80", "otherns",
        'ConsulResolver') == "http://localhost.otherns:80"

    assert qualify_service_name(ir, "https://localhost",
                                None) == "https://localhost"
    assert qualify_service_name(ir, "https://localhost",
                                "default") == "https://localhost"
    assert qualify_service_name(ir, "https://localhost",
                                "otherns") == "https://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "https://localhost.otherns",
                                None) == "https://localhost.otherns"
    assert qualify_service_name(ir, "https://localhost.otherns",
                                "default") == "https://localhost.otherns"
    assert qualify_service_name(ir, "https://localhost.otherns",
                                "otherns") == "https://localhost.otherns"

    assert normalize_service_name(ir, "https://localhost", None,
                                  'ConsulResolver') == "https://localhost"
    assert normalize_service_name(ir, "https://localhost", "default",
                                  'ConsulResolver') == "https://localhost"
    assert normalize_service_name(ir, "https://localhost", "otherns",
                                  'ConsulResolver') == "https://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(
        ir, "https://localhost.otherns", None,
        'ConsulResolver') == "https://localhost.otherns"
    assert normalize_service_name(
        ir, "https://localhost.otherns", "default",
        'ConsulResolver') == "https://localhost.otherns"
    assert normalize_service_name(
        ir, "https://localhost.otherns", "otherns",
        'ConsulResolver') == "https://localhost.otherns"

    assert qualify_service_name(ir, "https://localhost:443",
                                None) == "https://localhost:443"
    assert qualify_service_name(ir, "https://localhost:443",
                                "default") == "https://localhost:443"
    assert qualify_service_name(ir, "https://localhost:443",
                                "otherns") == "https://localhost:443"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                None) == "https://localhost.otherns:443"
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                "default") == "https://localhost.otherns:443"
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                "otherns") == "https://localhost.otherns:443"

    assert normalize_service_name(ir, "https://localhost:443", None,
                                  'ConsulResolver') == "https://localhost:443"
    assert normalize_service_name(ir, "https://localhost:443", "default",
                                  'ConsulResolver') == "https://localhost:443"
    assert normalize_service_name(ir, "https://localhost:443", "otherns",
                                  'ConsulResolver') == "https://localhost:443"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert normalize_service_name(
        ir, "https://localhost.otherns:443", None,
        'ConsulResolver') == "https://localhost.otherns:443"
    assert normalize_service_name(
        ir, "https://localhost.otherns:443", "default",
        'ConsulResolver') == "https://localhost.otherns:443"
    assert normalize_service_name(
        ir, "https://localhost.otherns:443", "otherns",
        'ConsulResolver') == "https://localhost.otherns:443"

    assert qualify_service_name(
        ir, "ambassador://foo.ns", "otherns"
    ) == "ambassador://foo.ns"  # let's not introduce silly semantics
    assert qualify_service_name(
        ir, "//foo.ns:1234", "otherns"
    ) == "foo.ns:1234"  # we tell people "URL-ish", actually support URL-ish
    assert qualify_service_name(ir, "foo.ns:1234", "otherns") == "foo.ns:1234"

    assert normalize_service_name(
        ir, "ambassador://foo.ns", "otherns", 'ConsulResolver'
    ) == "ambassador://foo.ns"  # let's not introduce silly semantics
    assert normalize_service_name(
        ir, "//foo.ns:1234", "otherns", 'ConsulResolver'
    ) == "foo.ns:1234"  # we tell people "URL-ish", actually support URL-ish
    assert normalize_service_name(ir, "foo.ns:1234", "otherns",
                                  'ConsulResolver') == "foo.ns:1234"

    errors = ir.aconf.errors
    assert not errors

    assert qualify_service_name(ir, "https://bad-service:443:443",
                                "otherns") == "https://bad-service:443:443"
    assert qualify_service_name(
        ir, "https://bad-service:443:443", "otherns",
        rkey="test-rkey") == "https://bad-service:443:443"
    assert qualify_service_name(ir, "bad-service:443:443",
                                "otherns") == "bad-service:443:443"
    assert qualify_service_name(
        ir, "https://[fe80::e022:9cff:fecc:c7c4:443",
        "otherns") == "https://[fe80::e022:9cff:fecc:c7c4:443"
    assert qualify_service_name(
        ir, "https://[fe80::e022:9cff:fecc:c7c4",
        "otherns") == "https://[fe80::e022:9cff:fecc:c7c4"
    assert qualify_service_name(
        ir, "https://fe80::e022:9cff:fecc:c7c4",
        "otherns") == "https://fe80::e022:9cff:fecc:c7c4"
    assert qualify_service_name(ir, "https://bad-service:-1",
                                "otherns") == "https://bad-service:-1"
    assert qualify_service_name(ir, "https://bad-service:70000",
                                "otherns") == "https://bad-service:70000"

    assert normalize_service_name(
        ir, "https://bad-service:443:443", "otherns",
        'ConsulResolver') == "https://bad-service:443:443"
    assert normalize_service_name(
        ir,
        "https://bad-service:443:443",
        "otherns",
        'ConsulResolver',
        rkey="test-rkey") == "https://bad-service:443:443"
    assert normalize_service_name(ir, "bad-service:443:443", "otherns",
                                  'ConsulResolver') == "bad-service:443:443"
    assert normalize_service_name(
        ir, "https://[fe80::e022:9cff:fecc:c7c4:443", "otherns",
        'ConsulResolver') == "https://[fe80::e022:9cff:fecc:c7c4:443"
    assert normalize_service_name(
        ir, "https://[fe80::e022:9cff:fecc:c7c4", "otherns",
        'ConsulResolver') == "https://[fe80::e022:9cff:fecc:c7c4"
    assert normalize_service_name(
        ir, "https://fe80::e022:9cff:fecc:c7c4", "otherns",
        'ConsulResolver') == "https://fe80::e022:9cff:fecc:c7c4"
    assert normalize_service_name(ir, "https://bad-service:-1", "otherns",
                                  'ConsulResolver') == "https://bad-service:-1"
    assert normalize_service_name(
        ir, "https://bad-service:70000", "otherns",
        'ConsulResolver') == "https://bad-service:70000"

    errors = ir.aconf.errors
    assert "-global-" in errors
    errors = errors["-global-"]

    assert len(errors) == 16

    # Ugg, different versions of Python have different error messages.  Let's recognize the "Port could not be cast to
    # integer value as" to keep pytest working on peoples up-to-date laptops with Python 3.8, and let's recognize
    # "invalid literal for int() with base 10:" for the Python 3.7 in the builder container.
    assert not errors[0]["ok"]
    assert (
        errors[0]["error"] ==
        "Malformed service 'https://bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[0]["error"] ==
        "Malformed service 'https://bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[1]["ok"]
    assert (
        errors[1]["error"] ==
        "test-rkey: Malformed service 'https://bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[1]["error"] ==
        "test-rkey: Malformed service 'https://bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[2]["ok"]
    assert (
        errors[2]["error"] ==
        "Malformed service 'bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[2]["error"] ==
        "Malformed service 'bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[3]["ok"]
    assert errors[3][
        "error"] == "Malformed service 'https://[fe80::e022:9cff:fecc:c7c4:443': Invalid IPv6 URL"

    assert not errors[4]["ok"]
    assert errors[4][
        "error"] == "Malformed service 'https://[fe80::e022:9cff:fecc:c7c4': Invalid IPv6 URL"

    assert not errors[5]["ok"]
    assert (
        errors[5]["error"] ==
        "Malformed service 'https://fe80::e022:9cff:fecc:c7c4': Port could not be cast to integer value as ':e022:9cff:fecc:c7c4'"
        or errors[5]["error"] ==
        "Malformed service 'https://fe80::e022:9cff:fecc:c7c4': invalid literal for int() with base 10: ':e022:9cff:fecc:c7c4'"
    )

    assert not errors[6]["ok"]
    assert errors[6][
        "error"] == "Malformed service 'https://bad-service:-1': Port out of range 0-65535"

    assert not errors[7]["ok"]
    assert errors[7][
        "error"] == "Malformed service 'https://bad-service:70000': Port out of range 0-65535"

    assert not errors[8]["ok"]
    assert (
        errors[8]["error"] ==
        "Malformed service 'https://bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[8]["error"] ==
        "Malformed service 'https://bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[9]["ok"]
    assert (
        errors[9]["error"] ==
        "test-rkey: Malformed service 'https://bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[9]["error"] ==
        "test-rkey: Malformed service 'https://bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[10]["ok"]
    assert (
        errors[10]["error"] ==
        "Malformed service 'bad-service:443:443': Port could not be cast to integer value as '443:443'"
        or errors[10]["error"] ==
        "Malformed service 'bad-service:443:443': invalid literal for int() with base 10: '443:443'"
    )

    assert not errors[11]["ok"]
    assert errors[11][
        "error"] == "Malformed service 'https://[fe80::e022:9cff:fecc:c7c4:443': Invalid IPv6 URL"

    assert not errors[12]["ok"]
    assert errors[12][
        "error"] == "Malformed service 'https://[fe80::e022:9cff:fecc:c7c4': Invalid IPv6 URL"

    assert not errors[13]["ok"]
    assert (
        errors[13]["error"] ==
        "Malformed service 'https://fe80::e022:9cff:fecc:c7c4': Port could not be cast to integer value as ':e022:9cff:fecc:c7c4'"
        or errors[13]["error"] ==
        "Malformed service 'https://fe80::e022:9cff:fecc:c7c4': invalid literal for int() with base 10: ':e022:9cff:fecc:c7c4'"
    )

    assert not errors[14]["ok"]
    assert errors[14][
        "error"] == "Malformed service 'https://bad-service:-1': Port out of range 0-65535"

    assert not errors[15]["ok"]
    assert errors[15][
        "error"] == "Malformed service 'https://bad-service:70000': Port out of range 0-65535"
コード例 #12
0
def dump(config_dir_path: Parameter.REQUIRED,
         *,
         secret_dir_path=None,
         watt=False,
         debug=False,
         debug_scout=False,
         k8s=False,
         recurse=False,
         aconf=False,
         ir=False,
         v2=False,
         diag=False,
         features=False):
    """
    Dump various forms of an Ambassador configuration for debugging

    Use --aconf, --ir, and --envoy to control what gets dumped. If none are requested, the IR
    will be dumped.

    :param config_dir_path: Configuration directory to scan for Ambassador YAML files
    :param secret_dir_path: Directory into which to save secrets
    :param watt: If set, input must be a WATT snapshot
    :param debug: If set, generate debugging output
    :param debug_scout: If set, generate debugging output
    :param k8s: If set, assume configuration files are annotated K8s manifests
    :param recurse: If set, recurse into directories below config_dir_path
    :param aconf: If set, dump the Ambassador config
    :param ir: If set, dump the IR
    :param v2: If set, dump the Envoy V2 config
    :param diag: If set, dump the Diagnostics overview
    :param features: If set, dump the feature set
    """

    if not secret_dir_path:
        secret_dir_path = config_dir_path

        if not os.path.isdir(secret_dir_path):
            secret_dir_path = os.path.dirname(secret_dir_path)

    if debug:
        logger.setLevel(logging.DEBUG)

    if debug_scout:
        logging.getLogger('ambassador.scout').setLevel(logging.DEBUG)

    if not (aconf or ir or v2 or diag or features):
        aconf = True
        ir = True
        v2 = True
        diag = False
        features = False

    dump_aconf = aconf
    dump_ir = ir
    dump_v2 = v2
    dump_diag = diag
    dump_features = features

    od = {}
    diagconfig: Optional[EnvoyConfig] = None

    try:
        aconf = Config()
        fetcher = ResourceFetcher(logger, aconf)

        if watt:
            fetcher.parse_watt(open(config_dir_path, "r").read())
        else:
            fetcher.load_from_filesystem(config_dir_path,
                                         k8s=k8s,
                                         recurse=True)

        aconf.load_all(fetcher.sorted())

        # aconf.post_error("Error from string, boo yah")
        # aconf.post_error(RichStatus.fromError("Error from RichStatus"))

        if dump_aconf:
            od['aconf'] = aconf.as_dict()

        secret_handler = NullSecretHandler(logger, config_dir_path,
                                           secret_dir_path, "0")

        ir = IR(aconf,
                file_checker=file_checker,
                secret_handler=secret_handler)

        if dump_ir:
            od['ir'] = ir.as_dict()

        if dump_v2:
            v2config = V2Config(ir)
            diagconfig = v2config
            od['v2'] = v2config.as_dict()

        if dump_diag:
            if not diagconfig:
                diagconfig = V2Config(ir)

            econf = typecast(EnvoyConfig, diagconfig)
            diag = Diagnostics(ir, econf)
            od['diag'] = diag.as_dict()
            od['elements'] = econf.elements

        if dump_features:
            od['features'] = ir.features()

        # scout = Scout()
        # scout_args = {}
        #
        # if ir and not os.environ.get("AMBASSADOR_DISABLE_FEATURES", None):
        #     scout_args["features"] = ir.features()
        #
        # result = scout.report(action="dump", mode="cli", **scout_args)
        # show_notices(result)

        json.dump(od, sys.stdout, sort_keys=True, indent=4)
        sys.stdout.write("\n")
    except Exception as e:
        handle_exception("EXCEPTION from dump",
                         e,
                         config_dir_path=config_dir_path)

        # This is fatal.
        sys.exit(1)
コード例 #13
0
def test_qualify_service():
    aconf = Config()

    fetcher = ResourceFetcher(logger, aconf)
    fetcher.parse_yaml(yaml)

    aconf.load_all(fetcher.sorted())

    secret_handler = NullSecretHandler(logger, None, None, "0")

    ir = IR(aconf,
            file_checker=lambda path: True,
            secret_handler=secret_handler)

    assert ir, "could not create an IR"

    assert qualify_service_name(ir, "backoffice", None) == "backoffice"
    assert qualify_service_name(ir, "backoffice", "default") == "backoffice"
    assert qualify_service_name(ir, "backoffice",
                                "otherns") == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                None) == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                "default") == "backoffice.otherns"
    assert qualify_service_name(ir, "backoffice.otherns",
                                "otherns") == "backoffice.otherns"

    assert qualify_service_name(ir, "backoffice:80", None) == "backoffice:80"
    assert qualify_service_name(ir, "backoffice:80",
                                "default") == "backoffice:80"
    assert qualify_service_name(ir, "backoffice:80",
                                "otherns") == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                None) == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                "default") == "backoffice.otherns:80"
    assert qualify_service_name(ir, "backoffice.otherns:80",
                                "otherns") == "backoffice.otherns:80"

    assert qualify_service_name(ir, "http://backoffice",
                                None) == "http://backoffice"
    assert qualify_service_name(ir, "http://backoffice",
                                "default") == "http://backoffice"
    assert qualify_service_name(ir, "http://backoffice",
                                "otherns") == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                None) == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                "default") == "http://backoffice.otherns"
    assert qualify_service_name(ir, "http://backoffice.otherns",
                                "otherns") == "http://backoffice.otherns"

    assert qualify_service_name(ir, "http://backoffice:80",
                                None) == "http://backoffice:80"
    assert qualify_service_name(ir, "http://backoffice:80",
                                "default") == "http://backoffice:80"
    assert qualify_service_name(ir, "http://backoffice:80",
                                "otherns") == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                None) == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                "default") == "http://backoffice.otherns:80"
    assert qualify_service_name(ir, "http://backoffice.otherns:80",
                                "otherns") == "http://backoffice.otherns:80"

    assert qualify_service_name(ir, "https://backoffice",
                                None) == "https://backoffice"
    assert qualify_service_name(ir, "https://backoffice",
                                "default") == "https://backoffice"
    assert qualify_service_name(ir, "https://backoffice",
                                "otherns") == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                None) == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                "default") == "https://backoffice.otherns"
    assert qualify_service_name(ir, "https://backoffice.otherns",
                                "otherns") == "https://backoffice.otherns"

    assert qualify_service_name(ir, "https://backoffice:443",
                                None) == "https://backoffice:443"
    assert qualify_service_name(ir, "https://backoffice:443",
                                "default") == "https://backoffice:443"
    assert qualify_service_name(ir, "https://backoffice:443",
                                "otherns") == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                None) == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                "default") == "https://backoffice.otherns:443"
    assert qualify_service_name(ir, "https://backoffice.otherns:443",
                                "otherns") == "https://backoffice.otherns:443"

    assert qualify_service_name(ir, "localhost", None) == "localhost"
    assert qualify_service_name(ir, "localhost", "default") == "localhost"
    assert qualify_service_name(ir, "localhost", "otherns") == "localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "localhost.otherns",
                                None) == "localhost.otherns"
    assert qualify_service_name(ir, "localhost.otherns",
                                "default") == "localhost.otherns"
    assert qualify_service_name(ir, "localhost.otherns",
                                "otherns") == "localhost.otherns"

    assert qualify_service_name(ir, "localhost:80", None) == "localhost:80"
    assert qualify_service_name(ir, "localhost:80",
                                "default") == "localhost:80"
    assert qualify_service_name(ir, "localhost:80",
                                "otherns") == "localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "localhost.otherns:80",
                                None) == "localhost.otherns:80"
    assert qualify_service_name(ir, "localhost.otherns:80",
                                "default") == "localhost.otherns:80"
    assert qualify_service_name(ir, "localhost.otherns:80",
                                "otherns") == "localhost.otherns:80"

    assert qualify_service_name(ir, "http://localhost",
                                None) == "http://localhost"
    assert qualify_service_name(ir, "http://localhost",
                                "default") == "http://localhost"
    assert qualify_service_name(ir, "http://localhost",
                                "otherns") == "http://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "http://localhost.otherns",
                                None) == "http://localhost.otherns"
    assert qualify_service_name(ir, "http://localhost.otherns",
                                "default") == "http://localhost.otherns"
    assert qualify_service_name(ir, "http://localhost.otherns",
                                "otherns") == "http://localhost.otherns"

    assert qualify_service_name(ir, "http://localhost:80",
                                None) == "http://localhost:80"
    assert qualify_service_name(ir, "http://localhost:80",
                                "default") == "http://localhost:80"
    assert qualify_service_name(ir, "http://localhost:80",
                                "otherns") == "http://localhost:80"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                None) == "http://localhost.otherns:80"
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                "default") == "http://localhost.otherns:80"
    assert qualify_service_name(ir, "http://localhost.otherns:80",
                                "otherns") == "http://localhost.otherns:80"

    assert qualify_service_name(ir, "https://localhost",
                                None) == "https://localhost"
    assert qualify_service_name(ir, "https://localhost",
                                "default") == "https://localhost"
    assert qualify_service_name(ir, "https://localhost",
                                "otherns") == "https://localhost"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "https://localhost.otherns",
                                None) == "https://localhost.otherns"
    assert qualify_service_name(ir, "https://localhost.otherns",
                                "default") == "https://localhost.otherns"
    assert qualify_service_name(ir, "https://localhost.otherns",
                                "otherns") == "https://localhost.otherns"

    assert qualify_service_name(ir, "https://localhost:443",
                                None) == "https://localhost:443"
    assert qualify_service_name(ir, "https://localhost:443",
                                "default") == "https://localhost:443"
    assert qualify_service_name(ir, "https://localhost:443",
                                "otherns") == "https://localhost:443"
    # It's not meaningful to actually say "localhost.otherns", but it should passed through unchanged.
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                None) == "https://localhost.otherns:443"
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                "default") == "https://localhost.otherns:443"
    assert qualify_service_name(ir, "https://localhost.otherns:443",
                                "otherns") == "https://localhost.otherns:443"

    assert qualify_service_name(ir, "https://bad-service:443:443",
                                "otherns") == "https://bad-service:443:443"
    assert qualify_service_name(
        ir, "https://bad-service:443:443", "otherns",
        rkey="test-rkey") == "https://bad-service:443:443"

    errors = ir.aconf.errors

    assert "-global-" in errors

    errors = errors["-global-"]

    assert len(errors) == 2

    assert not errors[0]["ok"]
    assert errors[0][
        "error"] == "Malformed service port in https://bad-service:443:443"

    assert not errors[1]["ok"]
    assert errors[1][
        "error"] == "test-rkey: Malformed service port in https://bad-service:443:443"