shardingsphere-operator/pkg/reconcile/computenode/utils.go (125 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 computenode
import (
"fmt"
"time"
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func relativeMySQLDriverMountName(v string) string {
return fmt.Sprintf("mysql-connector-java-%s.jar", v)
}
func absoluteMySQLDriverMountName(p, v string) string {
return fmt.Sprintf("%s/%s", p, relativeMySQLDriverMountName(v))
}
func getContainerPortsFromComputeNode(cn *v1alpha1.ComputeNode) []corev1.ContainerPort {
ports := []corev1.ContainerPort{}
for idx := range cn.Spec.PortBindings {
ports = append(ports, corev1.ContainerPort{
Name: cn.Spec.PortBindings[idx].Name,
HostIP: cn.Spec.PortBindings[idx].HostIP,
ContainerPort: cn.Spec.PortBindings[idx].ContainerPort,
Protocol: cn.Spec.PortBindings[idx].Protocol,
})
}
return ports
}
// GetConditionFromPods returns the condition for a pod
func GetConditionFromPods(podlist *corev1.PodList) []v1alpha1.ComputeNodeCondition {
conds := []v1alpha1.ComputeNodeCondition{}
if len(podlist.Items) == 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionUnknown, "PodNotFound", "No pod was found"))
return conds
}
result := map[v1alpha1.ComputeNodeConditionType]int{}
for i := range podlist.Items {
pcs := getPreferedConditionFromPod(&podlist.Items[i])
for idx := range pcs {
result[pcs[idx].Type]++
}
}
if result[v1alpha1.ComputeNodeConditionUnknown] == len(podlist.Items) {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionUnknown, "PodUnknown", "All pods are unknown"))
}
if result[v1alpha1.ComputeNodeConditionReady] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionReady, "PodReady", "Some pods are ready"))
}
if result[v1alpha1.ComputeNodeConditionStarted] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionStarted, "PodStarted", "Some pods are started"))
}
if result[v1alpha1.ComputeNodeConditionInitialized] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionInitialized, "PodInitialized", "Some pods are initialized"))
}
if result[v1alpha1.ComputeNodeConditionDeployed] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionDeployed, "PodDeployed", "Some pods are deployed"))
}
if result[v1alpha1.ComputeNodeConditionPending] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionPending, "PodPending", "Some pods are pending"))
}
if result[v1alpha1.ComputeNodeConditionFailed] > 0 {
conds = append(conds, newCondition(v1alpha1.ComputeNodeConditionFailed, "PodFailed", "Some pods are failed"))
}
return conds
}
func getPreferedConditionFromPod(pod *corev1.Pod) []v1alpha1.ComputeNodeCondition {
computenodeConditions := []v1alpha1.ComputeNodeCondition{}
if pod.Status.Phase == corev1.PodUnknown {
computenodeConditions = append(computenodeConditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionUnknown,
})
return computenodeConditions
}
podConditions := getPreferedConditionFromPodConditions(pod.Status.Conditions)
if pod.Status.Phase == corev1.PodPending || pod.Status.Phase == corev1.PodRunning && len(podConditions) == 4 {
computenodeConditions = append(computenodeConditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionPending,
})
computenodeConditions = append(computenodeConditions, podConditions...)
return computenodeConditions
}
if pod.Status.Phase == corev1.PodFailed {
computenodeConditions = append(computenodeConditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionFailed,
})
return computenodeConditions
}
return podConditions
}
func getPreferedConditionFromPodConditions(pcs []corev1.PodCondition) []v1alpha1.ComputeNodeCondition {
conditions := []v1alpha1.ComputeNodeCondition{}
for i := range pcs {
if pcs[i].Status != corev1.ConditionTrue {
continue
}
if pcs[i].Type == corev1.PodScheduled {
conditions = append(conditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionDeployed,
})
}
if pcs[i].Type == corev1.PodInitialized {
conditions = append(conditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionInitialized,
})
}
if pcs[i].Type == corev1.ContainersReady {
conditions = append(conditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionStarted,
})
}
if pcs[i].Type == corev1.PodReady {
conditions = append(conditions, v1alpha1.ComputeNodeCondition{
Type: v1alpha1.ComputeNodeConditionReady,
})
}
}
return conditions
}
func newCondition(t v1alpha1.ComputeNodeConditionType, reason, message string) v1alpha1.ComputeNodeCondition {
return v1alpha1.ComputeNodeCondition{
Type: t,
Status: v1alpha1.ConditionStatusTrue,
LastUpdateTime: metav1.NewTime(time.Now()),
LastTransitionTime: metav1.NewTime(time.Now()),
Reason: reason,
Message: message,
}
}