add support for multiple document definitions
All checks were successful
Lint / golangci-lint (push) Successful in 10m9s
Declarative Tests / test (push) Successful in 1m21s

This commit is contained in:
Matthew Rich 2024-04-12 09:08:08 -07:00
parent adea95972d
commit 0a6d1a93ee
4 changed files with 55 additions and 27 deletions

View File

@ -1,19 +1,22 @@
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved. // Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package main package main
import ( import (
"io"
"os" "os"
"flag" "flag"
"log" "log"
"log/slog" "log/slog"
"fmt" "errors"
_ "fmt"
_ "gopkg.in/yaml.v3" _ "gopkg.in/yaml.v3"
"decl/internal/resource" "decl/internal/resource"
) )
func main() { func main() {
fmt.Print("debugging\n")
var programLevel = new(slog.LevelVar) var programLevel = new(slog.LevelVar)
logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel})) logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel}))
slog.SetDefault(logger) slog.SetDefault(logger)
@ -23,7 +26,6 @@ func main() {
programLevel.Set(slog.LevelError) programLevel.Set(slog.LevelError)
} }
fmt.Print("debugging: flags\n")
file := flag.String("resource-file", "", "Resource file path") file := flag.String("resource-file", "", "Resource file path")
resourceUri := flag.String("import-resource", "", "Add an existing resource") resourceUri := flag.String("import-resource", "", "Add an existing resource")
@ -49,27 +51,49 @@ func main() {
log.Fatal(inputFileErr) log.Fatal(inputFileErr)
} }
d := resource.NewDocument() documents := make([]*resource.Document, 0, 100)
decoder := resource.NewYAMLDecoder(resourceFile)
encoder := resource.NewYAMLEncoder(os.Stdout)
index := 0
slog.Info("loading resource document", "file", resourceFile) slog.Info("loading resource document", "file", resourceFile)
if *file != "" {
if e := d.Load(resourceFile); e != nil { documents = append(documents, resource.NewDocument())
log.Fatal(e) if resourceFile != nil {
} for {
if validationErr := d.Validate(); validationErr != nil { d := documents[index]
log.Fatal(validationErr) e := decoder.Decode(d)
} if errors.Is(e, io.EOF) {
if applyErr := d.Apply(); applyErr != nil { if len(documents) > 1 {
log.Fatal(applyErr) documents[index] = nil
}
break
}
if e != nil {
log.Fatal(e)
}
if validationErr := d.Validate(); validationErr != nil {
log.Fatal(validationErr)
}
if applyErr := d.Apply(); applyErr != nil {
log.Fatal(applyErr)
}
documents = append(documents, resource.NewDocument())
index++
} }
} }
if *resourceUri != "" {
slog.Info("importing resource", "resource", *resourceUri)
if addResourceErr := d.AddResource(*resourceUri); addResourceErr != nil {
log.Fatal(addResourceErr)
}
}
if documentGenerateErr := d.Generate(os.Stdout); documentGenerateErr != nil { for _,document := range documents {
log.Fatal(documentGenerateErr) if document != nil {
if *resourceUri != "" {
slog.Info("importing resource", "resource", *resourceUri)
if addResourceErr := document.AddResource(*resourceUri); addResourceErr != nil {
log.Fatal(addResourceErr)
}
}
if documentGenerateErr := encoder.Encode(document); documentGenerateErr != nil {
log.Fatal(documentGenerateErr)
}
}
} }
} }

View File

@ -63,7 +63,7 @@ func (d *Declaration) Resource() Resource {
} }
func (d *Declaration) SetURI(uri string) error { func (d *Declaration) SetURI(uri string) error {
slog.Info("SetURI()", "uri", uri) slog.Info("Declaration.SetURI()", "uri", uri, "declaration", d)
d.Attributes = NewResource(uri) d.Attributes = NewResource(uri)
if d.Attributes == nil { if d.Attributes == nil {
panic("unknown resource") panic("unknown resource")

View File

@ -1,4 +1,5 @@
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved. // Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package resource package resource
import ( import (

View File

@ -6,6 +6,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"log/slog"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"io" "io"
"net/url" "net/url"
@ -41,7 +42,6 @@ func init() {
// Manage the state of file system objects // Manage the state of file system objects
type File struct { type File struct {
loader YamlLoader
Path string `json:"path" yaml:"path"` Path string `json:"path" yaml:"path"`
Owner string `json:"owner" yaml:"owner"` Owner string `json:"owner" yaml:"owner"`
Group string `json:"group" yaml:"group"` Group string `json:"group" yaml:"group"`
@ -60,7 +60,9 @@ type File struct {
func NewFile() *File { func NewFile() *File {
currentUser, _ := user.Current() currentUser, _ := user.Current()
group, _ := user.LookupGroupId(currentUser.Gid) group, _ := user.LookupGroupId(currentUser.Gid)
return &File{loader: YamlLoadDecl, Owner: currentUser.Username, Group: group.Name, Mode: "0666", FileType: RegularFile} f := &File{Owner: currentUser.Username, Group: group.Name, Mode: "0666", FileType: RegularFile}
slog.Info("NewFile()", "file", f)
return f
} }
func (f *File) URI() string { func (f *File) URI() string {
@ -152,8 +154,9 @@ func (f *File) Apply() error {
return nil return nil
} }
func (f *File) LoadDecl(yamlFileResourceDeclaration string) error { func (f *File) LoadDecl(yamlResourceDeclaration string) error {
return f.loader(yamlFileResourceDeclaration, f) d := NewYAMLStringDecoder(yamlResourceDeclaration)
return d.Decode(f)
} }
func (f *File) ResolveId(ctx context.Context) string { func (f *File) ResolveId(ctx context.Context) string {
@ -193,7 +196,7 @@ func (f *File) ReadStat() error {
//panic(userErr) //panic(userErr)
f.Owner = userId f.Owner = userId
} else { } else {
f.Owner = fileUser.Name f.Owner = fileUser.Username
} }
fileGroup, groupErr := user.LookupGroupId(groupId) fileGroup, groupErr := user.LookupGroupId(groupId)
if groupErr != nil { if groupErr != nil {