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

zwoop pushed a commit to branch 8.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 1b2305cb5b078f9d1fff5b3196af63a615b31520
Author: Xavier Chi <chitianha...@gmail.com>
AuthorDate: Thu Aug 2 14:16:54 2018 -0500

    Runroot: pass runroot down from manager and error message update
    
    
    (cherry picked from commit 39b3273a703b15e2d619519f7952e37504738956)
---
 lib/records/RecConfigParse.cc                    |  2 +-
 lib/ts/runroot.cc                                | 49 +++++++++++-----------
 lib/ts/runroot.h                                 |  4 +-
 mgmt/LocalManager.cc                             | 10 +++++
 src/traffic_layout/engine.cc                     | 14 ++++---
 src/traffic_manager/traffic_manager.cc           |  3 ++
 tests/gold_tests/runroot/runroot_error.test.py   |  7 +---
 tests/gold_tests/runroot/runroot_init.test.py    | 15 +++----
 tests/gold_tests/runroot/runroot_manager.test.py | 52 ++++++++++++++++++++++++
 tests/gold_tests/runroot/runroot_remove.test.py  | 12 ++----
 tests/gold_tests/runroot/runroot_use.test.py     |  7 +---
 tests/gold_tests/runroot/runroot_verify.test.py  |  5 +--
 12 files changed, 115 insertions(+), 65 deletions(-)

