Skip to content
Snippets Groups Projects
Commit cbf72f1e authored by Georgios Tsoulos's avatar Georgios Tsoulos Committed by Carina Antunes
Browse files

[#17] Add cronjob resource

parent 388d7cc3
No related branches found
No related tags found
No related merge requests found
......@@ -41,6 +41,7 @@ func NewDependencies() (*Dependencies, error) {
resources.NewService(),
resources.NewRoute(),
resources.NewRoleBinding(c),
resources.NewCronJob(c),
}
resourcesRegistry := resources.NewRegistry(resourceList)
......
package resources
// ConfigMap Keys
const (
DBHostKey = "databaseHost"
DBNameKey = "databaseName"
DBUserKey = "databaseUsername"
DBPassKey = "databasePassword"
)
......@@ -5,6 +5,8 @@ package resources
const (
WordpressAppName string = "wordpress-app"
WordpressName string = "wordpress"
DatabaseName string = "database"
)
// Labels
......
package constants
//go:generate stringer -type=PodEnv -linecomment
type PodEnv int
// Pod Environment Variables (used in deployment and cronjob)
const (
MysqlHost PodEnv = iota // MYSQL_HOST
MysqlDatabase // MYSQL_DATABASE
MysqlUser // MYSQL_USER
MysqlPassword // MYSQL_PASSWORD
)
// Code generated by "stringer -type=PodEnv -linecomment"; DO NOT EDIT.
package constants
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[MysqlHost-0]
_ = x[MysqlDatabase-1]
_ = x[MysqlUser-2]
_ = x[MysqlPassword-3]
}
const _PodEnv_name = "MYSQL_HOSTMYSQL_DATABASEMYSQL_USERMYSQL_PASSWORD"
var _PodEnv_index = [...]uint8{0, 10, 24, 34, 48}
func (i PodEnv) String() string {
if i < 0 || i >= PodEnv(len(_PodEnv_index)-1) {
return "PodEnv(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _PodEnv_name[_PodEnv_index[i]:_PodEnv_index[i+1]]
}
package resources
import (
"fmt"
"strings"
batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"gitlab.cern.ch/wordpress/paas/wordpress-operator/internal/controller/resources/constants"
types "gitlab.cern.ch/wordpress/paas/wordpress-operator/api/v2"
"gitlab.cern.ch/wordpress/paas/wordpress-operator/internal/config"
)
const (
volume = "data"
mountPath = "/var/lib/mysql/data"
schedule = "0 3 * * *"
successfulJobsHistoryLimit int32 = 1
failedJobsHistoryLimit int32 = 1
backoffLimit int32 = 3
containerName = "mysql-backup"
)
type CronJob struct {
config *config.Config
}
func NewCronJob(cfg *config.Config) *CronJob {
return &CronJob{config: cfg}
}
func (c *CronJob) configMapEnvVar(name constants.PodEnv, configMapKey string, configMapName string) *corev1.EnvVar {
return &corev1.EnvVar{
Name: name.String(),
ValueFrom: &corev1.EnvVarSource{
ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
Key: configMapKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: configMapName,
},
},
},
}
}
// Cronjob to backup website Database
func (c *CronJob) createCronJob(app string, namespace string, imageDB string) *batchv1.CronJob {
wpName := generateWordPressName(app)
env := []corev1.EnvVar{
*c.configMapEnvVar(constants.MysqlHost, DBHostKey, wpName),
*c.configMapEnvVar(constants.MysqlDatabase, DBNameKey, wpName),
*c.configMapEnvVar(constants.MysqlUser, DBUserKey, wpName),
*c.configMapEnvVar(constants.MysqlPassword, DBPassKey, wpName),
}
inlineCommands := []string{
fmt.Sprintf("mkdir -p %s/backup", mountPath),
fmt.Sprintf(`mysqldump -h "${%s}" --databases "${%s}" -u "${%s}" --password="${%s}" --no-tablespaces |
gzip > %s/backup/backup.sql.gz`,
constants.MysqlHost,
constants.MysqlDatabase,
constants.MysqlUser,
constants.MysqlPassword,
mountPath,
),
`echo "backup done!"`,
}
command := []string{
"/bin/sh", "-c",
strings.Join(inlineCommands, " && "),
}
if imageDB == "" {
imageDB = c.config.DatabaseValues.Image
}
return &batchv1.CronJob{
ObjectMeta: metav1.ObjectMeta{
Name: wpName,
Namespace: namespace,
Labels: map[string]string{
LabelApp: generateAppName(app),
},
},
Spec: batchv1.CronJobSpec{
Schedule: schedule,
ConcurrencyPolicy: batchv1.ReplaceConcurrent,
SuccessfulJobsHistoryLimit: int32Ptr(successfulJobsHistoryLimit),
FailedJobsHistoryLimit: int32Ptr(failedJobsHistoryLimit),
JobTemplate: batchv1.JobTemplateSpec{
Spec: batchv1.JobSpec{
BackoffLimit: int32Ptr(backoffLimit),
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
// When pod is in failure state, it will recreate another pod
// when using Never, up to the backoffLimit
RestartPolicy: corev1.RestartPolicyNever,
Containers: []corev1.Container{
{
Name: containerName,
Image: imageDB,
Command: command,
Env: env,
VolumeMounts: []corev1.VolumeMount{
{
Name: volume,
MountPath: mountPath,
},
},
},
},
Volumes: []corev1.Volume{
{
Name: volume,
VolumeSource: corev1.VolumeSource{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: generateDatabaseName(app),
},
},
},
},
},
},
},
},
},
}
}
func (c *CronJob) GetAll(wp *types.WordPress) []client.Object {
cronJob := c.createCronJob(wp.Name, wp.Namespace, wp.Spec.DatabaseSpec.Image)
return []client.Object{cronJob}
}
......@@ -7,3 +7,15 @@ import (
func generateAppName(app string) string {
return fmt.Sprintf("%s-%s", app, WordpressAppName)
}
func generateWordPressName(app string) string {
return fmt.Sprintf("%s-%s", app, WordpressName)
}
func generateDatabaseName(app string) string {
return fmt.Sprintf("%s-%s", app, DatabaseName)
}
func int32Ptr(val int32) *int32 {
return &val
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment