All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.hyscale.deployer.services.model.PodStatusUtil Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
/**
 * Copyright 2019 Pramati Prism, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.hyscale.deployer.services.model;

import java.util.List;

import io.kubernetes.client.openapi.models.V1ContainerState;
import io.kubernetes.client.openapi.models.V1ContainerStatus;
import io.kubernetes.client.openapi.models.V1Pod;

public class PodStatusUtil {
    
    private PodStatusUtil() {}

    public static String currentStatusOf(V1Pod v1Pod) {
        if (v1Pod == null) {
            return null;
        }
        String initContainerAggStatus = validateAndGetInitContainerStatuses(
                v1Pod.getStatus().getInitContainerStatuses());
        if (initContainerAggStatus != null) {
            return initContainerAggStatus;
        }
        if(v1Pod.getMetadata().getDeletionTimestamp() != null){
            return PodStatus.TERMINATING.getStatus();
        }
        String containerAggStatus = validateAndGetContainerStatuses(v1Pod.getStatus().getContainerStatuses(), false);
        return containerAggStatus != null ? containerAggStatus : v1Pod.getStatus().getPhase();
    }

    public static String lastStateOf(V1Pod v1Pod) {
        if (v1Pod == null) {
            return null;
        }
        String initContainerAggStatus = validateAndGetInitContainerStatuses(
                v1Pod.getStatus().getInitContainerStatuses());
        if (initContainerAggStatus != null) {
            return initContainerAggStatus;
        }
        if(v1Pod.getMetadata().getDeletionTimestamp() != null){
            return PodStatus.TERMINATING.getStatus();
        }
        String containerAggStatus = validateAndGetContainerStatuses(v1Pod.getStatus().getContainerStatuses(), true);
        return containerAggStatus != null ? containerAggStatus : v1Pod.getStatus().getPhase();
    }

    private static String validateAndGetContainerStatuses(List containerStatuses, boolean withLastState) {
        if (containerStatuses == null || containerStatuses.isEmpty()) {
            return null;
        }
        String aggregateStatus = null;
        for (V1ContainerStatus each : containerStatuses) {
            if (withLastState && !each.getReady() && each.getLastState() != null) {
                if (each.getLastState().getTerminated() != null) {
                    aggregateStatus = each.getLastState().getTerminated().getReason();
                    break;
                } else if (each.getLastState().getWaiting() != null) {
                    aggregateStatus = each.getLastState().getWaiting().getReason();
                    break;
                }
            }
            if (each.getState().getRunning() == null) {
                if (each.getState().getTerminated() != null) {
                    aggregateStatus = each.getState().getTerminated().getReason();
                    break;
                } else if (each.getState().getWaiting() != null) {
                    aggregateStatus = each.getState().getWaiting().getReason();
                    break;
                }
            }
        }
        return aggregateStatus;
    }

    /**
     * @param initContainerStatuses
     * @return status of init container in waiting state, else null
     */
    private static String validateAndGetInitContainerStatuses(List initContainerStatuses) {
        if (initContainerStatuses == null || initContainerStatuses.isEmpty()) {
            return null;
        }
        String initContainerStatus = null;
        for (V1ContainerStatus each : initContainerStatuses) {
            if (each.getState().getTerminated() != null && each.getReady()) {
                // do nothing
            } else if (each.getState().getWaiting() != null) {
                initContainerStatus = each.getState().getWaiting().getReason();
                break;
            } else if (each.getState().getRunning() != null) {
                // TODO Handle
            }
        }
        return initContainerStatus;
    }
    
	public static V1ContainerState getLastState(V1Pod pod) {
		List v1ContainerStatus = pod.getStatus().getContainerStatuses();
		for (V1ContainerStatus containerStatus : v1ContainerStatus) {
			if (!containerStatus.getReady()) {
				return containerStatus.getLastState();
			}
		}
		return null;
	}

	public static Integer getExitCode(V1ContainerState v1ContainerState) {
		if (v1ContainerState!=null && v1ContainerState.getTerminated() != null) {
			return v1ContainerState.getTerminated().getExitCode();
		}
		return null;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy