Add Kubectl support for Daemon

This commit is contained in:
Ananya Kumar
2015-08-27 10:18:16 -07:00
committed by Mike Danese
parent a92c8b6886
commit 30f5b93d2f
4 changed files with 221 additions and 5 deletions

View File

@@ -21,10 +21,13 @@ import (
"strings"
"time"
fuzz "github.com/google/gofuzz"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/wait"
)
const (
@@ -56,6 +59,8 @@ func ReaperFor(kind string, c client.Interface) (Reaper, error) {
switch kind {
case "ReplicationController":
return &ReplicationControllerReaper{c, Interval, Timeout}, nil
case "Daemon":
return &DaemonReaper{c, Interval, Timeout}, nil
case "Pod":
return &PodReaper{c}, nil
case "Service":
@@ -72,6 +77,10 @@ type ReplicationControllerReaper struct {
client.Interface
pollInterval, timeout time.Duration
}
type DaemonReaper struct {
client.Interface
pollInterval, timeout time.Duration
}
type PodReaper struct {
client.Interface
}
@@ -167,6 +176,62 @@ func (reaper *ReplicationControllerReaper) Stop(namespace, name string, timeout
return fmt.Sprintf("%s stopped", name), nil
}
func (reaper *DaemonReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) (string, error) {
// Retrieve the daemon we want to stop.
daemonClient := reaper.Daemons(namespace)
daemon, err := daemonClient.Get(name)
if err != nil {
return "", err
}
// Update the daemon to select for a non-existent NodeName.
// The daemon manager will then kill all the daemon pods corresponding to daemon daemon.
nodes, err := reaper.Nodes().List(labels.Everything(), fields.Everything())
if err != nil {
return "", err
}
var fuzzer = fuzz.New()
var nameExists bool
numRetries := 1
for try := 0; try <= numRetries; try++ {
var nodeName string
fuzzer.Fuzz(&nodeName)
nameExists = false
for _, node := range nodes.Items {
nameExists = nameExists || node.Name == nodeName
}
if !nameExists {
daemon.Spec.Template.Spec.NodeName = nodeName
break
}
}
if nameExists {
// Probability of reaching here is extremely low, most likely indicates a programming bug/library error.
return "", fmt.Errorf("Failed to stop node.")
}
daemonClient.Update(daemon)
// Wait for the daemon manager to kill all the daemon's daemon pods.
daemonPodsKilled := func() (bool, error) {
updatedDc, err := daemonClient.Get(name)
if err != nil {
// We don't return an error, because returning an error will abort wait.Poll, but
// if there's an error, we want to try getting the daemon again.
return false, nil
}
return updatedDc.Status.CurrentNumberScheduled+updatedDc.Status.NumberMisscheduled == 0, nil
}
if err := wait.Poll(reaper.pollInterval, reaper.timeout, daemonPodsKilled); err != nil {
return "", err
}
// Finally, kill the daemon.
if err := daemonClient.Delete(name); err != nil {
return "", err
}
return fmt.Sprintf("%s stopped", name), nil
}
func (reaper *PodReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) (string, error) {
pods := reaper.Pods(namespace)
_, err := pods.Get(name)