init commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
compose.yaml
|
||||||
5
go.mod
Normal file
5
go.mod
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module code.jakeyoungdev.com/go/compose-parser
|
||||||
|
|
||||||
|
go 1.24.6
|
||||||
|
|
||||||
|
require gopkg.in/yaml.v3 v3.0.1
|
||||||
4
go.sum
Normal file
4
go.sum
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
106
main.go
Normal file
106
main.go
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RestartConfig struct {
|
||||||
|
Condition *string `yaml:"condition"`
|
||||||
|
Delay *string `yaml:"delay"`
|
||||||
|
MaxAttempts *int `yaml:"max_attempts"`
|
||||||
|
Window *string `yaml:"window"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DeployConfig struct {
|
||||||
|
Policy *RestartConfig `yaml:"restart_policy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServiceConfig struct {
|
||||||
|
MemLimit *string `yaml:"mem_limit"`
|
||||||
|
Cpus *float64 `yaml:"cpus"`
|
||||||
|
Ports *[]string `yaml:"ports"`
|
||||||
|
Deploy *DeployConfig `yaml:"deploy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Compose struct {
|
||||||
|
Services map[string]ServiceConfig `yaml:"services"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
filePath := os.Getenv("COMPOSE_FILE_PATH")
|
||||||
|
if filePath == "" {
|
||||||
|
filePath = "./compose.yaml"
|
||||||
|
}
|
||||||
|
f, err := os.Open(filePath)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
fd, err := io.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var data Compose
|
||||||
|
err = yaml.Unmarshal(fd, &data)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type report struct {
|
||||||
|
Name string
|
||||||
|
PolicyPresent bool
|
||||||
|
PortSafety bool
|
||||||
|
PortIssues []string
|
||||||
|
ResourceSafety bool
|
||||||
|
ResourceIssues []string
|
||||||
|
}
|
||||||
|
|
||||||
|
var issues []report
|
||||||
|
for name, serviceConf := range data.Services {
|
||||||
|
r := report{
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
|
||||||
|
if serviceConf.Ports != nil {
|
||||||
|
matched, err := regexp.Match(`.*:.*:.*`, []byte((*serviceConf.Ports)[0]))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !matched {
|
||||||
|
r.PortSafety = false
|
||||||
|
r.PortIssues = append(r.PortIssues, "host port does not have an IP addressed and is fully opened")
|
||||||
|
} else {
|
||||||
|
r.PortSafety = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r.PortSafety = true
|
||||||
|
}
|
||||||
|
|
||||||
|
r.ResourceSafety = true
|
||||||
|
if serviceConf.MemLimit == nil {
|
||||||
|
r.ResourceSafety = false
|
||||||
|
r.ResourceIssues = append(r.ResourceIssues, "no memory limit set")
|
||||||
|
}
|
||||||
|
if serviceConf.Cpus == nil {
|
||||||
|
r.ResourceSafety = false
|
||||||
|
r.ResourceIssues = append(r.ResourceIssues, "no cpu limit set")
|
||||||
|
}
|
||||||
|
|
||||||
|
if serviceConf.Deploy != nil && serviceConf.Deploy.Policy != nil {
|
||||||
|
r.PolicyPresent = true
|
||||||
|
} else {
|
||||||
|
r.PolicyPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%+v\n", r)
|
||||||
|
issues = append(issues, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user