Я новичок в go, я не могу найти способ разархивировать yaml с помощью "gopkg.in/yaml.v2" Я полагаю, ошибка в том, как я определяю структуру.
Мне нужно проанализировать yaml задания kubernetes и отредактировать в go, чтобы сгенерировать yaml обновления. Структура почти стати c, но в ней есть два списка, в которых ключи могут содержать разные вещи.
Я уменьшил значение yaml до одного списка (тома), чтобы упростить пример.
apiVersion: batch/v1
kind: Job
metadata:
name: jobname
namespace: namespace
spec:
ttlSecondsAfterFinished: 86400
template:
spec:
containers:
- name: container-name
image: containerimage:tag
command:
- php
- cli/migrations.php
- up
restartPolicy: Never
volumes:
- name: filestore
persistentVolumeClaim:
claimName: data-pvc
readOnly: false
- name: stackdriver
secret:
secretName: stackdriver-prod
backoffLimit: 1
это мои определения структур:
type PersistentVolumeClaims struct {
ClaimName string `yaml:"claimName,omitempty"`
ReadOnly bool `yaml:"readOnly,omitempty"`
}
type Secrets struct {
SecretName string `yaml:"secretName,omitempty"`
}
type Names struct {
Name string `yaml:"name"`
PersistentVolumeClaim PersistentVolumeClaims `yaml:"persistentVolumeClaim,omitempty"`
Secret Secrets `yaml:"secret,omitempty"`
}
type Jobs struct {
ApiVersion string `yaml:"apiVersion"`
Kind string `yaml:"kind"`
Metadata struct {
Name string `yaml:"name"`
Namespace string `yaml:"namespace"`
}
Spec struct {
TtlSecondsAfterFinished int `yaml:"ttlSecondsAfterFinished"`
Template struct {
Spec struct {
Containers []struct {
Name string
Image string `yaml:"image"`
Command []string `yaml:"command"`
VolumeMounts []struct {
Name string
SubPath string `yaml:"subPath"`
MountPath string `yaml:"mountPath"`
ReadOnly bool `yaml:"readOnly"`
}
RestartPolicy string `yaml:"restartPolicy"`
}
Volumes map[string][]Names
}
BackoffLimit int `yaml:"backoffLimit"`
}
}
}
Я пробовал разные структуры, но не нашел решения. Мы будем благодарны за любую помощь.
--- РЕШЕНО
Я переделал инструмент, используя официальный go -клиент https://github.com/kubernetes/client-go, как предложил Джонас. Теперь все работает!