This prepares the next release. We need to support the compose v2 syntax as soon as possible to avoid accumulating technical debt.
132 lines
3.0 KiB
Go
132 lines
3.0 KiB
Go
package generator
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"katenary.io/internal/utils"
|
|
|
|
"github.com/compose-spec/compose-go/v2/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
|
|
}
|