func ReaperFor(kind schema.GroupKind, c internalclientset.Interface) (Reaper, error) { switch kind { case api.Kind("ReplicationController"): return &ReplicationControllerReaper{c.Core(), Interval, Timeout}, nil case extensions.Kind("ReplicaSet"): return &ReplicaSetReaper{c.Extensions(), Interval, Timeout}, nil case extensions.Kind("DaemonSet"): return &DaemonSetReaper{c.Extensions(), Interval, Timeout}, nil case api.Kind("Pod"): return &PodReaper{c.Core()}, nil case api.Kind("Service"): return &ServiceReaper{c.Core()}, nil case extensions.Kind("Job"), batch.Kind("Job"): return &JobReaper{c.Batch(), c.Core(), Interval, Timeout}, nil case apps.Kind("StatefulSet"): return &StatefulSetReaper{c.Apps(), c.Core(), Interval, Timeout}, nil case extensions.Kind("Deployment"): return &DeploymentReaper{c.Extensions(), c.Extensions(), Interval, Timeout}, nil } return nil, &NoSuchReaperError{kind} }
func ReaperFor(kind unversioned.GroupKind, c client.Interface) (Reaper, error) { switch kind { case api.Kind("ReplicationController"): return &ReplicationControllerReaper{c, Interval, Timeout}, nil case extensions.Kind("ReplicaSet"): return &ReplicaSetReaper{c, Interval, Timeout}, nil case extensions.Kind("DaemonSet"): return &DaemonSetReaper{c, Interval, Timeout}, nil case api.Kind("Pod"): return &PodReaper{c}, nil case api.Kind("Service"): return &ServiceReaper{c}, nil case extensions.Kind("Job"), batch.Kind("Job"): return &JobReaper{c, Interval, Timeout}, nil case apps.Kind("PetSet"): return &PetSetReaper{c, Interval, Timeout}, nil case extensions.Kind("Deployment"): return &DeploymentReaper{c, Interval, Timeout}, nil } return nil, &NoSuchReaperError{kind} }
func ScalerFor(kind schema.GroupKind, c internalclientset.Interface) (Scaler, error) { switch kind { case api.Kind("ReplicationController"): return &ReplicationControllerScaler{c.Core()}, nil case extensions.Kind("ReplicaSet"): return &ReplicaSetScaler{c.Extensions()}, nil case extensions.Kind("Job"), batch.Kind("Job"): return &JobScaler{c.Batch()}, nil // Either kind of job can be scaled with Batch interface. case apps.Kind("StatefulSet"): return &StatefulSetScaler{c.Apps()}, nil case extensions.Kind("Deployment"): return &DeploymentScaler{c.Extensions()}, nil } return nil, fmt.Errorf("no scaler has been implemented for %q", kind) }
func (reaper *PetSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { petsets := reaper.Apps().PetSets(namespace) scaler, err := ScalerFor(apps.Kind("PetSet"), *reaper) if err != nil { return err } ps, err := petsets.Get(name) if err != nil { return err } if timeout == 0 { numPets := ps.Spec.Replicas timeout = Timeout + time.Duration(10*numPets)*time.Second } retry := NewRetryParams(reaper.pollInterval, reaper.timeout) waitForPetSet := NewRetryParams(reaper.pollInterval, reaper.timeout) if err = scaler.Scale(namespace, name, 0, nil, retry, waitForPetSet); err != nil { return err } // TODO: This shouldn't be needed, see corresponding TODO in PetSetHasDesiredPets. // PetSet should track generation number. pods := reaper.Pods(namespace) selector, _ := unversioned.LabelSelectorAsSelector(ps.Spec.Selector) options := api.ListOptions{LabelSelector: selector} podList, err := pods.List(options) if err != nil { return err } errList := []error{} for _, pod := range podList.Items { if err := pods.Delete(pod.Name, gracePeriod); err != nil { if !errors.IsNotFound(err) { errList = append(errList, err) } } } if len(errList) > 0 { return utilerrors.NewAggregate(errList) } // TODO: Cleanup volumes? We don't want to accidentally delete volumes from // stop, so just leave this up to the the petset. return petsets.Delete(name, nil) }
// resourcesToCheck is a map of resources and corresponding kinds of things that // we want handled in this plugin // TODO: Include a function that will extract the PodSpec from the resource for // each type added here. var resourcesToCheck = map[unversioned.GroupResource]unversioned.GroupKind{ kapi.Resource("pods"): kapi.Kind("Pod"), kapi.Resource("podtemplates"): kapi.Kind("PodTemplate"), kapi.Resource("replicationcontrollers"): kapi.Kind("ReplicationController"), batch.Resource("jobs"): batch.Kind("Job"), batch.Resource("jobtemplates"): batch.Kind("JobTemplate"), batch.Resource("scheduledjobs"): batch.Kind("ScheduledJob"), extensions.Resource("deployments"): extensions.Kind("Deployment"), extensions.Resource("replicasets"): extensions.Kind("ReplicaSet"), extensions.Resource("jobs"): extensions.Kind("Job"), extensions.Resource("jobtemplates"): extensions.Kind("JobTemplate"), apps.Resource("petsets"): apps.Kind("PetSet"), deployapi.Resource("deploymentconfigs"): deployapi.Kind("DeploymentConfig"), securityapi.Resource("podsecuritypolicysubjectreviews"): securityapi.Kind("PodSecurityPolicySubjectReview"), securityapi.Resource("podsecuritypolicyselfsubjectreviews"): securityapi.Kind("PodSecurityPolicySelfSubjectReview"), securityapi.Resource("podsecuritypolicyreviews"): securityapi.Kind("PodSecurityPolicyReview"), } // resourcesToIgnore is a list of resource kinds that contain a PodSpec that // we choose not to handle in this plugin var resourcesToIgnore = []unversioned.GroupKind{ extensions.Kind("DaemonSet"), } func shouldCheckResource(resource unversioned.GroupResource, kind unversioned.GroupKind) (bool, error) { expectedKind, shouldCheck := resourcesToCheck[resource] if !shouldCheck {