| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | package k8sclient
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	"errors"
 | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 	"log"
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	"net/url"
 | 
					
						
							|  |  |  | 	"strings"
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // API strings
 | 
					
						
							|  |  |  | const (
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	apiBase       = "/api/v1"
 | 
					
						
							|  |  |  | 	apiNamespaces = "/namespaces"
 | 
					
						
							|  |  |  | 	apiServices   = "/services"
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Defaults
 | 
					
						
							|  |  |  | const (
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	defaultBaseURL = "http://localhost:8080"
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type K8sConnector struct {
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	baseURL string
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func (c *K8sConnector) SetBaseURL(u string) error {
 | 
					
						
							|  |  |  | 	url, error := url.Parse(u)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if error != nil {
 | 
					
						
							|  |  |  | 		return error
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	if !url.IsAbs() {
 | 
					
						
							|  |  |  | 		return errors.New("k8sclient: Kubernetes endpoint url must be an absolute URL")
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	c.baseURL = url.String()
 | 
					
						
							|  |  |  | 	return nil
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func (c *K8sConnector) GetBaseURL() string {
 | 
					
						
							|  |  |  | 	return c.baseURL
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | // URL constructor separated from code to support dependency injection
 | 
					
						
							|  |  |  | // for unit tests.
 | 
					
						
							|  |  |  | var makeURL = func(parts []string) string {
 | 
					
						
							|  |  |  | 	return strings.Join(parts, "")
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func (c *K8sConnector) GetResourceList() (*ResourceList, error) {
 | 
					
						
							|  |  |  | 	resources := new(ResourceList)
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	url := makeURL([]string{c.baseURL, apiBase})
 | 
					
						
							|  |  |  | 	err := parseJson(url, resources)
 | 
					
						
							|  |  |  | 	// TODO: handle no response from k8s
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 		log.Printf("[ERROR] Response from kubernetes API for GetResourceList() is: %v\n", err)
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		return nil, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	return resources, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func (c *K8sConnector) GetNamespaceList() (*NamespaceList, error) {
 | 
					
						
							|  |  |  | 	namespaces := new(NamespaceList)
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	url := makeURL([]string{c.baseURL, apiBase, apiNamespaces})
 | 
					
						
							|  |  |  | 	err := parseJson(url, namespaces)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 		log.Printf("[ERROR] Response from kubernetes API for GetNamespaceList() is: %v\n", err)
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		return nil, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	return namespaces, nil
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func (c *K8sConnector) GetServiceList() (*ServiceList, error) {
 | 
					
						
							|  |  |  | 	services := new(ServiceList)
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	url := makeURL([]string{c.baseURL, apiBase, apiServices})
 | 
					
						
							|  |  |  | 	err := parseJson(url, services)
 | 
					
						
							|  |  |  | 	// TODO: handle no response from k8s
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 		log.Printf("[ERROR] Response from kubernetes API for GetServiceList() is: %v\n", err)
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		return nil, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	return services, nil
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | // GetServicesByNamespace returns a map of
 | 
					
						
							|  |  |  | // namespacename :: [ kubernetesServiceItem ]
 | 
					
						
							|  |  |  | func (c *K8sConnector) GetServicesByNamespace() (map[string][]ServiceItem, error) {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	items := make(map[string][]ServiceItem)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	k8sServiceList, err := c.GetServiceList()
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 		log.Printf("[ERROR] Getting service list produced error: %v", err)
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		return nil, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	// TODO: handle no response from k8s
 | 
					
						
							|  |  |  | 	if k8sServiceList == nil {
 | 
					
						
							|  |  |  | 		return nil, nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	k8sItemList := k8sServiceList.Items
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	for _, i := range k8sItemList {
 | 
					
						
							|  |  |  | 		namespace := i.Metadata.Namespace
 | 
					
						
							|  |  |  | 		items[namespace] = append(items[namespace], i)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	return items, nil
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | func NewK8sConnector(baseURL string) *K8sConnector {
 | 
					
						
							|  |  |  | 	k := new(K8sConnector)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if baseURL == "" {
 | 
					
						
							|  |  |  | 		baseURL = defaultBaseURL
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	err := k.SetBaseURL(baseURL)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	return k
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | }
 |