From d01a35e2d46faa1b13f08dacf736daf55af5f6d0 Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Wed, 24 Apr 2024 23:06:45 +0200 Subject: [PATCH] Use real types to parse labels We were using `yaml.Unmarshal` on basic types or inline structs. This was not efficient and not clear to defined what we expect in labels. We now use types to unmarshal the labels. Only the `values` label is, at this time, parsed by GetValuesFromLabel because this `utils` function is clearly a special case. --- doc/docs/packages/generator.md | 75 +++----- doc/docs/packages/generator/labelStructs.md | 199 ++++++++++++++++++++ doc/docs/statics/logo-bright.png | Bin 0 -> 15020 bytes doc/docs/statics/logo-vertical.png | Bin 0 -> 14830 bytes doc/mkdocs.yml | 6 +- generator/chart.go | 11 +- generator/configMap.go | 15 +- generator/converter.go | 3 +- generator/cronJob.go | 18 +- generator/deployment.go | 20 +- generator/generator.go | 19 +- generator/ingress.go | 40 ++-- generator/ingress_test.go | 2 +- generator/labelStructs/configMap.go | 17 +- generator/labelStructs/cronJob.go | 18 ++ generator/labelStructs/dependencies.go | 21 +++ generator/labelStructs/doc.go | 2 + generator/labelStructs/envFrom.go | 14 ++ generator/labelStructs/ingress.go | 33 ++++ generator/labelStructs/mapenv.go | 14 ++ generator/labelStructs/ports.go | 14 ++ generator/labelStructs/probes.go | 19 ++ generator/labelStructs/secrets.go | 13 ++ 23 files changed, 435 insertions(+), 138 deletions(-) create mode 100644 doc/docs/packages/generator/labelStructs.md create mode 100644 doc/docs/statics/logo-bright.png create mode 100644 doc/docs/statics/logo-vertical.png create mode 100644 generator/labelStructs/cronJob.go create mode 100644 generator/labelStructs/dependencies.go create mode 100644 generator/labelStructs/doc.go create mode 100644 generator/labelStructs/envFrom.go create mode 100644 generator/labelStructs/ingress.go create mode 100644 generator/labelStructs/mapenv.go create mode 100644 generator/labelStructs/ports.go create mode 100644 generator/labelStructs/probes.go create mode 100644 generator/labelStructs/secrets.go diff --git a/doc/docs/packages/generator.md b/doc/docs/packages/generator.md index 4cd0260..7e9b482 100644 --- a/doc/docs/packages/generator.md +++ b/doc/docs/packages/generator.md @@ -35,7 +35,7 @@ var Version = "master" // changed at compile time ``` -## func [Convert]() +## func [Convert]() ```go func Convert(config ConvertOptions, dockerComposeFile ...string) @@ -116,7 +116,7 @@ func Prefix() string -## type [ChartTemplate]() +## type [ChartTemplate]() ChartTemplate is a template of a chart. It contains the content of the template and the name of the service. This is used internally to generate the templates. @@ -151,7 +151,7 @@ func NewConfigMap(service types.ServiceConfig, appName string) *ConfigMap NewConfigMap creates a new ConfigMap from a compose service. The appName is the name of the application taken from the project name. The ConfigMap is filled by environment variables and labels "map\-env". -### func [NewConfigMapFromDirectory]() +### func [NewConfigMapFromDirectory]() ```go func NewConfigMapFromDirectory(service types.ServiceConfig, appName string, path string) *ConfigMap @@ -160,7 +160,7 @@ func NewConfigMapFromDirectory(service types.ServiceConfig, appName string, path NewConfigMapFromDirectory creates a new ConfigMap from a compose service. This path is the path to the file or directory. If the path is a directory, all files in the directory are added to the ConfigMap. Each subdirectory are ignored. Note that the Generate\(\) function will create the subdirectories ConfigMaps. -### func \(\*ConfigMap\) [AddData]() +### func \(\*ConfigMap\) [AddData]() ```go func (c *ConfigMap) AddData(key string, value string) @@ -169,7 +169,7 @@ func (c *ConfigMap) AddData(key string, value string) AddData adds a key value pair to the configmap. Append or overwrite the value if the key already exists. -### func \(\*ConfigMap\) [AppendDir]() +### func \(\*ConfigMap\) [AppendDir]() ```go func (c *ConfigMap) AppendDir(path string) @@ -178,7 +178,7 @@ func (c *ConfigMap) AppendDir(path string) AddFile adds files from given path to the configmap. It is not recursive, to add all files in a directory, you need to call this function for each subdirectory. -### func \(\*ConfigMap\) [AppendFile]() +### func \(\*ConfigMap\) [AppendFile]() ```go func (c *ConfigMap) AppendFile(path string) @@ -187,7 +187,7 @@ func (c *ConfigMap) AppendFile(path string) -### func \(\*ConfigMap\) [Filename]() +### func \(\*ConfigMap\) [Filename]() ```go func (c *ConfigMap) Filename() string @@ -196,7 +196,7 @@ func (c *ConfigMap) Filename() string Filename returns the filename of the configmap. If the configmap is used for files, the filename contains the path. -### func \(\*ConfigMap\) [SetData]() +### func \(\*ConfigMap\) [SetData]() ```go func (c *ConfigMap) SetData(data map[string]string) @@ -205,7 +205,7 @@ func (c *ConfigMap) SetData(data map[string]string) SetData sets the data of the configmap. It replaces the entire data. -### func \(\*ConfigMap\) [Yaml]() +### func \(\*ConfigMap\) [Yaml]() ```go func (c *ConfigMap) Yaml() ([]byte, error) @@ -214,7 +214,7 @@ func (c *ConfigMap) Yaml() ([]byte, error) Yaml returns the yaml representation of the configmap -## type [ConfigMapMount]() +## type [ConfigMapMount]() @@ -225,7 +225,7 @@ type ConfigMapMount struct { ``` -## type [ConvertOptions]() +## type [ConvertOptions]() ConvertOptions are the options to convert a compose project to a helm chart. @@ -253,7 +253,7 @@ type CronJob struct { ``` -### func \(\*CronJob\) [Filename]() +### func \(\*CronJob\) [Filename]() ```go func (c *CronJob) Filename() string @@ -264,7 +264,7 @@ Filename returns the filename of the cronjob. Implements the Yaml interface. -### func \(\*CronJob\) [Yaml]() +### func \(\*CronJob\) [Yaml]() ```go func (c *CronJob) Yaml() ([]byte, error) @@ -309,23 +309,8 @@ func NewFileMap(service types.ServiceConfig, appName string, kind string) DataMa NewFileMap creates a new DataMap from a compose service. The appName is the name of the application taken from the project name. - -## type [Dependency]() - -Dependency is a dependency of a chart to other charts. - -```go -type Dependency struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - Repository string `yaml:"repository"` - Alias string `yaml:"alias,omitempty"` - Values map[string]any `yaml:"-"` // do not export to Chart.yaml -} -``` - -## type [Deployment]() +## type [Deployment]() Deployment is a kubernetes Deployment. @@ -337,7 +322,7 @@ type Deployment struct { ``` -### func [NewDeployment]() +### func [NewDeployment]() ```go func NewDeployment(service types.ServiceConfig, chart *HelmChart) *Deployment @@ -346,7 +331,7 @@ func NewDeployment(service types.ServiceConfig, chart *HelmChart) *Deployment NewDeployment creates a new Deployment from a compose service. The appName is the name of the application taken from the project name. It also creates the Values map that will be used to create the values.yaml file. -### func \(\*Deployment\) [AddContainer]() +### func \(\*Deployment\) [AddContainer]() ```go func (d *Deployment) AddContainer(service types.ServiceConfig) @@ -355,7 +340,7 @@ func (d *Deployment) AddContainer(service types.ServiceConfig) AddContainer adds a container to the deployment. -### func \(\*Deployment\) [AddHealthCheck]() +### func \(\*Deployment\) [AddHealthCheck]() ```go func (d *Deployment) AddHealthCheck(service types.ServiceConfig, container *corev1.Container) @@ -364,7 +349,7 @@ func (d *Deployment) AddHealthCheck(service types.ServiceConfig, container *core -### func \(\*Deployment\) [AddIngress]() +### func \(\*Deployment\) [AddIngress]() ```go func (d *Deployment) AddIngress(service types.ServiceConfig, appName string) *Ingress @@ -373,7 +358,7 @@ func (d *Deployment) AddIngress(service types.ServiceConfig, appName string) *In AddIngress adds an ingress to the deployment. It creates the ingress object. -### func \(\*Deployment\) [AddVolumes]() +### func \(\*Deployment\) [AddVolumes]() ```go func (d *Deployment) AddVolumes(service types.ServiceConfig, appName string) @@ -382,7 +367,7 @@ func (d *Deployment) AddVolumes(service types.ServiceConfig, appName string) AddVolumes adds a volume to the deployment. It does not create the PVC, it only adds the volumes to the deployment. If the volume is a bind volume it will warn the user that it is not supported yet. -### func \(\*Deployment\) [BindFrom]() +### func \(\*Deployment\) [BindFrom]() ```go func (d *Deployment) BindFrom(service types.ServiceConfig, binded *Deployment) @@ -391,7 +376,7 @@ func (d *Deployment) BindFrom(service types.ServiceConfig, binded *Deployment) -### func \(\*Deployment\) [DependsOn]() +### func \(\*Deployment\) [DependsOn]() ```go func (d *Deployment) DependsOn(to *Deployment, servicename string) error @@ -400,7 +385,7 @@ func (d *Deployment) DependsOn(to *Deployment, servicename string) error DependsOn adds a initContainer to the deployment that will wait for the service to be up. -### func \(\*Deployment\) [Filename]() +### func \(\*Deployment\) [Filename]() ```go func (d *Deployment) Filename() string @@ -409,7 +394,7 @@ func (d *Deployment) Filename() string Filename returns the filename of the deployment. -### func \(\*Deployment\) [SetEnvFrom]() +### func \(\*Deployment\) [SetEnvFrom]() ```go func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string) @@ -418,7 +403,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string) SetEnvFrom sets the environment variables to a configmap. The configmap is created. -### func \(\*Deployment\) [Yaml]() +### func \(\*Deployment\) [Yaml]() ```go func (d *Deployment) Yaml() ([]byte, error) @@ -445,7 +430,7 @@ const ( ``` -## type [HelmChart]() +## type [HelmChart]() HelmChart is a Helm Chart representation. It contains all the tempaltes, values, versions, helpers... @@ -456,7 +441,7 @@ type HelmChart struct { Version string `yaml:"version"` AppVersion string `yaml:"appVersion"` Description string `yaml:"description"` - Dependencies []Dependency `yaml:"dependencies,omitempty"` + Dependencies []labelStructs.Dependency `yaml:"dependencies,omitempty"` Templates map[string]*ChartTemplate `yaml:"-"` // do not export to yaml Helper string `yaml:"-"` // do not export to yaml Values map[string]any `yaml:"-"` // do not export to yaml @@ -466,7 +451,7 @@ type HelmChart struct { ``` -### func [Generate]() +### func [Generate]() ```go func Generate(project *types.Project) (*HelmChart, error) @@ -486,7 +471,7 @@ The Generate function will create the HelmChart object this way: - Merge the same\-pod services. -### func [NewChart]() +### func [NewChart]() ```go func NewChart(name string) *HelmChart @@ -530,7 +515,7 @@ func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress NewIngress creates a new Ingress from a compose service. -### func \(\*Ingress\) [Filename]() +### func \(\*Ingress\) [Filename]() ```go func (ingress *Ingress) Filename() string @@ -539,7 +524,7 @@ func (ingress *Ingress) Filename() string -### func \(\*Ingress\) [Yaml]() +### func \(\*Ingress\) [Yaml]() ```go func (ingress *Ingress) Yaml() ([]byte, error) diff --git a/doc/docs/packages/generator/labelStructs.md b/doc/docs/packages/generator/labelStructs.md new file mode 100644 index 0000000..8a2d547 --- /dev/null +++ b/doc/docs/packages/generator/labelStructs.md @@ -0,0 +1,199 @@ + + +# labelStructs + +```go +import "katenary/generator/labelStructs" +``` + +labelStructs is a package that contains the structs used to represent the labels in the yaml files. + +## type [ConfigMapFile]() + + + +```go +type ConfigMapFile []string +``` + + +### func [ConfigMapFileFrom]() + +```go +func ConfigMapFileFrom(data string) (ConfigMapFile, error) +``` + + + + +## type [CronJob]() + + + +```go +type CronJob struct { + Image string `yaml:"image,omitempty"` + Command string `yaml:"command"` + Schedule string `yaml:"schedule"` + Rbac bool `yaml:"rbac"` +} +``` + + +### func [CronJobFrom]() + +```go +func CronJobFrom(data string) (*CronJob, error) +``` + + + + +## type [Dependency]() + +Dependency is a dependency of a chart to other charts. + +```go +type Dependency struct { + Name string `yaml:"name"` + Version string `yaml:"version"` + Repository string `yaml:"repository"` + Alias string `yaml:"alias,omitempty"` + Values map[string]any `yaml:"-"` // do not export to Chart.yaml +} +``` + + +### func [DependenciesFrom]() + +```go +func DependenciesFrom(data string) ([]Dependency, error) +``` + +DependenciesFrom returns a slice of dependencies from the given string. + + +## type [EnvFrom]() + + + +```go +type EnvFrom []string +``` + + +### func [EnvFromFrom]() + +```go +func EnvFromFrom(data string) (EnvFrom, error) +``` + +EnvFromFrom returns a EnvFrom from the given string. + + +## type [Ingress]() + + + +```go +type Ingress struct { + // Hostname is the hostname to match against the request. It can contain wildcards. + Hostname string `yaml:"hostname"` + // Path is the path to match against the request. It can contain wildcards. + Path string `yaml:"path"` + // Enabled is a flag to enable or disable the ingress. + Enabled bool `yaml:"enabled"` + // Class is the ingress class to use. + Class string `yaml:"class"` + // Port is the port to use. + Port *int32 `yaml:"port,omitempty"` + // Annotations is a list of key-value pairs to add to the ingress. + Annotations map[string]string `yaml:"annotations,omitempty"` +} +``` + + +### func [IngressFrom]() + +```go +func IngressFrom(data string) (*Ingress, error) +``` + +IngressFrom creates a new Ingress from a compose service. + + +## type [MapEnv]() + + + +```go +type MapEnv map[string]string +``` + + +### func [MapEnvFrom]() + +```go +func MapEnvFrom(data string) (MapEnv, error) +``` + +MapEnvFrom returns a MapEnv from the given string. + + +## type [Ports]() + + + +```go +type Ports []uint32 +``` + + +### func [PortsFrom]() + +```go +func PortsFrom(data string) (Ports, error) +``` + +PortsFrom returns a Ports from the given string. + + +## type [Probe]() + + + +```go +type Probe struct { + LivenessProbe *corev1.Probe `yaml:"livenessProbe,omitempty"` + ReadinessProbe *corev1.Probe `yaml:"readinessProbe,omitempty"` +} +``` + + +### func [ProbeFrom]() + +```go +func ProbeFrom(data string) (*Probe, error) +``` + + + + +## type [Secrets]() + + + +```go +type Secrets []string +``` + + +### func [SecretsFrom]() + +```go +func SecretsFrom(data string) (Secrets, error) +``` + + + +Generated by [gomarkdoc]() diff --git a/doc/docs/statics/logo-bright.png b/doc/docs/statics/logo-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..4201c0393d81c2d14b61f4ec3b625089161d4fa5 GIT binary patch literal 15020 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

