Files
katenary/internal/generator/volume.go

132 lines
3.0 KiB
Go
Raw Normal View History

package generator
import (
"strings"
2025-08-19 23:09:50 +02:00
"repo.katenary.io/katenary/katenary/internal/utils"
"github.com/compose-spec/compose-go/types"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const persistenceKey = "persistence"
var _ Yaml = (*VolumeClaim)(nil)
// VolumeClaim is a kubernetes VolumeClaim. This is a PersistentVolumeClaim.
type VolumeClaim struct {
*v1.PersistentVolumeClaim
service *types.ServiceConfig `yaml:"-"`
volumeName string
nameOverride string
}
// NewVolumeClaim creates a new VolumeClaim from a compose service.
func NewVolumeClaim(service types.ServiceConfig, volumeName, appName string) *VolumeClaim {
fixedName := utils.FixedResourceName(volumeName)
return &VolumeClaim{
volumeName: volumeName,
service: &service,
PersistentVolumeClaim: &v1.PersistentVolumeClaim{
TypeMeta: metav1.TypeMeta{
Kind: "PersistentVolumeClaim",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: utils.TplName(service.Name, appName) + "-" + fixedName,
Labels: GetLabels(service.Name, appName),
Annotations: Annotations,
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
StorageClassName: utils.StrPtr(
`{{ .Values.` +
service.Name +
"." + persistenceKey +
"." + volumeName + `.storageClass }}`,
),
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: resource.MustParse("1Gi"),
},
},
},
},
}
}
// Filename returns the suggested filename for a VolumeClaim.
func (v *VolumeClaim) Filename() string {
return v.service.Name + "." + v.volumeName + ".volumeclaim.yaml"
}
// Yaml marshals a VolumeClaim into yaml.
func (v *VolumeClaim) Yaml() ([]byte, error) {
var out []byte
var err error
if out, err = ToK8SYaml(v); err != nil {
return nil, err
}
serviceName := v.service.Name
if v.nameOverride != "" {
serviceName = v.nameOverride
}
volumeName := v.volumeName
// replace 1Gi to {{ .Values.serviceName.volume.size }}
out = []byte(
strings.Replace(
string(out),
"1Gi",
utils.TplValue(serviceName, persistenceKey+"."+volumeName+".size"),
1,
),
)
out = []byte(
strings.Replace(
string(out),
"- ReadWriteOnce",
"{{- .Values."+
serviceName+
"."+persistenceKey+
"."+volumeName+
".accessMode | toYaml | nindent __indent__ }}",
1,
),
)
lines := strings.Split(string(out), "\n")
for i, line := range lines {
if strings.Contains(line, "storageClass") {
lines[i] = utils.Wrap(
line,
"{{- if ne .Values."+
serviceName+
"."+persistenceKey+
"."+volumeName+".storageClass \"-\" }}",
"{{- end }}",
)
}
}
out = []byte(strings.Join(lines, "\n"))
// add condition
out = []byte(
"{{- if .Values." +
serviceName +
"." + persistenceKey +
"." + volumeName +
".enabled }}\n" +
string(out) +
"\n{{- end }}",
)
return out, nil
}