From 70ce3148a9105bf80bfa2892a5ab853bc779861e Mon Sep 17 00:00:00 2001 From: Matthijs Wolters Date: Thu, 24 Oct 2024 11:29:54 +0200 Subject: [PATCH] Implement Equals function using TestTags (#3) * WIP add config option * Update controller-gen version Fixes the broken v0.9 of controller-gen because it causes a segfault when running `make install` * Update formatting for base CRDS * Working read secret * Fixed read secret * Use new secret function not client function * Revert random formatting changes * More stupid formatting fixes * Final formatting fixes I don't like formatting :( * Small fixes and docs update * Update example * Update CRDs * Add raw_post_data var to statuscake * Add user_agent var to statuscake * Update formatting for user_agent * Fix tabs in statuscake-monitor.go * Update base crds * Docs and example update * Update CRDs * Implement Equals function using TestTags It is mentioned in a comment in the code itself but because of the discrepency between the fields in the EndpointMonitor CR and the Statuscake API it is not immediately clear how to compare an old monitor with an updated monitor. The way I have elected to check this is to use the TestTags field to include some kind of identifier that should be updated on any change. So if the tags have changed then the monitor should be updated. --- pkg/monitors/statuscake/statuscake-mappers.go | 11 ++++++++++ pkg/monitors/statuscake/statuscake-monitor.go | 21 +++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/pkg/monitors/statuscake/statuscake-mappers.go b/pkg/monitors/statuscake/statuscake-mappers.go index a5b8715a..5eed6537 100644 --- a/pkg/monitors/statuscake/statuscake-mappers.go +++ b/pkg/monitors/statuscake/statuscake-mappers.go @@ -1,7 +1,10 @@ package statuscake import ( + "strings" + statuscake "github.com/StatusCakeDev/statuscake-go" + endpointmonitorv1alpha1 "github.com/stakater/IngressMonitorController/v2/api/v1alpha1" "github.com/stakater/IngressMonitorController/v2/pkg/models" ) @@ -11,6 +14,10 @@ func StatusCakeMonitorMonitorToBaseMonitorMapper(statuscakeData StatusCakeMonito m.Name = statuscakeData.WebsiteName m.URL = statuscakeData.WebsiteURL m.ID = statuscakeData.TestID + + var providerConfig endpointmonitorv1alpha1.StatusCakeConfig + providerConfig.TestTags = strings.Join(statuscakeData.Tags, ",") + m.Config = &providerConfig return &m } @@ -20,6 +27,10 @@ func StatusCakeApiResponseDataToBaseMonitorMapper(statuscakeData statuscake.Upti m.Name = statuscakeData.Data.Name m.URL = statuscakeData.Data.WebsiteURL m.ID = statuscakeData.Data.ID + + var providerConfig endpointmonitorv1alpha1.StatusCakeConfig + providerConfig.TestTags = strings.Join(statuscakeData.Data.Tags, ",") + m.Config = &providerConfig return &m } diff --git a/pkg/monitors/statuscake/statuscake-monitor.go b/pkg/monitors/statuscake/statuscake-monitor.go index ac3f4331..3cdcd35f 100644 --- a/pkg/monitors/statuscake/statuscake-monitor.go +++ b/pkg/monitors/statuscake/statuscake-monitor.go @@ -34,8 +34,17 @@ type StatusCakeMonitorService struct { } func (monitor *StatusCakeMonitorService) Equal(oldMonitor models.Monitor, newMonitor models.Monitor) bool { - // TODO: Retrieve oldMonitor config and compare it here - return false + // Since there is a discrepency between the fields in the endpointmonitor CR and the statuscake API + // use the tags to define a last updated by tags. This ensures we are not ratelimited by statuscake. + oldConf := oldMonitor.Config.(*endpointmonitorv1alpha1.StatusCakeConfig) + newConf := newMonitor.Config.(*endpointmonitorv1alpha1.StatusCakeConfig) + if oldConf.TestTags != newConf.TestTags { + msg := "Found a difference between the old TestTags and new TestTags. Updating the UptimeCheck..." + log.Info(msg, "Old Tags", oldConf.TestTags, "New Tags", newConf.TestTags) + return false + } else { + return true + } } // buildUpsertForm function is used to create the form needed to Add or update a monitor @@ -219,15 +228,15 @@ func buildUpsertForm(m models.Monitor, cgroup string) url.Values { if providerConfig != nil && providerConfig.Confirmation > 0 { f.Add("confirmation", strconv.Itoa(providerConfig.Confirmation)) } - if providerConfig != nil { + if providerConfig != nil && len(providerConfig.FindString) > 0 { f.Add("find_string", providerConfig.FindString) } if providerConfig != nil && len(providerConfig.RawPostData) > 0 { f.Add("post_raw", providerConfig.RawPostData) } - if providerConfig != nil && len(providerConfig.UserAgent) > 0 { - f.Add("user_agent", providerConfig.UserAgent) - } + if providerConfig != nil && len(providerConfig.UserAgent) > 0 { + f.Add("user_agent", providerConfig.UserAgent) + } return f }