Hw 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 literal 0 HcmV?d00001 diff --git a/doc/docs/statics/logo-vertical.png b/doc/docs/statics/logo-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..ffbc5ef0b7b0d020afcb3147bf6be4f1a60377d6 GIT binary patch literal 14830 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 hostname - if hostname, ok := mapping["host"]; ok && hostname != "" { - mapping["hostname"] = hostname - } - Chart.Values[service.Name].(*Value).Ingress = &IngressValue{ - Enabled: mapping["enabled"].(bool), - Path: mapping["path"].(string), - Host: mapping["hostname"].(string), - Class: mapping["class"].(string), - Annotations: map[string]string{}, + Enabled: mapping.Enabled, + Path: mapping.Path, + Host: mapping.Hostname, + Class: mapping.Class, + Annotations: mapping.Annotations, } // ingressClassName := `{{ .Values.` + service.Name + `.ingress.class }}` ingressClassName := utils.TplValue(service.Name, "ingress.class") - servicePortName := utils.GetServiceNameByPort(int(mapping["port"].(int32))) + servicePortName := utils.GetServiceNameByPort(int(*mapping.Port)) ingressService := &networkv1.IngressServiceBackend{ Name: serviceName, Port: networkv1.ServiceBackendPort{}, @@ -83,7 +69,7 @@ func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress { if servicePortName != "" { ingressService.Port.Name = servicePortName } else { - ingressService.Port.Number = mapping["port"].(int32) + ingressService.Port.Number = *mapping.Port } ing := &Ingress{ diff --git a/generator/ingress_test.go b/generator/ingress_test.go index c81b2d4..7a039e1 100644 --- a/generator/ingress_test.go +++ b/generator/ingress_test.go @@ -19,7 +19,7 @@ services: - 443:443 labels: %s/ingress: |- - host: my.test.tld + hostname: my.test.tld port: 80 ` composeFile = fmt.Sprintf(composeFile, katenaryLabelPrefix) diff --git a/generator/labelStructs/configMap.go b/generator/labelStructs/configMap.go index 5457618..2b5112f 100644 --- a/generator/labelStructs/configMap.go +++ b/generator/labelStructs/configMap.go @@ -1,8 +1,13 @@ -package labelstructs +package labelStructs -type CronJob struct { - Image string `yaml:"image,omitempty"` - Command string `yaml:"command"` - Schedule string `yaml:"schedule"` - Rbac bool `yaml:"rbac"` +import "gopkg.in/yaml.v3" + +type ConfigMapFile []string + +func ConfigMapFileFrom(data string) (ConfigMapFile, error) { + var mapping ConfigMapFile + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil } diff --git a/generator/labelStructs/cronJob.go b/generator/labelStructs/cronJob.go new file mode 100644 index 0000000..8ec5dbd --- /dev/null +++ b/generator/labelStructs/cronJob.go @@ -0,0 +1,18 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type CronJob struct { + Image string `yaml:"image,omitempty"` + Command string `yaml:"command"` + Schedule string `yaml:"schedule"` + Rbac bool `yaml:"rbac"` +} + +func CronJobFrom(data string) (*CronJob, error) { + var mapping CronJob + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return &mapping, nil +} diff --git a/generator/labelStructs/dependencies.go b/generator/labelStructs/dependencies.go new file mode 100644 index 0000000..bc94b30 --- /dev/null +++ b/generator/labelStructs/dependencies.go @@ -0,0 +1,21 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +// Dependency is a dependency of a chart to other charts. +type Dependency struct { + Name string `yaml:"name"` + Version string `yaml:"version"` + Repository string `yaml:"repository"` + Alias string `yaml:"alias,omitempty"` + Values map[string]any `yaml:"-"` // do not export to Chart.yaml +} + +// DependenciesFrom returns a slice of dependencies from the given string. +func DependenciesFrom(data string) ([]Dependency, error) { + var mapping []Dependency + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil +} diff --git a/generator/labelStructs/doc.go b/generator/labelStructs/doc.go new file mode 100644 index 0000000..5373fcf --- /dev/null +++ b/generator/labelStructs/doc.go @@ -0,0 +1,2 @@ +// labelStructs is a package that contains the structs used to represent the labels in the yaml files. +package labelStructs diff --git a/generator/labelStructs/envFrom.go b/generator/labelStructs/envFrom.go new file mode 100644 index 0000000..f2c8f2f --- /dev/null +++ b/generator/labelStructs/envFrom.go @@ -0,0 +1,14 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type EnvFrom []string + +// EnvFromFrom returns a EnvFrom from the given string. +func EnvFromFrom(data string) (EnvFrom, error) { + var mapping EnvFrom + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil +} diff --git a/generator/labelStructs/ingress.go b/generator/labelStructs/ingress.go new file mode 100644 index 0000000..b01cd36 --- /dev/null +++ b/generator/labelStructs/ingress.go @@ -0,0 +1,33 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type Ingress struct { + // Hostname is the hostname to match against the request. It can contain wildcards. + Hostname string `yaml:"hostname"` + // Path is the path to match against the request. It can contain wildcards. + Path string `yaml:"path"` + // Enabled is a flag to enable or disable the ingress. + Enabled bool `yaml:"enabled"` + // Class is the ingress class to use. + Class string `yaml:"class"` + // Port is the port to use. + Port *int32 `yaml:"port,omitempty"` + // Annotations is a list of key-value pairs to add to the ingress. + Annotations map[string]string `yaml:"annotations,omitempty"` +} + +// IngressFrom creates a new Ingress from a compose service. +func IngressFrom(data string) (*Ingress, error) { + mapping := Ingress{ + Hostname: "", + Path: "/", + Enabled: false, + Class: "-", + Port: nil, + } + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return &mapping, nil +} diff --git a/generator/labelStructs/mapenv.go b/generator/labelStructs/mapenv.go new file mode 100644 index 0000000..6b4cdfa --- /dev/null +++ b/generator/labelStructs/mapenv.go @@ -0,0 +1,14 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type MapEnv map[string]string + +// MapEnvFrom returns a MapEnv from the given string. +func MapEnvFrom(data string) (MapEnv, error) { + var mapping MapEnv + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil +} diff --git a/generator/labelStructs/ports.go b/generator/labelStructs/ports.go new file mode 100644 index 0000000..253a075 --- /dev/null +++ b/generator/labelStructs/ports.go @@ -0,0 +1,14 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type Ports []uint32 + +// PortsFrom returns a Ports from the given string. +func PortsFrom(data string) (Ports, error) { + var mapping Ports + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil +} diff --git a/generator/labelStructs/probes.go b/generator/labelStructs/probes.go new file mode 100644 index 0000000..2860c23 --- /dev/null +++ b/generator/labelStructs/probes.go @@ -0,0 +1,19 @@ +package labelStructs + +import ( + "gopkg.in/yaml.v3" + corev1 "k8s.io/api/core/v1" +) + +type Probe struct { + LivenessProbe *corev1.Probe `yaml:"livenessProbe,omitempty"` + ReadinessProbe *corev1.Probe `yaml:"readinessProbe,omitempty"` +} + +func ProbeFrom(data string) (*Probe, error) { + var mapping Probe + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return &mapping, nil +} diff --git a/generator/labelStructs/secrets.go b/generator/labelStructs/secrets.go new file mode 100644 index 0000000..e5cfb36 --- /dev/null +++ b/generator/labelStructs/secrets.go @@ -0,0 +1,13 @@ +package labelStructs + +import "gopkg.in/yaml.v3" + +type Secrets []string + +func SecretsFrom(data string) (Secrets, error) { + var mapping Secrets + if err := yaml.Unmarshal([]byte(data), &mapping); err != nil { + return nil, err + } + return mapping, nil +}