diff --git a/lib/records/RecConfigParse.cc b/lib/records/RecConfigParse.cc
index 81fecad..b690375 100644
--- a/lib/records/RecConfigParse.cc
+++ b/lib/records/RecConfigParse.cc
@@ -89,7 +89,7 @@ RecFileImport_Xmalloc(const char *file, char **file_buf, int 
*file_size)
 bool
 RecConfigOverrideFromRunroot(const char *name)
 {
-  if (use_runroot()) {
+  if (!get_runroot().empty()) {
     if (!strcmp(name, "proxy.config.bin_path") || !strcmp(name, 
"proxy.config.local_state_dir") ||
         !strcmp(name, "proxy.config.log.logfile_dir") || !strcmp(name, 
"proxy.config.plugin.plugin_dir"))
       return true;
diff --git a/lib/ts/runroot.cc b/lib/ts/runroot.cc
index 8e5f0f4..bde8602 100644
--- a/lib/ts/runroot.cc
+++ b/lib/ts/runroot.cc
@@ -53,22 +53,25 @@ static std::string runroot_file = {};
 // the function for the checking of the yaml file in the passed in path
 // if found return the path to the yaml file, if not return empty string.
 static std::string
-get_yaml_path(const std::string &path)
+get_yaml_path(const std::string &path, bool json)
 {
-  std::ifstream check_file;
+  std::string yaml_file;
   if (ink_file_is_directory(path.c_str())) {
-    std::string yaml_path = Layout::relative_to(path, "runroot_path.yml");
-    check_file.open(yaml_path);
-    if (check_file.good()) {
-      return yaml_path;
-    }
+    yaml_file = Layout::relative_to(path, "runroot_path.yml");
   } else {
-    check_file.open(path);
-    if (check_file.good() && path.substr(path.find_last_of("/") + 1) == 
"runroot_path.yml") {
-      return path;
+    if (path.substr(path.find_last_of("/") + 1) == "runroot_path.yml") {
+      yaml_file = path;
     }
   }
-  return {};
+  std::ifstream check_file;
+  check_file.open(yaml_file);
+  if (!check_file.good()) {
+    if (!json) {
+      ink_warning("Unable to access runroot: '%s' - %s", yaml_file.c_str(), 
strerror(errno));
+    }
+    return {};
+  }
+  return yaml_file;
 }
 
 // the function for the checking of the yaml file in passed in directory or 
parent directory
@@ -86,8 +89,10 @@ get_parent_yaml_path(const std::string &path)
     if (whole_path.empty()) {
       return {};
     }
-    std::string yaml_file = get_yaml_path(whole_path);
-    if (!yaml_file.empty()) {
+    std::ifstream check_file;
+    std::string yaml_file = Layout::relative_to(whole_path, 
"runroot_path.yml");
+    check_file.open(yaml_file);
+    if (check_file.good()) {
       return yaml_file;
     }
     whole_path = whole_path.substr(0, whole_path.find_last_of("/"));
@@ -120,34 +125,26 @@ runroot_handler(const char **argv, bool json)
   if (!arg.empty() && arg != prefix) {
     // 1. pass in path
     prefix += "=";
-    path = get_yaml_path(arg.substr(prefix.size(), arg.size() - 1));
+    path = get_yaml_path(arg.substr(prefix.size(), arg.size() - 1), json);
     if (!path.empty()) {
       if (!json) {
         ink_notice("using command line path as RUNROOT");
       }
       runroot_file = path;
       return;
-    } else {
-      if (!json) {
-        ink_warning("bad RUNROOT passed in");
-      }
     }
   }
 
   // 2. check Environment variable
   char *env_val = getenv("TS_RUNROOT");
   if (env_val) {
-    path = get_yaml_path(env_val);
+    path = get_yaml_path(env_val, json);
     if (!path.empty()) {
       runroot_file = path;
       if (!json) {
         ink_notice("using the environment variable TS_RUNROOT");
       }
       return;
-    } else {
-      if (!json) {
-        ink_warning("bad Environment var: $TS_RUNROOT");
-      }
     }
   }
 
@@ -248,8 +245,8 @@ check_runroot()
   return runroot_map(runroot_file);
 }
 
-bool
-use_runroot()
+std::string_view
+get_runroot()
 {
-  return !runroot_file.empty();
+  return runroot_file;
 }
diff --git a/lib/ts/runroot.h b/lib/ts/runroot.h
index fcb44e4..2d3459e 100644
--- a/lib/ts/runroot.h
+++ b/lib/ts/runroot.h
@@ -58,5 +58,5 @@ RunrootMapType runroot_map(const std::string &prefix);
 // help check runroot for layout
 RunrootMapType check_runroot();
 
-// helper method for records config to check using runroot or not
-bool use_runroot();
+// To get the runroot value
+std::string_view get_runroot();
diff --git a/mgmt/LocalManager.cc b/mgmt/LocalManager.cc
index b31d00f..8212a73 100644
--- a/mgmt/LocalManager.cc
+++ b/mgmt/LocalManager.cc
@@ -27,6 +27,7 @@
 #include "ts/ink_error.h"
 #include "MgmtUtils.h"
 #include "ts/I_Layout.h"
+#include "ts/runroot.h"
 #include "LocalManager.h"
 #include "MgmtSocket.h"
 #include "ts/ink_cap.h"
@@ -43,6 +44,7 @@
 
 using namespace std::literals;
 static const std::string_view MGMT_OPT{"-M"};
+static const std::string_view RUNROOT_OPT{"--run-root="};
 
 void
 LocalManager::mgmtCleanup()
@@ -899,6 +901,14 @@ LocalManager::startProxy(const char *onetime_options)
       w.write(' ');
     }
 
+    // pass the runroot option to traffic_server
+    std::string_view runroot_arg = get_runroot();
+    if (!runroot_arg.empty()) {
+      w.write(RUNROOT_OPT);
+      w.write(runroot_arg);
+      w.write(' ');
+    }
+
     // Pass down port/fd information to traffic_server if there are any open 
ports.
     if (std::any_of(m_proxy_ports.begin(), m_proxy_ports.end(), 
[](HttpProxyPort &p) { return ts::NO_FD != p.m_fd; })) {
       char portbuf[128];
diff --git a/src/traffic_layout/engine.cc b/src/traffic_layout/engine.cc
index 36c21e9..086ce9e 100644
--- a/src/traffic_layout/engine.cc
+++ b/src/traffic_layout/engine.cc
@@ -52,11 +52,13 @@ std::string
 check_path(const std::string &path)
 {
   std::ifstream check_file;
-  check_file.open(Layout::relative_to(path, "runroot_path.yml"));
-  if (check_file.good()) {
-    return path;
+  std::string yaml_file = Layout::relative_to(path, "runroot_path.yml");
+  check_file.open(yaml_file);
+  if (!check_file.good()) {
+    ink_warning("Unable to access runroot: '%s' - %s", yaml_file.c_str(), 
strerror(errno));
+    return {};
   }
-  return {};
+  return path;
 }
 
 // the function for the checking of the yaml file in passed in directory or 
parent directory
@@ -73,7 +75,9 @@ check_parent_path(const std::string &path)
     if (yaml_path.empty()) {
       return {};
     }
-    if (!check_path(yaml_path).empty()) {
+    std::ifstream check_file;
+    check_file.open(Layout::relative_to(yaml_path, "runroot_path.yml"));
+    if (check_file.good()) {
       return yaml_path;
     }
     yaml_path = yaml_path.substr(0, yaml_path.find_last_of("/"));
diff --git a/src/traffic_manager/traffic_manager.cc 
b/src/traffic_manager/traffic_manager.cc
index 2fae482c..86fe248 100644
--- a/src/traffic_manager/traffic_manager.cc
+++ b/src/traffic_manager/traffic_manager.cc
@@ -663,6 +663,9 @@ main(int argc, const char **argv)
   std::string apisock(Layout::relative_to(rundir, MGMTAPI_MGMT_SOCKET_NAME));
   std::string eventsock(Layout::relative_to(rundir, 
MGMTAPI_EVENT_SOCKET_NAME));
 
+  Debug("lm", "using main socket file '%s'", apisock.c_str());
+  Debug("lm", "using event socket file '%s'", eventsock.c_str());
+
   mode_t oldmask = umask(0);
   mode_t newmode = api_socket_is_restricted() ? 00700 : 00777;
 
diff --git a/tests/gold_tests/runroot/runroot_error.test.py 
b/tests/gold_tests/runroot/runroot_error.test.py
index e32df98..ce8dcf7 100644
--- a/tests/gold_tests/runroot/runroot_error.test.py
+++ b/tests/gold_tests/runroot/runroot_error.test.py
@@ -25,11 +25,8 @@ Test for expected error and failure of runroot from 
traffic_layout.
 '''
 Test.ContinueOnFail = True
 
-p = Test.MakeATSProcess("ts")
-ts_root = p.Env['TS_ROOT']
-
 # create runroot
-path = os.path.join(ts_root, "runroot")
+path = os.path.join(Test.RunDirectory, "runroot")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path
 f = tr.Disk.File(os.path.join(path, "runroot_path.yml"))
@@ -59,7 +56,7 @@ f = tr.Disk.File(os.path.join(path_inside, 
"runroot_path.yml"))
 f.Exists = False
 
 # remove invalid runroot
-path_invalid = os.path.join(ts_root, "tmp")
+path_invalid = os.path.join(Test.RunDirectory, "tmp")
 tr = Test.AddTestRun("remove invalid runroot")
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout remove --path " + 
path_invalid
 tr.Processes.Default.Streams.All = Testers.ContainsExpression("Unable to 
read", "remove incorrect usage")
diff --git a/tests/gold_tests/runroot/runroot_init.test.py 
b/tests/gold_tests/runroot/runroot_init.test.py
index 7d5e105..8708716 100644
--- a/tests/gold_tests/runroot/runroot_init.test.py
+++ b/tests/gold_tests/runroot/runroot_init.test.py
@@ -25,11 +25,8 @@ Test for init of runroot from traffic_layout.
 '''
 Test.ContinueOnFail = True
 
-p = Test.MakeATSProcess("ts")
-ts_root = p.Env['TS_ROOT']
-
 # init from pass in path
-path1 = os.path.join(ts_root, "runroot1")
+path1 = os.path.join(Test.RunDirectory, "runroot1")
 tr = Test.AddTestRun("Test traffic_layout init #1")
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path1
 tr.Processes.Default.ReturnCode = 0
@@ -37,15 +34,15 @@ f = tr.Disk.File(os.path.join(path1, "runroot_path.yml"))
 f.Exists = True
 
 # init to relative directory
-path2 = os.path.join(ts_root, "runroot2")
+path2 = os.path.join(Test.RunDirectory, "runroot2")
 tr = Test.AddTestRun("Test traffic_layout init #2")
-tr.Processes.Default.Command = "cd " + ts_root + ";$ATS_BIN/traffic_layout 
init --path runroot2"
+tr.Processes.Default.Command = "cd " + Test.RunDirectory + 
";$ATS_BIN/traffic_layout init --path runroot2"
 tr.Processes.Default.ReturnCode = 0
 f = tr.Disk.File(os.path.join(path2, "runroot_path.yml"))
 f.Exists = True
 
 # init to cwd
-path3 = os.path.join(ts_root, "runroot3")
+path3 = os.path.join(Test.RunDirectory, "runroot3")
 tr = Test.AddTestRun("Test traffic_layout init #3")
 tr.Processes.Default.Command = "mkdir " + path3 + ";cd " + path3 + 
";$ATS_BIN/traffic_layout init"
 tr.Processes.Default.ReturnCode = 0
@@ -53,7 +50,7 @@ f = tr.Disk.File(os.path.join(path3, "runroot_path.yml"))
 f.Exists = True
 
 # --force init to an non-empty directory
-path4 = os.path.join(ts_root, "runroot4")
+path4 = os.path.join(Test.RunDirectory, "runroot4")
 tr = Test.AddTestRun("Test traffic_layout init #4")
 randomfile = os.path.join(path4, "foo")
 tr.Processes.Default.Command = "mkdir " + path4 + ";touch " + randomfile + 
";$ATS_BIN/traffic_layout init --force --path " + path4
@@ -63,7 +60,7 @@ f.Exists = True
 tr.Processes.Default.Streams.All = Testers.ContainsExpression("Forcing 
creating runroot", "force message")
 
 # create runroot with junk to guarantee only traffic server related files are 
copied
-path5 = os.path.join(ts_root, "runroot5")
+path5 = os.path.join(Test.RunDirectory, "runroot5")
 junk1 = os.path.join(path1, "bin/junk1")
 junk2 = os.path.join(path1, "lib/junk2")
 junk3 = os.path.join(path1, "var/junk3")
diff --git a/tests/gold_tests/runroot/runroot_manager.test.py 
b/tests/gold_tests/runroot/runroot_manager.test.py
new file mode 100644
index 0000000..8ad3515
--- /dev/null
+++ b/tests/gold_tests/runroot/runroot_manager.test.py
@@ -0,0 +1,52 @@
+'''
+'''
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import os
+import sys
+import time
+
+Test.Summary = '''
+Test for using of runroot of traffic_manager.
+'''
+Test.ContinueOnFail = False
+
+# create runroot for testing
+path = os.path.join(Test.RunDirectory, "runroot")
+rr_file = os.path.join(Test.RunDirectory, "rr_tmp")
+
+tr = Test.AddTestRun("create runroot and deal with it")
+tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path + 
" --absolute; " + \
+    "mkdir " + rr_file + "; mv " + \
+    os.path.join(path, "runroot_path.yml") + " " + \
+    os.path.join(rr_file, "runroot_path.yml")
+f = tr.Disk.File(os.path.join(rr_file, "runroot_path.yml"))
+f.Exists = True
+
+
+def StopProcess(event, time):
+    if event.TotalRunTime > time:
+        event.object.Stop()
+    return 0, "stop manager process", "manager will be killed"
+
+
+tr = Test.AddTestRun("manager runroot test")
+p = tr.Processes.Default
+p.Command = "$ATS_BIN/traffic_manager --run-root=" + rr_file
+p.RunningEvent.Connect(Testers.Lambda(lambda ev: StopProcess(ev, 10)))
+p.Streams.All = Testers.ContainsExpression("traffic_server: using root 
directory '" +
+                                           path + "'", "check if the right 
runroot is passed down")
diff --git a/tests/gold_tests/runroot/runroot_remove.test.py 
b/tests/gold_tests/runroot/runroot_remove.test.py
index 9ccd231..314c56a 100644
--- a/tests/gold_tests/runroot/runroot_remove.test.py
+++ b/tests/gold_tests/runroot/runroot_remove.test.py
@@ -25,24 +25,20 @@ Test for remove of runroot from traffic_layout.
 '''
 Test.ContinueOnFail = True
 
-p = Test.MakeATSProcess("ts")
-ts_root = p.Env['TS_ROOT']
-
-
 # create three runroot for removing testing
-path1 = os.path.join(ts_root, "runroot1")
+path1 = os.path.join(Test.RunDirectory, "runroot1")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path1
 f = tr.Disk.File(os.path.join(path1, "runroot_path.yml"))
 f.Exists = True
 
-path2 = os.path.join(ts_root, "runroot2")
+path2 = os.path.join(Test.RunDirectory, "runroot2")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path2
 f = tr.Disk.File(os.path.join(path2, "runroot_path.yml"))
 f.Exists = True
 
-path3 = os.path.join(ts_root, "runroot3")
+path3 = os.path.join(Test.RunDirectory, "runroot3")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path3
 f = tr.Disk.File(os.path.join(path3, "runroot_path.yml"))
@@ -59,7 +55,7 @@ d.Exists = False
 
 # remove of relative path
 tr = Test.AddTestRun("Test traffic_layout remove #2")
-tr.Processes.Default.Command = "cd " + ts_root + ";$ATS_BIN/traffic_layout 
remove --path runroot2"
+tr.Processes.Default.Command = "cd " + Test.RunDirectory + 
";$ATS_BIN/traffic_layout remove --path runroot2"
 tr.Processes.Default.ReturnCode = 0
 f = tr.Disk.File(os.path.join(path2, "runroot_path.yml"))
 f.Exists = False
diff --git a/tests/gold_tests/runroot/runroot_use.test.py 
b/tests/gold_tests/runroot/runroot_use.test.py
index 6832ecd..500d37f 100644
--- a/tests/gold_tests/runroot/runroot_use.test.py
+++ b/tests/gold_tests/runroot/runroot_use.test.py
@@ -25,17 +25,14 @@ Test for using of runroot from traffic_layout.
 '''
 Test.ContinueOnFail = True
 
-p = Test.MakeATSProcess("ts")
-ts_root = p.Env['TS_ROOT']
-
 # create two runroot for testing
-path = os.path.join(ts_root, "runroot")
+path = os.path.join(Test.RunDirectory, "runroot")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path
 f = tr.Disk.File(os.path.join(path, "runroot_path.yml"))
 f.Exists = True
 
-path2 = os.path.join(ts_root, "runroot2")
+path2 = os.path.join(Test.RunDirectory, "runroot2")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path2
 f = tr.Disk.File(os.path.join(path2, "runroot_path.yml"))
diff --git a/tests/gold_tests/runroot/runroot_verify.test.py 
b/tests/gold_tests/runroot/runroot_verify.test.py
index 35665b5..fc54dac 100644
--- a/tests/gold_tests/runroot/runroot_verify.test.py
+++ b/tests/gold_tests/runroot/runroot_verify.test.py
@@ -25,11 +25,8 @@ Test for verify of runroot from traffic_layout.
 '''
 Test.ContinueOnFail = True
 
-p = Test.MakeATSProcess("ts")
-ts_root = p.Env['TS_ROOT']
-
 # create runroot
-path = os.path.join(ts_root, "runroot")
+path = os.path.join(Test.RunDirectory, "runroot")
 tr = Test.AddTestRun()
 tr.Processes.Default.Command = "$ATS_BIN/traffic_layout init --path " + path
 f = tr.Disk.File(os.path.join(path, "runroot_path.yml"))

Reply via email to