You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by zr...@apache.org on 2021/05/25 21:07:49 UTC

[trafficcontrol] branch master updated: Fix t3c reval to reload (#5887)

This is an automated email from the ASF dual-hosted git repository.

zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 7af518a  Fix t3c reval to reload (#5887)
7af518a is described below

commit 7af518a2414de9653d6cc9d78a087a8df998826b
Author: Robert O Butts <ro...@users.noreply.github.com>
AuthorDate: Tue May 25 15:07:31 2021 -0600

    Fix t3c reval to reload (#5887)
    
    Reval reload was failing because reval doesn't get and check packages
    from Traffic Ops. Which it doesn't need to, but the func to check
    if a package was installed was only checking the cache populated by
    the TO fetch.
    
    This fixes it to check rpm if the requested package isn't in the
    cache, which then fixes the call to know trafficserver is installed,
    which then fixes the thing that calls that to reload ATS correctly.
---
 cache-config/t3c-apply/t3c-apply.go               |  4 +-
 cache-config/t3c-apply/torequest/torequest.go     | 64 ++++++++++++++++-------
 cache-config/testing/ort-tests/t3c-reload_test.go | 41 +++++++++++++++
 3 files changed, 88 insertions(+), 21 deletions(-)

diff --git a/cache-config/t3c-apply/t3c-apply.go b/cache-config/t3c-apply/t3c-apply.go
index 396a892..3055cbe 100644
--- a/cache-config/t3c-apply/t3c-apply.go
+++ b/cache-config/t3c-apply/t3c-apply.go
@@ -120,7 +120,9 @@ func main() {
 		syncdsUpdate, err = trops.CheckRevalidateState(false)
 		if err != nil || syncdsUpdate == torequest.UpdateTropsNotNeeded {
 			if err != nil {
-				log.Errorln(err)
+				log.Errorln("Checking revalidate state: " + err.Error())
+			} else {
+				log.Infoln("Checking revalidate state: returned UpdateTropsNotNeeded")
 			}
 			GitCommitAndExit(RevalidationError, cfg)
 		}
diff --git a/cache-config/t3c-apply/torequest/torequest.go b/cache-config/t3c-apply/torequest/torequest.go
index b917dd3..38e941b 100644
--- a/cache-config/t3c-apply/torequest/torequest.go
+++ b/cache-config/t3c-apply/torequest/torequest.go
@@ -629,9 +629,26 @@ func (r *TrafficOpsReq) CheckSystemServices() error {
 func (r *TrafficOpsReq) IsPackageInstalled(name string) bool {
 	for k, v := range r.pkgs {
 		if strings.HasPrefix(k, name) {
+			log.Infof("IsPackageInstalled '%v' found '%v' in cache, returning %v\n", name, k, v)
 			return v
 		}
 	}
+
+	log.Infof("IsPackageInstalled '%v' not found in cache, querying rpm", name)
+	pkgArr, err := util.PackageInfo("pkg-query", name)
+	if err != nil {
+		log.Errorf(`IsPackageInstalled PackageInfo(pkg-query, %v) failed, caching as not installed and returning false! Error: %v\n`, name, err.Error())
+		r.pkgs[name] = false
+		return false
+	}
+	if len(pkgArr) > 0 {
+		pkgAndVersion := pkgArr[0]
+		log.Infof("IsPackageInstalled '%v' found in rpm, adding '%v' to cache", name, pkgAndVersion)
+		r.pkgs[pkgAndVersion] = true
+		return true
+	}
+	log.Infof("IsPackageInstalled '%v' not found in rpm, adding '%v'=false to cache", name, name)
+	r.pkgs[name] = false
 	return false
 }
 
@@ -709,36 +726,41 @@ func (r *TrafficOpsReq) CheckRevalidateState(sleepOverride bool) (UpdateStatus,
 		serverStatus, err := getUpdateStatus(r.Cfg)
 		log.Infof("my status: %s\n", serverStatus.Status)
 		if err != nil {
-			log.Errorln(err)
-			return updateStatus, err
-		} else {
-			if serverStatus.UseRevalPending == false {
-				log.Errorln("Update URL: Instant invalidate is not enabled.  Separated revalidation requires upgrading to Traffic Ops version 2.2 and enabling this feature.")
-				return UpdateTropsNotNeeded, nil
-			}
-			if serverStatus.RevalPending == true {
-				log.Errorln("Traffic Ops is signaling that a revalidation is waiting to be applied.")
-				updateStatus = UpdateTropsNeeded
-				if serverStatus.ParentRevalPending == true {
-					log.Errorln("Traffic Ops is signaling that my parents need to revalidate.")
-					// no update needed until my parents are updated.
+			log.Errorln("getting update status: " + err.Error())
+			return updateStatus, errors.New("getting update status: " + err.Error())
+		}
+		if serverStatus.UseRevalPending == false {
+			log.Errorln("Update URL: Instant invalidate is not enabled.  Separated revalidation requires upgrading to Traffic Ops version 2.2 and enabling this feature.")
+			return UpdateTropsNotNeeded, nil
+		}
+		if serverStatus.RevalPending == true {
+			log.Errorln("Traffic Ops is signaling that a revalidation is waiting to be applied.")
+			updateStatus = UpdateTropsNeeded
+			if serverStatus.ParentRevalPending == true {
+				if r.Cfg.WaitForParents {
+					log.Infoln("Traffic Ops is signaling that my parents need to revalidate, not revalidating.")
 					updateStatus = UpdateTropsNotNeeded
+				} else {
+					log.Infoln("Traffic Ops is signaling that my parents need to revalidate, but wait-for-parents is false, revalidating anyway.")
 				}
-			} else if serverStatus.RevalPending == false && r.Cfg.RunMode == t3cutil.ModeRevalidate {
-				log.Errorln("In revalidate mode, but no update needs to be applied. I'm outta here.")
-				return UpdateTropsNotNeeded, nil
-			} else {
-				log.Errorln("Traffic Ops is signaling that no revalidations are waiting to be applied.")
-				return UpdateTropsNotNeeded, nil
 			}
+		} else if serverStatus.RevalPending == false && r.Cfg.RunMode == t3cutil.ModeRevalidate {
+			log.Errorln("In revalidate mode, but no update needs to be applied. I'm outta here.")
+			return UpdateTropsNotNeeded, nil
+		} else {
+			log.Errorln("Traffic Ops is signaling that no revalidations are waiting to be applied.")
+			return UpdateTropsNotNeeded, nil
 		}
 
 		err = r.checkStatusFiles(serverStatus.Status)
 		if err != nil {
-			log.Errorln(err)
+			log.Errorln(errors.New("checking status files: " + err.Error()))
+		} else {
+			log.Infoln("CheckRevalidateState checkStatusFiles returned nil error")
 		}
 	}
 
+	log.Infof("CheckRevalidateState returning %v\n", updateStatus)
 	return updateStatus, nil
 }
 
@@ -878,11 +900,13 @@ func (r *TrafficOpsReq) ProcessConfigFiles() (UpdateStatus, error) {
 // ProcessPackages retrieves a list of required RPM's from Traffic Ops
 // and determines which need to be installed or removed on the cache.
 func (r *TrafficOpsReq) ProcessPackages() error {
+	log.Infoln("Calling ProcessPackages")
 	// get the package list for this cache from Traffic Ops.
 	pkgs, err := getPackages(r.Cfg)
 	if err != nil {
 		return errors.New("getting packages: " + err.Error())
 	}
+	log.Infof("ProcessPackages got %+v\n", pkgs)
 
 	var install []string   // install package list.
 	var uninstall []string // uninstall package list
diff --git a/cache-config/testing/ort-tests/t3c-reload_test.go b/cache-config/testing/ort-tests/t3c-reload_test.go
index c6c66e3..1a19477 100644
--- a/cache-config/testing/ort-tests/t3c-reload_test.go
+++ b/cache-config/testing/ort-tests/t3c-reload_test.go
@@ -36,6 +36,7 @@ func TestT3cReload(t *testing.T) {
 		doTestT3cReloadHeaderRewrite(t)
 		doTestT3cReloadAnythingInTrafficserverDir(t)
 		doTestT3cReloadNoChange(t)
+		doTestT3cRevalCallsReload(t)
 
 	})
 	t.Logf("------------- End of TestT3cReload ---------------")
@@ -157,6 +158,46 @@ func doTestT3cReloadNoChange(t *testing.T) {
 	t.Logf("------------- End TestT3cReload doTestT3cReloadNoChange ---------------")
 }
 
+func doTestT3cRevalCallsReload(t *testing.T) {
+	t.Logf("------------- Start TestT3cReload doTestT3cRevalCallsReload ---------------")
+
+	cacheHostName := "atlanta-edge-03"
+
+	t.Logf("DEBUG doTestT3cRevalCallsReload calling badass")
+	if stdOut, exitCode := t3cUpdateReload(cacheHostName, "badass"); exitCode != 0 {
+		t.Fatalf("ERROR: t3c badass failed: code '%v' output '%v'\n", exitCode, stdOut)
+	}
+
+	t.Logf("DEBUG doTestT3cRevalCallsReload deleting file")
+
+	// delete a regex_revalidate.config to trigger a reval change and reload
+	fileNameToRemove := filepath.Join(test_config_dir, "regex_revalidate.config")
+	if err := os.Remove(fileNameToRemove); err != nil {
+		t.Fatalf("failed to remove file '" + fileNameToRemove + "': " + err.Error())
+	}
+
+	t.Logf("DEBUG doTestT3cRevalCallsReload setting reval flag")
+	// set the update flag, so reval will run
+	if err := ExecTOUpdater("atlanta-edge-03", true, false); err != nil {
+		t.Fatalf("t3c-update failed: %v\n", err)
+	}
+
+	t.Logf("DEBUG doTestT3cReloadHeaderRewrite calling revalidate")
+	stdOut, _ := t3cUpdateReload(cacheHostName, "revalidate")
+	// Ignore the exit code error for now, because the ORT Integration Test Framework doesn't currently start ATS.
+	// TODO check err, after running ATS is added to the tests.
+	// if err != nil {
+	// 	t.Fatalf("t3c syncds failed: %v\n", err)
+	// }
+
+	t.Logf("DEBUG TestT3cReload looking for reload string")
+	if !strings.Contains(stdOut, `Running 'traffic_ctl config reload' now`) {
+		t.Errorf("expected t3c to reload after reval change, actual: '''%v'''\n", stdOut)
+	}
+
+	t.Logf("------------- End TestT3cReload doTestT3cRevalCallsReload ---------------")
+}
+
 func t3cUpdateReload(host string, runMode string) (string, int) {
 	args := []string{
 		"apply",