func buildAppConfig(kubeClient *kubernetes.Clientset, service v1.Service, routerConfig *RouterConfig) (*AppConfig, error) { appConfig := newAppConfig(routerConfig) appConfig.Name = service.Labels["app"] // If we didn't get the app name from the app label, fall back to inferring the app name from // the service's own name. if appConfig.Name == "" { appConfig.Name = service.Name } // if app name and Namespace are not same then combine the two as it // makes deis services (as an example) clearer, such as deis/controller if appConfig.Name != service.Namespace { appConfig.Name = service.Namespace + "/" + appConfig.Name } err := modeler.MapToModel(service.Annotations, "", appConfig) if err != nil { return nil, err } // If no domains are found, we don't have the information we need to build routes // to this application. Abort. if len(appConfig.Domains) == 0 { return nil, nil } // Step through the domains, and decide which cert, if any, will be used for securing each. // For each that is a FQDN, we'll look to see if a corresponding cert-bearing secret also // exists. If so, that will be used. If a domain isn't an FQDN we will use the default cert-- // even if that is nil. for _, domain := range appConfig.Domains { if strings.Contains(domain, ".") { // Look for a cert-bearing secret for this domain. if certMapping, ok := appConfig.CertMappings[domain]; ok { secretName := fmt.Sprintf("%s-cert", certMapping) certSecret, err := getSecret(kubeClient, secretName, service.Namespace) if err != nil { return nil, err } if certSecret != nil { certificate, err := buildCertificate(certSecret, domain) if err != nil { return nil, err } appConfig.Certificates[domain] = certificate } } } else { appConfig.Certificates[domain] = routerConfig.PlatformCertificate } } appConfig.ServiceIP = service.Spec.ClusterIP endpointsClient := kubeClient.Endpoints(service.Namespace) endpoints, err := endpointsClient.Get(service.Name) if err != nil { return nil, err } appConfig.Available = len(endpoints.Subsets) > 0 && len(endpoints.Subsets[0].Addresses) > 0 return appConfig, nil }