Repository: trafficserver Updated Branches: refs/heads/master 60bcf3e26 -> dc0561c4d
TS-4117 Adds a new tool to compare configs/metrics between different ATS versions This closes #432 Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/dc0561c4 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/dc0561c4 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/dc0561c4 Branch: refs/heads/master Commit: dc0561c4d5805ab7d8e8559c8049de0d9be24c14 Parents: 60bcf3e Author: Meera Mosale Nataraja <[email protected]> Authored: Wed Jan 20 12:02:23 2016 -0800 Committer: Leif Hedstrom <[email protected]> Committed: Wed Feb 3 13:20:33 2016 -0700 ---------------------------------------------------------------------- tools/compare_records.pl | 183 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/dc0561c4/tools/compare_records.pl ---------------------------------------------------------------------- diff --git a/tools/compare_records.pl b/tools/compare_records.pl new file mode 100755 index 0000000..cf00463 --- /dev/null +++ b/tools/compare_records.pl @@ -0,0 +1,183 @@ +#!/usr/bin/perl + +# +## 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. + +# This script will compare two files containing record configs and metrics. +# It provides a list of common configs/metrics and their default value changes. +# It also lists configs/metrics difference between the files. + +# By default, it compares only configs. To compare metrics, you can pass -m command +# line argument. The files should be generated with e.g. +# +# $ traffic_ctl config match . +# +# You can compare configs between the files: +# $ compare_records.pl -f <filename1> -f <filenam2> +# +# You can compare metrics between the files use -m command line argument: +# $ compare_records.pl -m -f <filename1> -f <filenam2> +# +# @ File compare_records.pl +# +use strict; +use warnings; +use Getopt::Long; + +my($file1, $file2, $in_files, $help); +my %file1_settings; +my %file2_settings; +my $diff_metrics; + +usage() if (@ARGV < 1 or + !GetOptions( + 'f=s@' => \$in_files, + 'm' => \$diff_metrics, + 'help|?' => \$help) or + defined $help); + +# Input file is mandatory +die "\nTwo input files must be specified to compare\n" + unless defined $in_files; + +# Print the usage +sub usage +{ + print "Unknown option: @_\n" if (@_); + print "Provide 2 files to compare configs or metrics.\n"; + print "By default this tool will diff only configs,\n"; + print "to get diff of metrics pass -m flag\n\n"; + print "Usage: compare_records.pl -m -f <filename1> -f <filename2>\n"; + print " -m to diff the metrics\n"; + print " -h for help\n\n"; + print "where the files are generated with e.g.\n\n"; + print " \$ traffic_ctl config match .\n"; + exit; +} + +my @file_list = @$in_files; +die "\nProvide only two files to compare\n" if (scalar(@file_list) != 2); +my $in_file1 = $file_list[0]; +my $in_file2 = $file_list[1]; + +# Open input files +if (defined $in_file1) { + open $file1, $in_file1 or die "Could not open $in_file1: $!"; +} +if (defined $in_file2) { + open $file2, $in_file2 or die "Could not open $in_file2: $!"; +} + +# Read input files +while (my $setting = <$file1>) { + chomp $setting; + my($record, $value) = split(/:/, $setting); + if (defined $diff_metrics) { + # Obtain only metrics, excluding configs + if ($record !~ /proxy.config/) { + $file1_settings{$record} = $value; + } + } else { + # Obtain only configs + if ($record =~ /proxy.config/) { + $file1_settings{$record} = $value; + } + } +} +close $file1; + +while (my $setting = <$file2>) { + chomp $setting; + my($record, $value) = split(/:/, $setting); + if (defined $diff_metrics) { + # Obtain only metrics, excluding configs + if ($record !~ /proxy.config/) { + $file2_settings{$record} = $value; + } + } else { + # Obtain only configs + if ($record =~ /proxy.config/) { + $file2_settings{$record} = $value; + } + } +} +close $file2; + +# Subroutine to compare configs/metrics and obtain common and difference between them +sub compare_configs_or_metrics +{ + my($records1, $records2, $file) = @_; + my %common_settings; + my %diff_settings; + my %settings1 = %$records1; + my %settings2 = %$records2; + + foreach my $record(sort keys %settings1) { + if ($settings2{$record}) { + $common_settings{$record} = $settings1{$record}; + } else { + $diff_settings{$record} = $settings1{$record}; + } + } + + print "####################################################################################\n"; + print "Configs/metrics found only in $file\n"; + print "####################################################################################\n"; + foreach my $key(sort keys %diff_settings) + { + print "$key\n"; + } + return (\%common_settings); +} + +# Subroutine to obtain changes in default values among common configs/metrics +sub compare_default_values +{ + my($records1, $records2) = @_; + my %settings1 = %$records1; + my %settings2 = %$records2; + + foreach my $record(sort keys %settings1) { + if (defined $settings1{$record} && $settings2{$record}) { + if ($settings1{$record} ne $settings2{$record}) { + # Values doesn't match + print "$record default value changed from $settings1{$record} -> $settings2{$record}\n"; + } + } + } +} + +# Obtain common configs/metrics between two files +my $common2 = compare_configs_or_metrics(\%file2_settings, \%file1_settings, $in_file2); +my %common2_settings = %$common2; + +my $common1 = compare_configs_or_metrics(\%file1_settings, \%file2_settings, $in_file1); +my %common1_settings = %$common1; + +print "####################################################################################\n"; +print "Common configs/metrics between $in_file1 and $in_file2\n"; +print "####################################################################################\n"; +foreach my $key(sort keys %common2_settings) +{ + print "$key\n"; +} + +# Compare common configs/metrics and obtain changes in default values +print "####################################################################################\n"; +print "Default value changes in common configs/metrics between $in_file1 and $in_file2\n"; +print "####################################################################################\n"; +compare_default_values(\%common1_settings, \%common2_settings);
