Ошибки на unmarshal yaml в go - PullRequest
       0

Ошибки на unmarshal yaml в go

1 голос
/ 17 марта 2020

Я новичок в 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, как предложил Джонас. Теперь все работает!

Ответы [ 3 ]

0 голосов
/ 17 марта 2020

Вы можете использовать официальные структуры из API Kubernetes. Если вы все еще хотите объявить структуры: ваши теги yaml являются неполными. У вас нет тегов для вложенных структур:

type Jobs struct {
    Metadata struct {
      Name string `yaml:"name"`
      Namespace string `yaml:"namespace"`
    } `yaml:"metadata"` // Here is one
    Spec struct {
      TtlSecondsAfterFinished int `yaml:"ttlSecondsAfterFinished"`
      Template struct {
        Spec struct {
          Containers []struct {
            VolumeMounts []struct {
                    Name string 
                    SubPath string `yaml:"subPath"`
                    MountPath string `yaml:"mountPath"`
                    ReadOnly bool `yaml:"readOnly"`
          } `yaml:"volumeMounts"` // Here is another
        } `yaml:"containers"` // Here is another
        Volumes map[string][]Names `yaml:"volumes"` // This is missin as well
      } `yaml:"spec"` //
    } `yaml:"template"` //
  } `yaml:"spec"` //
}
0 голосов
/ 18 марта 2020

Предположим, что ваши данные находятся в файле example.yaml; вы можете распаковать в структуру используя gopkg.in/yaml.v2 как

package main

import (
    "fmt"
    "log"
    "io/ioutil"
    "gopkg.in/yaml.v2"
)

type item struct {
    ItemA string `yaml:"item_a"`
    ItemB string `yaml:"item_b"`
}

func read(filename string) (item, error) {
    var output item
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        return item{}, err
    }
    err = yaml.Unmarshal(content, output)
    if err != nil {
        return item{}, err
    }
    return output, nil
}

func main() {
    output, err := read("example.yaml")
    if err != nil {
            log.Fatal(err)
    }
    fmt.Println("output: ", output)
}
0 голосов
/ 17 марта 2020

Мне нужно проанализировать yaml задания kubernetes и отредактировать в go, чтобы создать обновление yaml. Структура почти стати c, но в ней есть два списка, в которых ключи могут содержать разные вещи.

Звучит так, как будто ваше приложение работает в кластере, хотите получить Job, измените его, а затем обновите.

Я бы порекомендовал для этого официальный Kubernetes client- go. Он имеет библиотеки для ресурсов Kubernetes, таких как Job. См. пример использования Deployment

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...