working with images
This commit is contained in:
@@ -33,6 +33,7 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||
"sigs.k8s.io/controller-runtime/pkg/log"
|
||||
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
||||
|
||||
servermanagerv1alpha1 "git.acooldomain.co/server-manager/kubernetes-operator/api/v1alpha1"
|
||||
)
|
||||
@@ -95,7 +96,7 @@ type ServerManagerReconciler struct {
|
||||
// +kubebuilder:rbac:groups=,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete
|
||||
// +kubebuilder:rbac:groups=server-manager.acooldomain.co,resources=servermanagers/finalizers,verbs=update
|
||||
// +kubebuilder:rbac:groups=,resources=services,verbs=get;list;watch;create;update;patch;delete
|
||||
// +kubebuilder:rbac:groups=,resources=pods,verbs=get;list;watch;create
|
||||
// +kubebuilder:rbac:groups=,resources=pods,verbs=get;list;watch;create;delete
|
||||
|
||||
// Reconcile is part of the main kubernetes reconciliation loop which aims to
|
||||
// move the current state of the cluster closer to the desired state.
|
||||
@@ -151,7 +152,13 @@ func (r *ServerManagerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
|
||||
}
|
||||
logging.Info("verified browserPvc")
|
||||
|
||||
serverPod := r.ServerPod(s, pvc)
|
||||
image, err := r.GetImage(ctx, s)
|
||||
if err != nil {
|
||||
logging.Error(err, "Failed to get image")
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
|
||||
serverPod := r.ServerPod(s, pvc, image)
|
||||
found := &corev1.Pod{}
|
||||
err = r.Get(ctx, client.ObjectKey{Namespace: pvc.Namespace, Name: pvc.Name}, found)
|
||||
if err == nil && !s.Spec.Server.On {
|
||||
@@ -602,8 +609,13 @@ func (r *ServerManagerReconciler) ServerPvc(s *servermanagerv1alpha1.ServerManag
|
||||
return pvc
|
||||
}
|
||||
|
||||
func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManager, pvc *corev1.PersistentVolumeClaim) *corev1.Pod {
|
||||
ports := make([]corev1.ContainerPort, len(s.Spec.Server.Ports))
|
||||
func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManager, pvc *corev1.PersistentVolumeClaim, image *servermanagerv1alpha1.Image) *corev1.Pod {
|
||||
serverPorts := image.Spec.Ports
|
||||
if len(s.Spec.Server.Ports) > 0 {
|
||||
serverPorts = s.Spec.Server.Ports
|
||||
}
|
||||
|
||||
ports := make([]corev1.ContainerPort, len(serverPorts))
|
||||
|
||||
for i, port := range s.Spec.Server.Ports {
|
||||
ports[i] = corev1.ContainerPort{
|
||||
@@ -612,6 +624,36 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
|
||||
}
|
||||
}
|
||||
|
||||
command := image.Spec.Command
|
||||
if len(s.Spec.Server.Command) > 0 {
|
||||
command = s.Spec.Server.Command
|
||||
}
|
||||
|
||||
args := image.Spec.Args
|
||||
if len(s.Spec.Server.Args) > 0 {
|
||||
args = s.Spec.Server.Args
|
||||
}
|
||||
|
||||
var initContainers []corev1.Container = nil
|
||||
|
||||
if image.Spec.InitScript != nil {
|
||||
initContainers = []corev1.Container{
|
||||
{
|
||||
Name: "init",
|
||||
Image: image.Spec.InitScript.Image,
|
||||
ImagePullPolicy: corev1.PullIfNotPresent,
|
||||
Command: image.Spec.Command,
|
||||
Args: image.Spec.InitScript.Args,
|
||||
VolumeMounts: []corev1.VolumeMount{
|
||||
{
|
||||
Name: "volume",
|
||||
MountPath: "/data",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pod := &corev1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: s.Name,
|
||||
@@ -629,18 +671,19 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
|
||||
},
|
||||
},
|
||||
},
|
||||
InitContainers: initContainers,
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Name: "server",
|
||||
Image: s.Spec.Server.Image,
|
||||
Image: image.Spec.Location,
|
||||
ImagePullPolicy: corev1.PullAlways,
|
||||
Command: s.Spec.Server.Command,
|
||||
Args: s.Spec.Server.Args,
|
||||
WorkingDir: s.Spec.Server.WorkingDir,
|
||||
Command: command,
|
||||
Args: args,
|
||||
WorkingDir: image.Spec.WorkingDir,
|
||||
Ports: ports,
|
||||
VolumeMounts: []corev1.VolumeMount{{
|
||||
Name: "volume",
|
||||
MountPath: s.Spec.Server.WorkingDir,
|
||||
MountPath: image.Spec.WorkingDir,
|
||||
}},
|
||||
Stdin: true,
|
||||
TTY: true,
|
||||
@@ -648,10 +691,21 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
controllerutil.SetControllerReference(s, pod, r.Scheme)
|
||||
return pod
|
||||
}
|
||||
|
||||
func (r *ServerManagerReconciler) GetImage(ctx context.Context, s *servermanagerv1alpha1.ServerManager) (*servermanagerv1alpha1.Image, error) {
|
||||
image := &servermanagerv1alpha1.Image{}
|
||||
err := r.Get(ctx, client.ObjectKey{Name: s.Spec.Server.Image, Namespace: s.Namespace}, image)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return image, nil
|
||||
}
|
||||
|
||||
// SetupWithManager sets up the controller with the Manager.
|
||||
func (r *ServerManagerReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
||||
return ctrl.NewControllerManagedBy(mgr).
|
||||
|
Reference in New Issue
Block a user