// FastGetPodsToMove returns a list of pods that should be moved elsewhere if the node // is drained. Raises error if there is an unreplicated pod and force option was not specified. // Based on kubectl drain code. It makes an assumption that RC, DS, Jobs and RS were deleted // along with their pods (no abandoned pods with dangling created-by annotation). Usefull for fast // checks. Doesn't check i func FastGetPodsToMove(nodeInfo *schedulercache.NodeInfo, skipNodesWithSystemPods bool, skipNodesWithLocalStorage bool) ([]*api.Pod, error) { return drain.GetPodsForDeletionOnNodeDrain( nodeInfo.Pods(), api.Codecs.UniversalDecoder(), skipNodesWithSystemPods, skipNodesWithLocalStorage, false, nil, 0) }
// DetailedGetPodsForMove returns a list of pods that should be moved elsewhere if the node // is drained. Raises error if there is an unreplicated pod and force option was not specified. // Based on kubectl drain code. It checks whether RC, DS, Jobs and RS that created these pods // still exist. func DetailedGetPodsForMove(nodeInfo *schedulercache.NodeInfo, skipNodesWithSystemPods bool, skipNodesWithLocalStorage bool, client *unversionedclient.Client, minReplicaCount int32) ([]*api.Pod, error) { return drain.GetPodsForDeletionOnNodeDrain( nodeInfo.Pods(), api.Codecs.UniversalDecoder(), skipNodesWithSystemPods, skipNodesWithLocalStorage, true, client, minReplicaCount) }
// GetRequiredPodsForNode returns a list od pods that would appear on the node if the // node was just created (like deamonset and manifest-run pods). It reuses kubectl // drain command to get the list. func GetRequiredPodsForNode(nodename string, client kube_client.Interface) ([]*apiv1.Pod, error) { podListResult, err := client.Core().Pods(apiv1.NamespaceAll).List( apiv1.ListOptions{FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodename}).String()}) if err != nil { return []*apiv1.Pod{}, err } allPods := make([]*apiv1.Pod, 0) for i := range podListResult.Items { allPods = append(allPods, &podListResult.Items[i]) } podsToRemoveList, err := drain.GetPodsForDeletionOnNodeDrain( allPods, api.Codecs.UniversalDecoder(), true, // Force all removals. false, false, false, // Setting this to true requires client to be not-null. nil, 0) if err != nil { return []*apiv1.Pod{}, err } podsToRemoveMap := make(map[string]struct{}) for _, pod := range podsToRemoveList { podsToRemoveMap[pod.SelfLink] = struct{}{} } podsOnNewNode := make([]*apiv1.Pod, 0) for _, pod := range allPods { if _, found := podsToRemoveMap[pod.SelfLink]; !found { podsOnNewNode = append(podsOnNewNode, pod) } } return podsOnNewNode, nil }