func (c *KubernetesRegistry) GetService(name string) (Service, error) {
	c.mtx.RLock()
	service, ok := c.services[name]
	c.mtx.RUnlock()

	if ok {
		return service, nil
	}

	services, err := c.Client.Services(c.Namespace).List(labels.OneTermEqualSelector("name", name))
	if err != nil {
		return nil, err
	}

	if len(services.Items) == 0 {
		return nil, fmt.Errorf("Service not found")
	}

	ks := &KubernetesService{ServiceName: name}
	for _, item := range services.Items {
		ks.ServiceNodes = append(ks.ServiceNodes, &KubernetesNode{
			NodeAddress: item.Spec.PortalIP,
			NodePort:    item.Spec.Port,
		})
	}

	return ks, nil
}
func (k KubernetesExecutor) DeleteReplicationController(id string) error {
	// Maybe find the desired ReplicationController
	rc, err := k.GetReplicationController(id)
	if err != nil {
		return err
	}

	// Maybe find Services labeled for that ReplicationController
	forService := labels.OneTermEqualSelector("service-name", rc.ObjectMeta.Name)
	sl, err := k.client.Services(namespace).List(forService)
	if err != nil {
		return err
	}

	// Delete all found Services
	for _, s := range sl.Items {
		if err := k.client.Services(namespace).Delete(s.ObjectMeta.Name); err != nil {
			return err
		}
	}

	// Scale down the ReplicationController, deleting Pods
	rc.Spec.Replicas = 0
	if _, err := k.client.ReplicationControllers(namespace).Update(&rc); err != nil {
		return err
	}

	// Delete the ReplicationController
	if err := k.client.ReplicationControllers(namespace).Delete(id); err != nil {
		return err
	}

	// Profit?
	return nil
}
// NewSourceApiserver creates a config source that watches and pulls from the apiserver.
func NewSourceApiserver(client *client.Client, hostname string, updates chan<- interface{}) {
	lw := &cache.ListWatch{
		Client:        client,
		FieldSelector: labels.OneTermEqualSelector("Status.Host", hostname),
		Resource:      "pods",
	}
	newSourceApiserverFromLW(lw, updates)
}
func statusFromReplicationController(rc api.ReplicationController) (string, error) {
	desired := rc.Spec.Replicas
	actual := rc.Status.Replicas

	if actual < desired {
		return "pending", nil
	} else if desired == actual {
		selector := labels.OneTermEqualSelector("service-name", rc.ObjectMeta.Name)
		pods, err := DefaultExecutor.GetPods(selector)
		if err != nil {
			return "", err
		}
		runningCount := 0
		for _, p := range pods {
			if p.Status.Phase == api.PodRunning {
				runningCount++
			}
		}

		return fmt.Sprintf("running %v/%v", runningCount, desired), nil
	}

	return "unknown", nil
}