Reconcile when runner pod is updated

This commit is contained in:
Moto Ishizawa 2020-01-29 23:12:07 +09:00
parent aaf6b0bcae
commit 5b887add53
1 changed files with 60 additions and 54 deletions

View File

@ -61,72 +61,71 @@ func (r *RunnerReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
var runner v1alpha1.Runner var runner v1alpha1.Runner
if err := r.Get(ctx, req.NamespacedName, &runner); err != nil { if err := r.Get(ctx, req.NamespacedName, &runner); err != nil {
log.Error(err, "unable to fetch Runner") log.Error(err, "Unable to fetch Runner")
return ctrl.Result{}, client.IgnoreNotFound(err) return ctrl.Result{}, client.IgnoreNotFound(err)
} }
if !runner.IsRegisterable() {
reg, err := r.newRegistration(ctx, runner.Spec.Repository)
if err != nil {
log.Error(err, "Failed to get new registration")
return ctrl.Result{}, err
}
updated := runner.DeepCopy()
updated.Status.Registration = reg
if err := r.Status().Update(ctx, updated); err != nil {
log.Error(err, "Unable to update Runner status")
return ctrl.Result{}, err
}
log.Info("Updated registration token", "repository", runner.Spec.Repository)
return ctrl.Result{}, nil
}
var pod corev1.Pod var pod corev1.Pod
if err := r.Get(ctx, req.NamespacedName, &pod); err != nil { if err := r.Get(ctx, req.NamespacedName, &pod); err != nil {
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
if !runner.IsRegisterable() { newPod, err := r.newPod(runner)
reg, err := r.newRegistration(ctx, runner.Spec.Repository)
if err != nil { if err != nil {
log.Error(err, "failed to get new registration") log.Error(err, "could not create pod")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
updated := runner.DeepCopy() if err := r.Create(ctx, &newPod); err != nil {
updated.Status.Registration = reg log.Error(err, "failed to create pod resource")
if err := r.Status().Update(ctx, updated); err != nil {
log.Error(err, "unable to update Runner status")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
return ctrl.Result{}, nil log.Info("Created a runner pod", "repository", runner.Spec.Repository)
}
pod := r.newPod(runner)
err = r.Create(ctx, &pod)
if err != nil {
log.Error(err, "failed to create a new pod")
return ctrl.Result{}, err
}
} else { } else {
newPod := r.newPod(runner) newPod, err := r.newPod(runner)
if reflect.DeepEqual(pod.Spec, newPod.Spec) {
return ctrl.Result{}, nil
}
if !runner.IsRegisterable() {
reg, err := r.newRegistration(ctx, runner.Spec.Repository)
if err != nil { if err != nil {
log.Error(err, "failed to get new registration") log.Error(err, "could not create pod")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
updated := runner.DeepCopy() update := false
updated.Status.Registration = reg if pod.Spec.Containers[0].Image != newPod.Spec.Containers[0].Image {
update = true
if err := r.Status().Update(ctx, updated); err != nil { }
log.Error(err, "unable to update Runner status") if !reflect.DeepEqual(pod.Spec.Containers[0].Env, newPod.Spec.Containers[0].Env) {
update = true
}
if !update {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
return ctrl.Result{}, nil if err := r.Delete(ctx, &pod, client.PropagationPolicy(metav1.DeletePropagationBackground)); err != nil {
} log.Error(err, "failed to delete pod resource")
// TODO: Do not update.
updatedPod := pod.DeepCopy()
updatedPod.Spec = newPod.Spec
if err := r.Update(ctx, updatedPod); err != nil {
log.Error(err, "unable to update pod")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
log.Info("Deleted a runner pod for updating", "repository", runner.Spec.Repository)
} }
return ctrl.Result{}, nil return ctrl.Result{}, nil
@ -172,19 +171,19 @@ func (r *RunnerReconciler) getRegistrationToken(ctx context.Context, repo string
return regToken, nil return regToken, nil
} }
func (r *RunnerReconciler) newPod(runner v1alpha1.Runner) corev1.Pod { func (r *RunnerReconciler) newPod(runner v1alpha1.Runner) (corev1.Pod, error) {
image := runner.Spec.Image image := runner.Spec.Image
if image == "" { if image == "" {
image = defaultImage image = defaultImage
} }
return corev1.Pod{ pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: runner.Name, Name: runner.Name,
Namespace: runner.Namespace, Namespace: runner.Namespace,
}, },
Spec: corev1.PodSpec{ Spec: corev1.PodSpec{
RestartPolicy: "Never", RestartPolicy: "OnFailure",
Containers: []corev1.Container{ Containers: []corev1.Container{
{ {
Name: "runner", Name: "runner",
@ -208,10 +207,17 @@ func (r *RunnerReconciler) newPod(runner v1alpha1.Runner) corev1.Pod {
}, },
}, },
} }
if err := ctrl.SetControllerReference(&runner, &pod, r.Scheme); err != nil {
return pod, err
}
return pod, nil
} }
func (r *RunnerReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *RunnerReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&v1alpha1.Runner{}). For(&v1alpha1.Runner{}).
Owns(&corev1.Pod{}).
Complete(r) Complete(r)
} }