diff --git a/go.mod b/go.mod index 4817ea0..53e2727 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,13 @@ go 1.23.1 require ( github.com/a-h/templ v0.2.778 - github.com/go-co-op/gocron/v2 v2.11.0 + github.com/go-co-op/gocron/v2 v2.12.1 github.com/jmoiron/sqlx v1.4.0 github.com/joho/godotenv v1.5.1 - github.com/pressly/goose/v3 v3.22.0 + github.com/pressly/goose/v3 v3.22.1 github.com/vmware/govmomi v0.43.0 - modernc.org/sqlite v1.33.0 + gopkg.in/yaml.v2 v2.4.0 + modernc.org/sqlite v1.33.1 ) require ( @@ -24,11 +25,12 @@ require ( github.com/robfig/cron/v3 v3.0.1 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.25.0 // indirect golang.org/x/tools v0.25.0 // indirect modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect + modernc.org/libc v1.61.0 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.8.0 // indirect modernc.org/strutil v1.2.0 // indirect diff --git a/go.sum b/go.sum index c6f496d..1998c34 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/go-co-op/gocron/v2 v2.11.0 h1:IOowNA6SzwdRFnD4/Ol3Kj6G2xKfsoiiGq2Jhhm9bvE= github.com/go-co-op/gocron/v2 v2.11.0/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w= +github.com/go-co-op/gocron/v2 v2.12.1 h1:dCIIBFbzhWKdgXeEifBjHPzgQ1hoWhjS4289Hjjy1uw= +github.com/go-co-op/gocron/v2 v2.12.1/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -24,6 +26,10 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -38,10 +44,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pressly/goose/v3 v3.22.0 h1:wd/7kNiPTuNAztWun7iaB98DrhulbWPrzMAaw2DEZNw= github.com/pressly/goose/v3 v3.22.0/go.mod h1:yJM3qwSj2pp7aAaCvso096sguezamNb2OBgxCnh/EYg= +github.com/pressly/goose/v3 v3.22.1 h1:2zICEfr1O3yTP9BRZMGPj7qFxQ+ik6yeo+z1LMuioLc= +github.com/pressly/goose/v3 v3.22.1/go.mod h1:xtMpbstWyCpyH+0cxLTMCENWBG+0CSxvTsXhW95d5eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= @@ -54,6 +64,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= @@ -63,18 +75,27 @@ golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M= modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.61.0 h1:eGFcvWpqlnoGwzZeZe3PWJkkKbM/3SUGyk1DVZQ0TpE= +modernc.org/libc v1.61.0/go.mod h1:DvxVX89wtGTu+r72MLGhygpfi3aUGgZRdAYGCAVVud0= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= modernc.org/sqlite v1.33.0 h1:WWkA/T2G17okiLGgKAj4/RMIvgyMT19yQ038160IeYk= modernc.org/sqlite v1.33.0/go.mod h1:9uQ9hF/pCZoYZK73D/ud5Z7cIRIILSZI8NdIemVMTX8= +modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM= +modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/settings/settings.go b/internal/settings/settings.go new file mode 100644 index 0000000..414be37 --- /dev/null +++ b/internal/settings/settings.go @@ -0,0 +1,60 @@ +package settings + +import ( + "log/slog" + "os" + "vctp/internal/utils" + + "gopkg.in/yaml.v2" +) + +// SettingsYML struct holds various runtime data that is too cumbersome to specify via command line, eg replacement properties +type SettingsYML struct { + Settings struct { + /* + Replacements []struct { + Key string `yaml:"Key"` + Value string `yaml:"Value"` + } `yaml:"replacements"` + + Omapi struct { + KeyName string `yaml:"key_name"` + KeySecret string `yaml:"key_secret"` + } `yaml:"omapi"` + */ + TenantsToFilter []string `yaml:"tenants_to_filter"` + NodeChargeClusters []string `yaml:"node_charge_clusters"` + SrmActiveActiveVms []string `yaml:"srm_activeactive_vms"` + VcenterAddresses []string `yaml:"vcenter_addresses"` + } `yaml:"settings"` +} + +func ReadYMLSettings(logger *slog.Logger, settingsPath string) (SettingsYML, error) { + // Create config structure + var settings SettingsYML + + // Check for empty filename + if len(settingsPath) == 0 { + return settings, nil + } + + path := utils.GetFilePath(settingsPath) + + // Open config file + file, err := os.Open(path) + if err != nil { + return settings, err + } + logger.Debug("Opened settings yaml file", "file_path", path) + defer file.Close() + + // Init new YAML decode + d := yaml.NewDecoder(file) + + // Start YAML decoding from file + if err := d.Decode(&settings); err != nil { + return settings, err + } + + return settings, nil +} diff --git a/internal/tasks/processEvents.go b/internal/tasks/processEvents.go index ea273e5..f27355b 100644 --- a/internal/tasks/processEvents.go +++ b/internal/tasks/processEvents.go @@ -7,6 +7,7 @@ import ( "time" "vctp/db" "vctp/db/queries" + "vctp/internal/settings" "vctp/internal/vcenter" "github.com/vmware/govmomi/vim25/types" @@ -16,6 +17,7 @@ import ( type CronTask struct { Logger *slog.Logger Database db.Database + Settings settings.SettingsYML } // use gocron to check events in the Events table diff --git a/main b/main deleted file mode 100755 index 6500bb2..0000000 Binary files a/main and /dev/null differ diff --git a/main.go b/main.go index e124de5..1d7cdbf 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "runtime" "time" "vctp/db" + "vctp/internal/settings" "vctp/internal/tasks" utils "vctp/internal/utils" "vctp/log" @@ -55,17 +56,19 @@ func main() { os.Exit(1) } - // Prepare the task scheduler - s, err := gocron.NewScheduler() - if err != nil { - logger.Error("failed to create scheduler", "error", err) - os.Exit(1) + // Load settings from yaml + settingsFile := os.Getenv("SETTINGS_FILE") + if settingsFile == "" { + settingsFile = "settings.yaml" } - // Pass useful information to the cron jobs - c := &tasks.CronTask{ - Logger: logger, - Database: database, + // TODO - how to pass this to the other packages that will need this info? + s, err := settings.ReadYMLSettings(logger, settingsFile) + if err != nil { + logger.Error("failed to open yaml settings file", "error", err, "filename", settingsFile) + //os.Exit(1) + } else { + logger.Debug("Loaded yaml settings", "contents", s) } // Determine bind IP @@ -108,6 +111,20 @@ func main() { utils.GenerateCerts(tlsCertFilename, tlsKeyFilename) } + // Prepare the task scheduler + c, err := gocron.NewScheduler() + if err != nil { + logger.Error("failed to create scheduler", "error", err) + os.Exit(1) + } + + // Pass useful information to the cron jobs + ct := &tasks.CronTask{ + Logger: logger, + Database: database, + Settings: s, + } + cronFrequencyString := os.Getenv("VCENTER_POLLING_SECONDS") if cronFrequencyString != "" { cronFrequency, err = time.ParseDuration(cronFrequencyString) @@ -122,10 +139,10 @@ func main() { // start background processing for events stored in events table startsAt := time.Now().Add(time.Second * 10) - job, err := s.NewJob( + job, err := c.NewJob( gocron.DurationJob(cronFrequency), gocron.NewTask(func() { - c.RunVmCheck(ctx, logger) + ct.RunVmCheck(ctx, logger) }), gocron.WithSingletonMode(gocron.LimitModeReschedule), gocron.WithStartAt(gocron.WithStartDateTime(startsAt)), ) @@ -136,10 +153,10 @@ func main() { logger.Debug("Created event processing cron job", "job", job.ID()) startsAt2 := time.Now().Add(time.Second * 10) - job2, err := s.NewJob( + job2, err := c.NewJob( gocron.DurationJob(cronFrequency), gocron.NewTask(func() { - c.RunVcenterPoll(ctx, logger) + ct.RunVcenterPoll(ctx, logger) }), gocron.WithSingletonMode(gocron.LimitModeReschedule), gocron.WithStartAt(gocron.WithStartDateTime(startsAt2)), ) @@ -150,12 +167,12 @@ func main() { logger.Debug("Created vcenter polling cron job", "job", job2.ID()) // start cron scheduler - s.Start() + c.Start() // Start server svr := server.New( logger, - s, + c, cancel, bindAddress, server.WithRouter(router.New(logger, database, buildTime, sha1ver, runtime.Version())), diff --git a/settings.yaml b/settings.yaml new file mode 100644 index 0000000..dfd3d28 --- /dev/null +++ b/settings.yaml @@ -0,0 +1,7 @@ +settings: + tenants_to_filter: + - "DecomVM" + node_charge_clusters: + - ".*CMD.*" + srm_activeactive_vms: + vcenter_addresses: \ No newline at end of file