Workin' Argo struct

This commit is contained in:
mr
2025-02-05 08:36:26 +01:00
parent a1d28f2563
commit a0b1117075
24 changed files with 459 additions and 119 deletions

View File

@@ -3,6 +3,7 @@ package models
import (
"strings"
"cloud.o-forge.io/core/oc-lib/models/common/models"
"cloud.o-forge.io/core/oc-lib/models/resources"
)
@@ -59,11 +60,25 @@ type TemplateMetadata struct {
Labels map[string]string `yaml:"labels,omitempty"`
}
type Key struct {
Key string `yaml:"key"`
}
type Artifact struct {
Name string `yaml:"name"`
Path string `yaml:"path"`
S3 *Key `yaml:"s3,omitempty"`
}
type InOut struct {
Parameters []Parameter `yaml:"parameters"`
Artifacts []Artifact `yaml:"artifacts,omitempty"`
}
type Template struct {
Name string `yaml:"name"`
Inputs struct {
Parameters []Parameter `yaml:"parameters"`
} `yaml:"inputs,omitempty"`
Name string `yaml:"name"`
Inputs InOut `yaml:"inputs,omitempty"`
Outputs InOut `yaml:"outputs,omitempty"`
Container Container `yaml:"container,omitempty"`
Dag *Dag `yaml:"dag,omitempty"`
Metadata TemplateMetadata `yaml:"metadata,omitempty"`
@@ -71,39 +86,43 @@ type Template struct {
}
func (template *Template) CreateContainer(processing *resources.ProcessingResource, dag *Dag) {
container := Container{Image: processing.Container.Image}
instance := processing.GetSelectedInstance()
if instance == nil {
return
}
inst := instance.(*resources.ProcessingInstance)
container := Container{Image: inst.Access.Container.Image}
if container.Image == "" {
return
}
container.Command = []string{"sh", "-c"} // all is bash
for name := range processing.Container.Env {
template.Inputs.Parameters = append(template.Inputs.Parameters, Parameter{Name: name})
for _, v := range inst.Env {
template.Inputs.Parameters = append(template.Inputs.Parameters, Parameter{Name: v.Name})
}
for _, a := range strings.Split(processing.Container.Args, " ") {
container.Args = append(container.Args, template.replacePerEnv(a, processing.Container.Env, dag))
for _, v := range inst.Inputs {
template.Inputs.Parameters = append(template.Inputs.Parameters, Parameter{Name: v.Name})
}
cmd := strings.ReplaceAll(processing.Container.Command, container.Image, "")
container.Args = []string{cmd + " " + strings.Join(container.Args, " ")}
for _, v := range inst.Inputs {
template.Outputs.Parameters = append(template.Inputs.Parameters, Parameter{Name: v.Name})
}
cmd := strings.ReplaceAll(inst.Access.Container.Command, container.Image, "")
for _, a := range strings.Split(cmd, " ") {
container.Args = append(container.Args, template.ReplacePerEnv(a, inst.Env))
}
for _, a := range strings.Split(inst.Access.Container.Args, " ") {
container.Args = append(container.Args, template.ReplacePerEnv(a, inst.Env))
}
container.Args = []string{strings.Join(container.Args, " ")}
template.Container = container
}
func (template *Template) replacePerEnv(arg string, envs map[string]string, dag *Dag) string {
for k, v := range envs {
if strings.Contains(arg, k) {
value := v
for _, task := range dag.Tasks {
if task.Name == template.Name {
for _, p := range task.Arguments.Parameters {
if p.Name == k {
value = p.Value
break
}
}
}
}
arg = strings.ReplaceAll(arg, "$"+k, value)
arg = strings.ReplaceAll(arg, "${"+k+"}", value)
arg = strings.ReplaceAll(arg, k, value)
func (template *Template) ReplacePerEnv(arg string, envs []models.Param) string {
for _, v := range envs {
if strings.Contains(arg, v.Name) {
value := "{{ inputs.parameters." + v.Name + " }}"
arg = strings.ReplaceAll(arg, v.Name, value)
arg = strings.ReplaceAll(arg, "$"+v.Name, value)
arg = strings.ReplaceAll(arg, "$", "")
}
}
return arg