in pkg/controller/podgroup.go [185:268]
func (ctrl *PodGroupController) syncHandler(key string) error {
// Convert the namespace/name string into a distinct namespace and name
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
runtime.HandleError(fmt.Errorf("invalid resource key: %s", key))
return nil
}
defer func() {
if err != nil {
ctrl.pgQueue.AddRateLimited(key)
return
}
}()
pg, err := ctrl.pgLister.PodGroups(namespace).Get(name)
if apierrs.IsNotFound(err) {
klog.V(5).Infof("Pod group %q has been deleted ", key)
return nil
}
if err != nil {
klog.V(3).Infof("Unable to retrieve pod group %q from store: %v", key, err)
return err
}
pgCopy := pg.DeepCopy()
selector := labels.Set(map[string]string{util.PodGroupLabel: pgCopy.Name}).AsSelector()
pods, err := ctrl.podLister.List(selector)
if err != nil {
klog.Errorf("List pods for group %v failed: %v", pgCopy.Name, err)
return err
}
switch pgCopy.Status.Phase {
case "":
pgCopy.Status.Phase = schedv1alpha1.PodGroupPending
case schedv1alpha1.PodGroupPending:
if len(pods) >= int(pg.Spec.MinMember) {
pgCopy.Status.Phase = schedv1alpha1.PodGroupPreScheduling
fillOccupiedObj(pg, pods[0])
}
default:
var (
running int32 = 0
succeeded int32 = 0
failed int32 = 0
)
if len(pods) != 0 {
for _, pod := range pods {
switch pod.Status.Phase {
case v1.PodRunning:
running++
case v1.PodSucceeded:
succeeded++
case v1.PodFailed:
failed++
}
}
}
pgCopy.Status.Failed = failed
pgCopy.Status.Succeeded = succeeded
pgCopy.Status.Running = running
if pgCopy.Status.Scheduled >= pgCopy.Spec.MinMember && pgCopy.Status.Phase == schedv1alpha1.PodGroupScheduling {
pgCopy.Status.Phase = schedv1alpha1.PodGroupScheduled
}
if pgCopy.Status.Succeeded+pgCopy.Status.Running >= pg.Spec.MinMember && pgCopy.Status.Phase == schedv1alpha1.PodGroupScheduled {
pgCopy.Status.Phase = schedv1alpha1.PodGroupRunning
}
// Final state of pod group
if pgCopy.Status.Failed != 0 && pgCopy.Status.Failed+pgCopy.Status.Running+pgCopy.Status.Succeeded >= pg.Spec.
MinMember {
pgCopy.Status.Phase = schedv1alpha1.PodGroupFailed
}
if pgCopy.Status.Succeeded >= pg.Spec.MinMember {
pgCopy.Status.Phase = schedv1alpha1.PodGroupFinished
}
}
err = ctrl.patchPodGroup(pg, pgCopy)
if err == nil {
ctrl.pgQueue.Forget(pg)
}
return err
}