core/src/main/java/io/fabric8/maven/core/util/kubernetes/ServiceUrlUtil.java
public static String getServiceURL(KubernetesClient client, String serviceName, String serviceNamespace, String serviceProtocol, boolean serviceExternal) {
        Service srv = null;
        String serviceHost = serviceToHostOrBlank(serviceName);
        String servicePort = serviceToPortOrBlank(serviceName);
        String serviceProto = serviceProtocol != null ? serviceProtocol : serviceToProtocol(serviceName, servicePort);

        //Use specified or fallback namespace.
        String actualNamespace = StringUtils.isNotBlank(serviceNamespace) ? serviceNamespace : client.getNamespace();

        //1. Inside Kubernetes: Services as ENV vars
        if (!serviceExternal && StringUtils.isNotBlank(serviceHost) && StringUtils.isNotBlank(servicePort) && StringUtils.isNotBlank(serviceProtocol)) {
            return serviceProtocol + "://" + serviceHost + ":" + servicePort;
            //2. Anywhere: When namespace is passed System / Env var. Mostly needed for integration tests.
        } else if (StringUtils.isNotBlank(actualNamespace)) {
            srv = client.services().inNamespace(actualNamespace).withName(serviceName).get();
        }

        if (srv == null) {
            // lets try use environment variables
            String hostAndPort = getServiceHostAndPort(serviceName, "", "");
            if (!hostAndPort.startsWith(":")) {
                return serviceProto + "://" + hostAndPort;
            }
        }
        if (srv == null) {
            throw new IllegalArgumentException("No kubernetes service could be found for name: " + serviceName + " in namespace: " + actualNamespace);
        }

        String answer = KubernetesHelper.getOrCreateAnnotations(srv).get(Fabric8Annotations.SERVICE_EXPOSE_URL.toString());
        if (StringUtils.isNotBlank(answer)) {
            return answer;
        }

        if (OpenshiftHelper.isOpenShift(client)) {
            OpenShiftClient openShiftClient = client.adapt(OpenShiftClient.class);
            Route route = openShiftClient.routes().inNamespace(actualNamespace).withName(serviceName).get();
            if (route != null) {
                return (serviceProto + "://" + route.getSpec().getHost()).toLowerCase();
            }
        }

        ServicePort port = findServicePortByName(srv, null);
        if (port == null) {
            throw new RuntimeException("Couldn't find port: " + null + " for service:" + serviceName);
        }

        String clusterIP = srv.getSpec().getClusterIP();
        if ("None".equals(clusterIP)) {
            throw new IllegalStateException("Service: " + serviceName + " in namespace:" + serviceNamespace + "is head-less. Search for endpoints instead.");
        }

        Integer portNumber = port.getPort();
        if (StringUtils.isBlank(clusterIP)) {
            IngressList ingresses = client.extensions().ingresses().inNamespace(serviceNamespace).list();
            if (ingresses != null) {
                List<Ingress> items = ingresses.getItems();
                if (items != null) {
                    for (Ingress item : items) {
                        String ns = KubernetesHelper.getNamespace(item);
                        if (Objects.equal(serviceNamespace, ns)) {
                            IngressSpec spec = item.getSpec();
                            if (spec != null) {
                                List<IngressRule> rules = spec.getRules();
                                List<IngressTLS> tls = spec.getTls();
                                if (rules != null) {
                                    for (IngressRule rule : rules) {
                                        HTTPIngressRuleValue http = rule.getHttp();
                                        if (http != null) {
                                            List<HTTPIngressPath> paths = http.getPaths();
                                            if (paths != null) {
                                                for (HTTPIngressPath path : paths) {
                                                    IngressBackend backend = path.getBackend();
                                                    if (backend != null) {
                                                        String backendServiceName = backend.getServiceName();
                                                        if (serviceName.equals(backendServiceName) && portsMatch(port, backend.getServicePort())) {
                                                            String pathPostfix = path.getPath();
                                                            if (tls != null) {
                                                                for (IngressTLS tlsHost : tls) {
                                                                    List<String> hosts = tlsHost.getHosts();
                                                                    if (hosts != null) {
                                                                        for (String host : hosts) {
                                                                            if (StringUtils.isNotBlank(host)) {
                                                                                return String.format("https://%s/%s", host, preparePath(pathPostfix));
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            answer = rule.getHost();
                                                            if (StringUtils.isNotBlank(answer)) {
                                                                return String.format("http://%s/%s",answer, preparePath(pathPostfix));
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // lets try use the status on GKE
            ServiceStatus status = srv.getStatus();
            if (status != null) {
                LoadBalancerStatus loadBalancerStatus = status.getLoadBalancer();
                if (loadBalancerStatus != null) {
                    List<LoadBalancerIngress> loadBalancerIngresses = loadBalancerStatus.getIngress();
                    if (loadBalancerIngresses != null) {
                        for (LoadBalancerIngress loadBalancerIngress : loadBalancerIngresses) {
                            String ip = loadBalancerIngress.getIp();
                            if (StringUtils.isNotBlank(ip)) {
                                clusterIP = ip;
                                break;
                            }
                        }
                    }
                }
            }
        }

        if (StringUtils.isBlank(clusterIP)) {
            // on vanilla kubernetes we can use nodePort to access things externally
            boolean found = false;
            Integer nodePort = port.getNodePort();
            if (nodePort != null) {
                NodeList nodeList = client.nodes().list();
                if (nodeList != null) {
                    List<Node> items = nodeList.getItems();
                    if (items != null) {
                        for (Node item : items) {
                            NodeStatus status = item.getStatus();
                            if (!found && status != null) {
                                List<NodeAddress> addresses = status.getAddresses();
                                if (addresses != null) {
                                    for (NodeAddress address : addresses) {
                                        String ip = address.getAddress();
                                        if (StringUtils.isNotBlank(ip)) {
                                            clusterIP = ip;
                                            portNumber = nodePort;
                                            found = true;
                                            break;
                                        }

                                    }

                                }
                            }
                            if (!found) {
                                NodeSpec spec = item.getSpec();
                                if (spec != null) {
                                    clusterIP = spec.getExternalID();
                                    if (StringUtils.isNotBlank(clusterIP)) {
                                        portNumber = nodePort;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return (serviceProto + "://" + clusterIP + ":" + portNumber).toLowerCase();
    }
public static String getServiceURL(KubernetesClient client, String serviceName, String serviceNamespace, String serviceProtocol, boolean serviceExternal) {
        Service srv = null;
        String serviceHost = serviceToHostOrBlank(serviceName);
        String servicePort = serviceToPortOrBlank(serviceName);
        String serviceProto = serviceProtocol != null ? serviceProtocol : serviceToProtocol(serviceName, servicePort);

        //Use specified or fallback namespace.
        String actualNamespace = StringUtils.isNotBlank(serviceNamespace) ? serviceNamespace : client.getNamespace();

        //1. Inside Kubernetes: Services as ENV vars
        if (!serviceExternal && StringUtils.isNotBlank(serviceHost) && StringUtils.isNotBlank(servicePort) && StringUtils.isNotBlank(serviceProtocol)) {
            return serviceProtocol + "://" + serviceHost + ":" + servicePort;
            //2. Anywhere: When namespace is passed System / Env var. Mostly needed for integration tests.
        } else if (StringUtils.isNotBlank(actualNamespace)) {
            srv = client.services().inNamespace(actualNamespace).withName(serviceName).get();
        }

        if (srv == null) {
            // lets try use environment variables
            String hostAndPort = getServiceHostAndPort(serviceName, "", "");
            if (!hostAndPort.startsWith(":")) {
                return serviceProto + "://" + hostAndPort;
            }
        }
        if (srv == null) {
            throw new IllegalArgumentException("No kubernetes service could be found for name: " + serviceName + " in namespace: " + actualNamespace);
        }

        String answer = KubernetesHelper.getOrCreateAnnotations(srv).get(Fabric8Annotations.SERVICE_EXPOSE_URL.toString());
        if (StringUtils.isNotBlank(answer)) {
            return answer;
        }

        if (OpenshiftHelper.isOpenShift(client)) {
            OpenShiftClient openShiftClient = client.adapt(OpenShiftClient.class);
            Route route = openShiftClient.routes().inNamespace(actualNamespace).withName(serviceName).get();
            if (route != null) {
                return (serviceProto + "://" + route.getSpec().getHost()).toLowerCase();
            }
        }

        ServicePort port = findServicePortByName(srv, null);
        if (port == null) {
            throw new RuntimeException("Couldn't find port: " + null + " for service:" + serviceName);
        }

        String clusterIP = srv.getSpec().getClusterIP();
        if ("None".equals(clusterIP)) {
            throw new IllegalStateException("Service: " + serviceName + " in namespace:" + serviceNamespace + "is head-less. Search for endpoints instead.");
        }

        Integer portNumber = port.getPort();
        if (StringUtils.isBlank(clusterIP)) {
            IngressList ingresses = client.extensions().ingresses().inNamespace(serviceNamespace).list();
            if (ingresses != null) {
                List<Ingress> items = ingresses.getItems();
                if (items != null) {
                    for (Ingress item : items) {
                        String ns = KubernetesHelper.getNamespace(item);
                        if (Objects.equal(serviceNamespace, ns)) {
                            IngressSpec spec = item.getSpec();
                            if (spec != null) {
                                List<IngressRule> rules = spec.getRules();
                                List<IngressTLS> tls = spec.getTls();
                                if (rules != null) {
                                    for (IngressRule rule : rules) {
                                        HTTPIngressRuleValue http = rule.getHttp();
                                        if (http != null) {
                                            List<HTTPIngressPath> paths = http.getPaths();
                                            if (paths != null) {
                                                for (HTTPIngressPath path : paths) {
                                                    IngressBackend backend = path.getBackend();
                                                    if (backend != null) {
                                                        String backendServiceName = backend.getServiceName();
                                                        if (serviceName.equals(backendServiceName) && portsMatch(port, backend.getServicePort())) {
                                                            String pathPostfix = path.getPath();
                                                            if (tls != null) {
                                                                for (IngressTLS tlsHost : tls) {
                                                                    List<String> hosts = tlsHost.getHosts();
                                                                    if (hosts != null) {
                                                                        for (String host : hosts) {
                                                                            if (StringUtils.isNotBlank(host)) {
                                                                                return String.format("https://%s/%s", host, preparePath(pathPostfix));
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            answer = rule.getHost();
                                                            if (StringUtils.isNotBlank(answer)) {
                                                                return String.format("http://%s/%s",answer, preparePath(pathPostfix));
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // lets try use the status on GKE
            ServiceStatus status = srv.getStatus();
            if (status != null) {
                LoadBalancerStatus loadBalancerStatus = status.getLoadBalancer();
                if (loadBalancerStatus != null) {
                    List<LoadBalancerIngress> loadBalancerIngresses = loadBalancerStatus.getIngress();
                    if (loadBalancerIngresses != null) {
                        for (LoadBalancerIngress loadBalancerIngress : loadBalancerIngresses) {
                            String ip = loadBalancerIngress.getIp();
                            if (StringUtils.isNotBlank(ip)) {
                                clusterIP = ip;
                                break;
                            }
                        }
                    }
                }
            }
        }

        if (StringUtils.isBlank(clusterIP)) {
            // on vanilla kubernetes we can use nodePort to access things externally
            boolean found = false;
            Integer nodePort = port.getNodePort();
            if (nodePort != null) {
                NodeList nodeList = client.nodes().list();
                if (nodeList != null) {
                    List<Node> items = nodeList.getItems();
                    if (items != null) {
                        for (Node item : items) {
                            NodeStatus status = item.getStatus();
                            if (!found && status != null) {
                                List<NodeAddress> addresses = status.getAddresses();
                                if (addresses != null) {
                                    for (NodeAddress address : addresses) {
                                        String ip = address.getAddress();
                                        if (StringUtils.isNotBlank(ip)) {
                                            clusterIP = ip;
                                            portNumber = nodePort;
                                            found = true;
                                            break;
                                        }

                                    }

                                }
                            }
                            if (!found) {
                                NodeSpec spec = item.getSpec();
                                if (spec != null) {
                                    clusterIP = spec.getExternalID();
                                    if (StringUtils.isNotBlank(clusterIP)) {
                                        portNumber = nodePort;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return (serviceProto + "://" + clusterIP + ":" + portNumber).toLowerCase();
    }
public static String getServiceURL ( KubernetesClient client , String serviceName , String serviceNamespace , String serviceProtocol , boolean serviceExternal ) { Service srv = null ; String serviceHost = serviceToHostOrBlank ( serviceName ) ; String servicePort = serviceToPortOrBlank ( serviceName ) ; String serviceProto = serviceProtocol != null ? serviceProtocol : serviceToProtocol ( serviceName , servicePort ) ; //Use specified or fallback namespace. String actualNamespace = StringUtils . isNotBlank ( serviceNamespace ) ? serviceNamespace : client . getNamespace ( ) ; //1. Inside Kubernetes: Services as ENV vars if ( ! serviceExternal && StringUtils . isNotBlank ( serviceHost ) && StringUtils . isNotBlank ( servicePort ) && StringUtils . isNotBlank ( serviceProtocol ) ) { return serviceProtocol + "://" + serviceHost + ":" + servicePort ; //2. Anywhere: When namespace is passed System / Env var. Mostly needed for integration tests. } else if ( StringUtils . isNotBlank ( actualNamespace ) ) { srv = client . services ( ) . inNamespace ( actualNamespace ) . withName ( serviceName ) . get ( ) ; } if ( srv == null ) { // lets try use environment variables String hostAndPort = getServiceHostAndPort ( serviceName , "" , "" ) ; if ( ! hostAndPort . startsWith ( ":" ) ) { return serviceProto + "://" + hostAndPort ; } } if ( srv == null ) { throw new IllegalArgumentException ( "No kubernetes service could be found for name: " + serviceName + " in namespace: " + actualNamespace ) ; } String answer = KubernetesHelper . getOrCreateAnnotations ( srv ) . get ( Fabric8Annotations . SERVICE_EXPOSE_URL . toString ( ) ) ; if ( StringUtils . isNotBlank ( answer ) ) { return answer ; } if ( OpenshiftHelper . isOpenShift ( client ) ) { OpenShiftClient openShiftClient = client . adapt ( OpenShiftClient . class ) ; Route route = openShiftClient . routes ( ) . inNamespace ( actualNamespace ) . withName ( serviceName ) . get ( ) ; if ( route != null ) { return ( serviceProto + "://" + route . getSpec ( ) . getHost ( ) ) . toLowerCase ( ) ; } } ServicePort port = findServicePortByName ( srv , null ) ; if ( port == null ) { throw new RuntimeException ( "Couldn't find port: " + null + " for service:" + serviceName ) ; } String clusterIP = srv . getSpec ( ) . getClusterIP ( ) ; if ( "None" . equals ( clusterIP ) ) { throw new IllegalStateException ( "Service: " + serviceName + " in namespace:" + serviceNamespace + "is head-less. Search for endpoints instead." ) ; } Integer portNumber = port . getPort ( ) ; if ( StringUtils . isBlank ( clusterIP ) ) { IngressList ingresses = client . extensions ( ) . ingresses ( ) . inNamespace ( serviceNamespace ) . list ( ) ; if ( ingresses != null ) { List < Ingress > items = ingresses . getItems ( ) ; if ( items != null ) { for ( Ingress item : items ) { String ns = KubernetesHelper . getNamespace ( item ) ; if ( Objects . equal ( serviceNamespace , ns ) ) { IngressSpec spec = item . getSpec ( ) ; if ( spec != null ) { List < IngressRule > rules = spec . getRules ( ) ; List < IngressTLS > tls = spec . getTls ( ) ; if ( rules != null ) { for ( IngressRule rule : rules ) { HTTPIngressRuleValue http = rule . getHttp ( ) ; if ( http != null ) { List < HTTPIngressPath > paths = http . getPaths ( ) ; if ( paths != null ) { for ( HTTPIngressPath path : paths ) { IngressBackend backend = path . getBackend ( ) ; if ( backend != null ) { String backendServiceName = backend . getServiceName ( ) ; if ( serviceName . equals ( backendServiceName ) && portsMatch ( port , backend . getServicePort ( ) ) ) { String pathPostfix = path . getPath ( ) ; if ( tls != null ) { for ( IngressTLS tlsHost : tls ) { List < String > hosts = tlsHost . getHosts ( ) ; if ( hosts != null ) { for ( String host : hosts ) { if ( StringUtils . isNotBlank ( host ) ) { return String . format ( "https://%s/%s" , host , preparePath ( pathPostfix ) ) ; } } } } } answer = rule . getHost ( ) ; if ( StringUtils . isNotBlank ( answer ) ) { return String . format ( "http://%s/%s" , answer , preparePath ( pathPostfix ) ) ; } } } } } } } } } } } } } // lets try use the status on GKE ServiceStatus status = srv . getStatus ( ) ; if ( status != null ) { LoadBalancerStatus loadBalancerStatus = status . getLoadBalancer ( ) ; if ( loadBalancerStatus != null ) { List < LoadBalancerIngress > loadBalancerIngresses = loadBalancerStatus . getIngress ( ) ; if ( loadBalancerIngresses != null ) { for ( LoadBalancerIngress loadBalancerIngress : loadBalancerIngresses ) { String ip = loadBalancerIngress . getIp ( ) ; if ( StringUtils . isNotBlank ( ip ) ) { clusterIP = ip ; break ; } } } } } } if ( StringUtils . isBlank ( clusterIP ) ) { // on vanilla kubernetes we can use nodePort to access things externally boolean found = false ; Integer nodePort = port . getNodePort ( ) ; if ( nodePort != null ) { NodeList nodeList = client . nodes ( ) . list ( ) ; if ( nodeList != null ) { List < Node > items = nodeList . getItems ( ) ; if ( items != null ) { for ( Node item : items ) { NodeStatus status = item . getStatus ( ) ; if ( ! found && status != null ) { List < NodeAddress > addresses = status . getAddresses ( ) ; if ( addresses != null ) { for ( NodeAddress address : addresses ) { String ip = address . getAddress ( ) ; if ( StringUtils . isNotBlank ( ip ) ) { clusterIP = ip ; portNumber = nodePort ; found = true ; break ; } } } } if ( ! found ) { NodeSpec spec = item . getSpec ( ) ; if ( spec != null ) { clusterIP = spec . getExternalID ( ) ; if ( StringUtils . isNotBlank ( clusterIP ) ) { portNumber = nodePort ; break ; } } } } } } } } return ( serviceProto + "://" + clusterIP + ":" + portNumber ) . toLowerCase ( ) ; }
Returns the URL to access the service; using the environment variables, routes
or service clusterIP address

@throws IllegalArgumentException if the URL cannot be found for the serviceName and namespace
Returns the URL to access the service ; using the environment variables routes or service clusterIP address