public static IngressRule ToModel(this V1IngressRule rule)
 {
     return(new IngressRule
     {
         Host = rule.Host,
         Paths = rule.Http.Paths.Select(p => p.ToModel()),
     });
 }
Пример #2
0
        private static void HandleIngressRulePath(YarpIngressContext context, List <Endpoints> endpoints, IList <V1EndpointSubset> defaultSubsets, V1IngressRule rule, V1HTTPIngressPath path)
        {
            var backend = path.Backend;
            var service = backend.Service;
            var subsets = defaultSubsets;

            var clusters = context.ClusterTransfers;
            var routes   = context.Routes;

            if (!string.IsNullOrEmpty(service?.Name))
            {
                subsets = endpoints.SingleOrDefault(x => x.Name == service?.Name).Subsets;
            }

            // make sure cluster is present
            foreach (var subset in subsets ?? Enumerable.Empty <V1EndpointSubset>())
            {
                foreach (var port in subset.Ports ?? Enumerable.Empty <V1EndpointPort>())
                {
                    var key = $"{service?.Name}:{port.Port}";

                    if (!clusters.ContainsKey(key))
                    {
                        clusters.Add(key, new ClusterTrasfer());
                    }
                    var cluster = clusters[key];
                    cluster.ClusterId = key;

                    foreach (var address in subset.Addresses ?? Enumerable.Empty <V1EndpointAddress>())
                    {
                        var ip = address.Ip;

                        if (!MatchesPort(port, service?.Port))
                        {
                            continue;
                        }

                        var protocol = context.Options.Https ? "https" : "http";
                        var uri      = $"{protocol}://{address.Ip}:{port.Port}";
                        cluster.Destinations[uri] = new Destination()
                        {
                            Address = uri
                        };

                        var pathMatch = FixupPathMatch(path);
                        var host      = rule.Host;

                        routes.Add(new ProxyRoute()
                        {
                            Match = new ProxyMatch()
                            {
                                Hosts = host != null ? new[] { host } : Array.Empty <string>(),
                                Path  = pathMatch
                            },
                            ClusterId = cluster.ClusterId,
                            RouteId   = path.Path
                        });
                    }
                }
            }
        }
Пример #3
0
    private static void HandleIngressRulePath(YarpIngressContext ingressContext, V1ServicePort servicePort, List <Endpoints> endpoints, IList <V1EndpointSubset> defaultSubsets, V1IngressRule rule, V1HTTPIngressPath path, YarpConfigContext configContext)
    {
        var backend = path.Backend;
        var ingressServiceBackend = backend.Service;
        var subsets = defaultSubsets;

        var clusters = configContext.ClusterTransfers;
        var routes   = configContext.Routes;

        if (!string.IsNullOrEmpty(ingressServiceBackend?.Name))
        {
            subsets = endpoints.SingleOrDefault(x => x.Name == ingressServiceBackend?.Name).Subsets;
        }

        // Each ingress rule path can only be for one service
        var key = ingressServiceBackend.Port.Number.HasValue ? $"{ingressServiceBackend?.Name}:{ingressServiceBackend?.Port.Number}" : $"{ingressServiceBackend?.Name}:{ingressServiceBackend?.Port.Name}";

        if (!clusters.ContainsKey(key))
        {
            clusters.Add(key, new ClusterTransfer());
        }

        var cluster = clusters[key];

        cluster.ClusterId = key;

        // make sure cluster is present
        foreach (var subset in subsets ?? Enumerable.Empty <V1EndpointSubset>())
        {
            foreach (var port in subset.Ports ?? Enumerable.Empty <V1EndpointPort>())
            {
                if (!MatchesPort(port, servicePort.TargetPort))
                {
                    continue;
                }

                var pathMatch = FixupPathMatch(path);
                var host      = rule.Host;

                routes.Add(new RouteConfig()
                {
                    Match = new RouteMatch()
                    {
                        Hosts = host != null ? new[] { host } : Array.Empty <string>(),
                        Path  = pathMatch
                    },
                    ClusterId = cluster.ClusterId,
                    RouteId   = $"{ingressContext.Ingress.Metadata.Name}:{path.Path}"
                });

                // Add destination for every endpoint address
                foreach (var address in subset.Addresses ?? Enumerable.Empty <V1EndpointAddress>())
                {
                    var protocol = ingressContext.Options.Https ? "https" : "http";
                    var uri      = $"{protocol}://{address.Ip}:{port.Port}";
                    cluster.Destinations[uri] = new DestinationConfig()
                    {
                        Address = uri
                    };
                }
            }
        }
    }
Пример #4
0
        private static void HandleIngressRule(YarpIngressContext context, List <Endpoints> endpoints, IList <V1EndpointSubset> defaultSubsets, V1IngressRule rule)
        {
            var http = rule.Http;

            foreach (var path in http.Paths ?? Enumerable.Empty <V1HTTPIngressPath>())
            {
                HandleIngressRulePath(context, endpoints, defaultSubsets, rule, path);
            }
        }
Пример #5
0
    private static void HandleIngressRule(YarpIngressContext ingressContext, List <Endpoints> endpoints, IList <V1EndpointSubset> defaultSubsets, V1IngressRule rule, YarpConfigContext configContext)
    {
        var http = rule.Http;

        foreach (var path in http.Paths ?? Enumerable.Empty <V1HTTPIngressPath>())
        {
            var service     = ingressContext.Services.SingleOrDefault(s => s.Metadata.Name == path.Backend.Service.Name);
            var servicePort = service.Spec.Ports.SingleOrDefault(p => MatchesPort(p, path.Backend.Service.Port));
            HandleIngressRulePath(ingressContext, servicePort, endpoints, defaultSubsets, rule, path, configContext);
        }
    }