Path: blob/main/install/installer/pkg/components/database/init/job.go
2504 views
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34// This runs the init scripts in a non-inCluster DB instance56package init78import (9"fmt"1011"github.com/gitpod-io/gitpod/installer/pkg/common"12batchv1 "k8s.io/api/batch/v1"13corev1 "k8s.io/api/core/v1"14metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"15"k8s.io/apimachinery/pkg/runtime"16"k8s.io/utils/pointer"17)1819func job(ctx *common.RenderContext) ([]runtime.Object, error) {20if disableMigration := common.IsDatabaseMigrationDisabled(ctx); disableMigration {21return nil, nil22}2324objectMeta := metav1.ObjectMeta{25Name: fmt.Sprintf("%s-session", Component),26Namespace: ctx.Namespace,27Labels: common.CustomizeLabel(ctx, Component, common.TypeMetaBatchJob),28Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaBatchJob),29}3031volumes := []corev1.Volume{{32Name: sqlInitScripts,33VolumeSource: corev1.VolumeSource{ConfigMap: &corev1.ConfigMapVolumeSource{34LocalObjectReference: corev1.LocalObjectReference{Name: sqlInitScripts},35}},36}}37volumeMounts := []corev1.VolumeMount{{38Name: sqlInitScripts,39MountPath: "/db-init-scripts",40ReadOnly: true,41}}4243// We already have CA loaded at common.DBCaCertEnvVarName, but mysql cli needs a file here, so we mount it like as one.44sslOptions := ""45if ctx.Config.Database.SSL != nil && ctx.Config.Database.SSL.CaCert != nil {46volumes = append(volumes, corev1.Volume{47Name: caCertMountName,48VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{49SecretName: ctx.Config.Database.SSL.CaCert.Name,50}},51})52volumeMounts = append(volumeMounts, corev1.VolumeMount{53Name: caCertMountName,54MountPath: common.DBCaBasePath,55ReadOnly: true,56})57sslOptions = fmt.Sprintf(" --ssl-mode=VERIFY_IDENTITY --ssl-ca=%s ", common.DBCaPath)58}5960return []runtime.Object{&batchv1.Job{61TypeMeta: common.TypeMetaBatchJob,62ObjectMeta: objectMeta,63Spec: batchv1.JobSpec{64TTLSecondsAfterFinished: pointer.Int32(60),65Template: corev1.PodTemplateSpec{66ObjectMeta: objectMeta,67Spec: corev1.PodSpec{68RestartPolicy: corev1.RestartPolicyNever,69ServiceAccountName: Component,70EnableServiceLinks: pointer.Bool(false),71Volumes: volumes,72// The init container is designed to emulate Helm hooks73InitContainers: []corev1.Container{*common.DatabaseWaiterContainer(ctx)},74Containers: []corev1.Container{{75Name: fmt.Sprintf("%s-session", Component),76Image: ctx.ImageName(common.ThirdPartyContainerRepo(ctx.Config.Repository, ""), dbSessionsImage, dbSessionsTag),77ImagePullPolicy: corev1.PullIfNotPresent,78Env: common.MergeEnv(79common.DatabaseEnv(&ctx.Config),80),81SecurityContext: &corev1.SecurityContext{82AllowPrivilegeEscalation: pointer.Bool(false),83},84Command: []string{85"sh",86"-c",87fmt.Sprintf("mysql -h $DB_HOST --port $DB_PORT -u $DB_USERNAME -p$DB_PASSWORD %s< /db-init-scripts/init.sql", sslOptions),88},89VolumeMounts: volumeMounts,90}},91},92},93},94}}, nil95}969798