Merge branch 'master' into fix-notebook-controller

This commit is contained in:
Gabriel Wen 2019-06-03 14:33:05 -07:00
commit 70bd7acdf5
2 changed files with 49 additions and 19 deletions

View File

@ -46,12 +46,19 @@ type NotebookStatus struct {
}
type NotebookCondition struct {
// Type of the confition/
Type NotebookConditionType `json:"type"`
// Type is the type of the condition. Possible values are Running|Waiting|Terminated
Type string `json:"type"`
// Last time we probed the condition.
// +optional
LastProbeTime metav1.Time `json:"lastProbeTime,omitempty"`
// (brief) reason the container is in the current state
// +optional
Reason string `json:"reason,omitempty"`
// Message regarding why the container is in the current state.
// +optional
Message string `json:"message,omitempty"`
}
type NotebookConditionType string
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -241,19 +241,6 @@ func (r *ReconcileNotebook) Reconcile(request reconcile.Request) (reconcile.Resu
}
}
// Update the status if previous condition is not "Ready"
oldConditions := instance.Status.Conditions
if len(oldConditions) == 0 || oldConditions[0].Type != "Ready" {
newCondition := v1alpha1.NotebookCondition{
Type: "Ready",
}
instance.Status.Conditions = append([]v1alpha1.NotebookCondition{newCondition}, oldConditions...)
// Using context.Background as: https://book.kubebuilder.io/basics/status_subresource.html
err = r.Status().Update(context.Background(), instance)
if err != nil {
return reconcile.Result{}, err
}
}
// Update the readyReplicas if the status is changed
if foundStateful.Status.ReadyReplicas != instance.Status.ReadyReplicas {
log.Info("Updating Status", "namespace", instance.Namespace, "name", instance.Name)
@ -268,7 +255,7 @@ func (r *ReconcileNotebook) Reconcile(request reconcile.Request) (reconcile.Resu
pod := &corev1.Pod{}
err = r.Get(context.TODO(), types.NamespacedName{Name: ss.Name + "-0", Namespace: ss.Namespace}, pod)
if err != nil && errors.IsNotFound(err) {
// This should be reconcile by the StatefulSet
// This should be reconciled by the StatefulSet
log.Info("Pod not found...")
} else if err != nil {
return reconcile.Result{}, err
@ -277,7 +264,17 @@ func (r *ReconcileNotebook) Reconcile(request reconcile.Request) (reconcile.Resu
if len(pod.Status.ContainerStatuses) > 0 &&
pod.Status.ContainerStatuses[0].State != instance.Status.ContainerState {
log.Info("Updating container state: ", "namespace", instance.Namespace, "name", instance.Name)
instance.Status.ContainerState = pod.Status.ContainerStatuses[0].State
cs := pod.Status.ContainerStatuses[0].State
instance.Status.ContainerState = cs
oldConditions := instance.Status.Conditions
newCondition := getNextCondition(cs)
// Append new condition
if len(oldConditions) == 0 || oldConditions[0].Type != newCondition.Type ||
oldConditions[0].Reason != newCondition.Reason ||
oldConditions[0].Message != newCondition.Message {
log.Info("Appending to conditions: ", "namespace", instance.Namespace, "name", instance.Name, "type", newCondition.Type, "reason", newCondition.Reason, "message", newCondition.Message)
instance.Status.Conditions = append([]v1alpha1.NotebookCondition{newCondition}, oldConditions...)
}
err = r.Status().Update(context.Background(), instance)
if err != nil {
return reconcile.Result{}, err
@ -288,6 +285,32 @@ func (r *ReconcileNotebook) Reconcile(request reconcile.Request) (reconcile.Resu
return reconcile.Result{}, nil
}
func getNextCondition(cs corev1.ContainerState) v1alpha1.NotebookCondition {
var nbtype = ""
var nbreason = ""
var nbmsg = ""
if cs.Running != nil {
nbtype = "Running"
} else if cs.Waiting != nil {
nbtype = "Waiting"
nbreason = cs.Waiting.Reason
nbmsg = cs.Waiting.Message
} else {
nbtype = "Terminated"
nbreason = cs.Terminated.Reason
nbmsg = cs.Terminated.Reason
}
newCondition := v1alpha1.NotebookCondition{
Type: nbtype,
LastProbeTime: metav1.Now(),
Reason: nbreason,
Message: nbmsg,
}
return newCondition
}
func generateStatefulSet(instance *v1alpha1.Notebook) *appsv1.StatefulSet {
ss := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{