Add Kubectl support for Daemon
This commit is contained in:

committed by
Mike Danese

parent
a92c8b6886
commit
30f5b93d2f
@@ -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)
|
||||
|
Reference in New Issue
Block a user