Add IP look up if the Cloud Provider is not null

Add Instance info to the Cloud Provider interface
This commit is contained in:
Brendan Burns 2014-06-17 21:58:41 -07:00
parent c0d8636f40
commit 57869958bc
3 changed files with 61 additions and 1 deletions

View File

@ -16,10 +16,16 @@ limitations under the License.
package cloudprovider package cloudprovider
import (
"net"
)
// CloudInterface is an abstract, pluggable interface for cloud providers // CloudInterface is an abstract, pluggable interface for cloud providers
type Interface interface { type Interface interface {
// TCPLoadBalancer returns a balancer interface, or nil if none is supported. Returns an error if one occurs. // TCPLoadBalancer returns a balancer interface, or nil if none is supported. Returns an error if one occurs.
TCPLoadBalancer() (TCPLoadBalancer, error) TCPLoadBalancer() (TCPLoadBalancer, error)
// Instances returns an instances interface, or nil if none is supported. Returns an error if one occurs.
Instances() (Instances, error)
} }
type TCPLoadBalancer interface { type TCPLoadBalancer interface {
@ -29,3 +35,7 @@ type TCPLoadBalancer interface {
UpdateTCPLoadBalancer(name, region string, hosts []string) error UpdateTCPLoadBalancer(name, region string, hosts []string) error
DeleteTCPLoadBalancer(name, region string) error DeleteTCPLoadBalancer(name, region string) error
} }
type Instances interface {
IPAddress(name string) (net.IP, error)
}

View File

@ -19,6 +19,7 @@ package cloudprovider
import ( import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
@ -82,6 +83,10 @@ func (gce *GCECloud) TCPLoadBalancer() (TCPLoadBalancer, error) {
return gce, nil return gce, nil
} }
func (gce *GCECloud) Instances() (Instances, error) {
return gce, nil
}
func makeHostLink(projectID, zone, host string) string { func makeHostLink(projectID, zone, host string) string {
ix := strings.Index(host, ".") ix := strings.Index(host, ".")
if ix != -1 { if ix != -1 {
@ -162,3 +167,15 @@ func (gce *GCECloud) DeleteTCPLoadBalancer(name, region string) error {
_, err = gce.service.TargetPools.Delete(gce.projectID, region, name).Do() _, err = gce.service.TargetPools.Delete(gce.projectID, region, name).Do()
return err return err
} }
func (gce *GCECloud) IPAddress(instance string) (net.IP, error) {
res, err := gce.service.Instances.Get(gce.projectID, gce.zone, instance).Do()
if err != nil {
return nil, err
}
ip := net.ParseIP(res.NetworkInterfaces[0].AccessConfigs[0].NatIP)
if ip == nil {
return nil, fmt.Errorf("Invalid network IP: %s", res.NetworkInterfaces[0].AccessConfigs[0].NatIP)
}
return ip, nil
}

View File

@ -18,10 +18,14 @@ package registry
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"log"
"net"
"strings"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels" "github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
) )
@ -30,13 +34,15 @@ type PodRegistryStorage struct {
registry PodRegistry registry PodRegistry
containerInfo client.ContainerInfo containerInfo client.ContainerInfo
scheduler Scheduler scheduler Scheduler
cloud cloudprovider.Interface
} }
func MakePodRegistryStorage(registry PodRegistry, containerInfo client.ContainerInfo, scheduler Scheduler) apiserver.RESTStorage { func MakePodRegistryStorage(registry PodRegistry, containerInfo client.ContainerInfo, scheduler Scheduler, cloud cloudprovider.Interface) apiserver.RESTStorage {
return &PodRegistryStorage{ return &PodRegistryStorage{
registry: registry, registry: registry,
containerInfo: containerInfo, containerInfo: containerInfo,
scheduler: scheduler, scheduler: scheduler,
cloud: cloud,
} }
} }
@ -63,6 +69,31 @@ func makePodStatus(info interface{}) string {
return "Pending" return "Pending"
} }
func getInstanceIP(cloud cloudprovider.Interface, host string) string {
if cloud == nil {
return ""
}
instances, err := cloud.Instances()
if instances == nil {
return ""
}
if err != nil {
log.Printf("Error getting instances: %#v", err)
return ""
}
ix := strings.Index(host, ".")
if ix != -1 {
host = host[:ix]
}
var addr net.IP
addr, err = instances.IPAddress(host)
if err != nil {
log.Printf("Error getting instance IP: %#v", err)
return ""
}
return addr.String()
}
func (storage *PodRegistryStorage) Get(id string) (interface{}, error) { func (storage *PodRegistryStorage) Get(id string) (interface{}, error) {
pod, err := storage.registry.GetPod(id) pod, err := storage.registry.GetPod(id)
if err != nil { if err != nil {
@ -74,6 +105,8 @@ func (storage *PodRegistryStorage) Get(id string) (interface{}, error) {
} }
pod.CurrentState.Info = info pod.CurrentState.Info = info
pod.CurrentState.Status = makePodStatus(info) pod.CurrentState.Status = makePodStatus(info)
pod.CurrentState.HostIP = getInstanceIP(storage.cloud, pod.CurrentState.Host)
pod.Kind = "cluster#pod" pod.Kind = "cluster#pod"
return pod, err return pod, err
} }