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

mitchell852 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 6cf10c9  Add TM monitoring.json validity check for safety (#3526)
6cf10c9 is described below

commit 6cf10c9f15c23a8160897f67c817d37b3090151a
Author: Robert Butts <[email protected]>
AuthorDate: Tue Apr 30 09:36:52 2019 -0600

    Add TM monitoring.json validity check for safety (#3526)
    
    * Add TM monitoring.json validity check for safety
    
    Fixes #3525
    
    * Add TM towrap.MonitorConfigValid unit test
    
    * Fix TM monitoring valid check to omit DSes
    
    Because monitoring.json DSes are currently empty, due to a TO bug.
    
    See https://github.com/apache/trafficcontrol/issues/3528
---
 traffic_monitor/towrap/towrap.go      | 45 +++++++++++++++++++++++++++++-
 traffic_monitor/towrap/towrap_test.go | 52 +++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletion(-)

diff --git a/traffic_monitor/towrap/towrap.go b/traffic_monitor/towrap/towrap.go
index d81ba69..8b3b82f 100644
--- a/traffic_monitor/towrap/towrap.go
+++ b/traffic_monitor/towrap/towrap.go
@@ -244,6 +244,43 @@ func (s *TrafficOpsSessionThreadsafe) CRConfigValid(crc 
*tc.CRConfig, cdn string
        return nil
 }
 
+func MonitorConfigValid(cfg *tc.TrafficMonitorConfigMap) error {
+       if cfg == nil {
+               return errors.New("MonitorConfig is nil")
+       }
+       if len(cfg.TrafficServer) == 0 {
+               return errors.New("MonitorConfig.TrafficServer empty (is the 
monitoring.json an empty object?)")
+       }
+       if len(cfg.CacheGroup) == 0 {
+               return errors.New("MonitorConfig.CacheGroup empty")
+       }
+       if len(cfg.TrafficMonitor) == 0 {
+               return errors.New("MonitorConfig.TrafficMonitor empty")
+       }
+       // TODO uncomment this, when TO is fixed to include DeliveryServices.
+       // See https://github.com/apache/trafficcontrol/issues/3528
+       // if len(cfg.DeliveryService) == 0 {
+       //      return errors.New("MonitorConfig.DeliveryService empty")
+       // }
+       if len(cfg.Profile) == 0 {
+               return errors.New("MonitorConfig.Profile empty")
+       }
+
+       if intervalI, ok := cfg.Config["peers.polling.interval"]; !ok {
+               return 
errors.New(`MonitorConfig.Config["peers.polling.interval"] missing, 
peers.polling.interval parameter required`)
+       } else if _, ok := intervalI.(float64); !ok {
+               return 
fmt.Errorf(`MonitorConfig.Config["peers.polling.interval"] '%v' not a number, 
parameter peers.polling.interval must be a number`, intervalI)
+       }
+
+       if intervalI, ok := cfg.Config["health.polling.interval"]; !ok {
+               return 
errors.New(`MonitorConfig.Config["health.polling.interval"] missing, 
health.polling.interval parameter required`)
+       } else if _, ok := intervalI.(float64); !ok {
+               return 
fmt.Errorf(`MonitorConfig.Config["health.polling.interval"] '%v' not a number, 
parameter health.polling.interval must be a number`, intervalI)
+       }
+
+       return nil
+}
+
 // CRConfigRaw returns the CRConfig from the Traffic Ops. This is safe for 
multiple goroutines.
 func (s TrafficOpsSessionThreadsafe) CRConfigRaw(cdn string) ([]byte, error) {
 
@@ -318,10 +355,15 @@ func (s TrafficOpsSessionThreadsafe) 
trafficMonitorConfigMapRaw(cdn string) (*tc
        }
 
        configMap, _, err := ss.GetTrafficMonitorConfigMap(cdn)
+
+       if err == nil {
+               err = MonitorConfigValid(configMap)
+       }
+
        if err != nil {
                // Default error case, no backup file exists
                if !s.BackupFileExists() {
-                       return configMap, err
+                       return nil, err
                }
 
                b, err := ioutil.ReadFile(s.TMConfigBackupFile)
@@ -342,6 +384,7 @@ func (s TrafficOpsSessionThreadsafe) 
trafficMonitorConfigMapRaw(cdn string) (*tc
        if err == nil {
                ioutil.WriteFile(s.TMConfigBackupFile, data, 0644)
        }
+
        return configMap, err
 }
 
diff --git a/traffic_monitor/towrap/towrap_test.go 
b/traffic_monitor/towrap/towrap_test.go
new file mode 100644
index 0000000..357475c
--- /dev/null
+++ b/traffic_monitor/towrap/towrap_test.go
@@ -0,0 +1,52 @@
+package towrap
+
+/*
+ * 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 (
+       "testing"
+
+       "github.com/apache/trafficcontrol/lib/go-tc"
+)
+
+func TestMonitorConfigValid(t *testing.T) {
+       mc := (*tc.TrafficMonitorConfigMap)(nil)
+       if MonitorConfigValid(mc) == nil {
+               t.Errorf("MonitorCopnfigValid(nil) expected: error, actual: 
nil")
+       }
+       mc = &tc.TrafficMonitorConfigMap{}
+       if MonitorConfigValid(mc) == nil {
+               t.Errorf("MonitorConfigValid({}) expected: error, actual: nil")
+       }
+
+       validMC := &tc.TrafficMonitorConfigMap{
+               TrafficServer:   map[string]tc.TrafficServer{"a": {}},
+               CacheGroup:      map[string]tc.TMCacheGroup{"a": {}},
+               TrafficMonitor:  map[string]tc.TrafficMonitor{"a": {}},
+               DeliveryService: map[string]tc.TMDeliveryService{"a": {}},
+               Profile:         map[string]tc.TMProfile{"a": {}},
+               Config: map[string]interface{}{
+                       "peers.polling.interval":  42.0,
+                       "health.polling.interval": 24.0,
+               },
+       }
+       if err := MonitorConfigValid(validMC); err != nil {
+               t.Errorf("MonitorConfigValid(%++v) expected: nil, actual: %+v", 
validMC, err)
+       }
+}

Reply via email to