2015-01-14 02:31:27 +03:00
|
|
|
package registry
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
2015-02-08 02:15:35 +03:00
|
|
|
"sync"
|
2015-01-14 02:31:27 +03:00
|
|
|
|
|
|
|
k8s "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
|
|
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
|
|
|
)
|
|
|
|
|
|
|
|
type KubernetesRegistry struct {
|
|
|
|
Client *k8s.Client
|
|
|
|
Namespace string
|
2015-02-08 02:15:35 +03:00
|
|
|
|
|
|
|
mtx sync.RWMutex
|
|
|
|
services map[string]Service
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *KubernetesRegistry) Watch() {
|
|
|
|
NewKubernetesWatcher(c)
|
2015-01-14 02:31:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *KubernetesRegistry) Deregister(s Service) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *KubernetesRegistry) Register(s Service) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *KubernetesRegistry) GetService(name string) (Service, error) {
|
2015-02-08 02:15:35 +03:00
|
|
|
c.mtx.RLock()
|
|
|
|
service, ok := c.services[name]
|
|
|
|
c.mtx.RUnlock()
|
|
|
|
|
|
|
|
if ok {
|
|
|
|
return service, nil
|
|
|
|
}
|
|
|
|
|
2015-01-14 02:31:27 +03:00
|
|
|
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 (c *KubernetesRegistry) NewService(name string, nodes ...Node) Service {
|
|
|
|
var snodes []*KubernetesNode
|
|
|
|
|
|
|
|
for _, node := range nodes {
|
|
|
|
if n, ok := node.(*KubernetesNode); ok {
|
|
|
|
snodes = append(snodes, n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return &KubernetesService{
|
|
|
|
ServiceName: name,
|
|
|
|
ServiceNodes: snodes,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *KubernetesRegistry) NewNode(id, address string, port int) Node {
|
|
|
|
return &KubernetesNode{
|
|
|
|
NodeId: id,
|
|
|
|
NodeAddress: address,
|
|
|
|
NodePort: port,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewKubernetesRegistry() Registry {
|
|
|
|
client, _ := k8s.New(&k8s.Config{
|
|
|
|
Host: "http://" + os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT"),
|
|
|
|
})
|
|
|
|
|
2015-02-08 02:15:35 +03:00
|
|
|
kr := &KubernetesRegistry{
|
2015-01-14 02:31:27 +03:00
|
|
|
Client: client,
|
|
|
|
Namespace: "default",
|
2015-02-08 02:15:35 +03:00
|
|
|
services: make(map[string]Service),
|
2015-01-14 02:31:27 +03:00
|
|
|
}
|
2015-02-08 02:15:35 +03:00
|
|
|
|
|
|
|
kr.Watch()
|
|
|
|
|
|
|
|
return kr
|
2015-01-14 02:31:27 +03:00
|
|
|
}
|