// NewCluster returns a usable cluster. Host should be of the form // "http://hostname:8080". func NewCluster(config *restclient.Config, kubectl string, logger log.Logger) (*Cluster, error) { client, err := k8sclient.New(config) if err != nil { return nil, err } extclient, err := k8sclient.NewExtensions(config) if err != nil { return nil, err } if kubectl == "" { kubectl, err = exec.LookPath("kubectl") if err != nil { return nil, err } } else { if _, err := os.Stat(kubectl); err != nil { return nil, err } } logger.Log("kubectl", kubectl) c := &Cluster{ config: config, client: extendedClient{client, extclient}, kubectl: kubectl, status: newStatusMap(), actionc: make(chan func()), logger: logger, } go c.loop() return c, nil }
// NewClient returns a usable Client. Don't forget to Stop it. func NewClient(addr string, resyncPeriod time.Duration) (Client, error) { var config *restclient.Config if addr != "" { config = &restclient.Config{Host: addr} } else { // If no API server address was provided, assume we are running // inside a pod. Try to connect to the API server through its // Service environment variables, using the default Service // Account Token. var err error if config, err = restclient.InClusterConfig(); err != nil { return nil, err } } c, err := unversioned.New(config) if err != nil { return nil, err } ec, err := unversioned.NewExtensions(config) if err != nil { return nil, err } result := &client{ quit: make(chan struct{}), resyncPeriod: resyncPeriod, client: c, extensionsClient: ec, } result.podStore = &cache.StoreToPodLister{Store: result.setupStore(c, "pods", &api.Pod{})} result.serviceStore = &cache.StoreToServiceLister{Store: result.setupStore(c, "services", &api.Service{})} result.replicationControllerStore = &cache.StoreToReplicationControllerLister{Store: result.setupStore(c, "replicationcontrollers", &api.ReplicationController{})} result.nodeStore = &cache.StoreToNodeLister{Store: result.setupStore(c, "nodes", &api.Node{})} // We list deployments here to check if this version of kubernetes is >= 1.2. // We would use NegotiateVersion, but Kubernetes 1.1 "supports" // extensions/v1beta1, but not deployments or replicasets. if _, err := ec.Deployments(api.NamespaceAll).List(api.ListOptions{}); err != nil { log.Infof("Deployments and ReplicaSets are not supported by this Kubernetes version") } else { result.deploymentStore = &cache.StoreToDeploymentLister{Store: result.setupStore(ec, "deployments", &extensions.Deployment{})} result.replicaSetStore = &cache.StoreToReplicaSetLister{Store: result.setupStore(ec, "replicasets", &extensions.ReplicaSet{})} } return result, nil }