fuel-astute/coverage/rcov/lib-astute-logparser_rb.html

504 lines
22 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>lib/astute/logparser.rb</title>
<link href="./assets/0.2.3/screen.css" media="all" rel="stylesheet" type="text/css" />
<link href="./assets/0.2.3/print.css" media="print" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<script type="text/javascript" src="./assets/0.2.3/rcov.js"></script>
</head>
<body>
<h1>Astute C0 Coverage Information - Simploco - RCov</h1>
<h2>lib/astute/logparser.rb</h2>
<div class="report_table_wrapper">
<table class='report' id='report_table'>
<thead>
<tr>
<th class="left_align">Name</th>
<th class="right_align">Total Lines</th>
<th class="right_align">Lines of Code</th>
<th class="left_align">Total Coverage</th>
<th class="left_align">Code Coverage</th>
</tr>
</thead>
<tbody>
<tr>
<td class="left_align"><a href="lib-astute-logparser_rb.html">lib/astute/logparser.rb</a></td>
<td class='right_align'><tt>148</tt></td>
<td class='right_align'><tt>78</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>91.22%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:91px"></div>
<div class="uncovered" style="width:9px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>83.33%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:83px"></div>
<div class="uncovered" style="width:17px"></div>
</div></td>
</tr>
</tbody>
</table>
</div>
<h3>Key</h3>
<div class="key"><pre><span class='marked'>Code reported as executed by Ruby looks like this...</span><span class='marked1'>and this: this line is also marked as covered.</span><span class='inferred'>Lines considered as run by rcov, but not reported by Ruby, look like this,</span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics).</span><span class='uncovered'>Finally, here's a line marked as not executed.</span></pre></div>
<h3>Coverage Details</h3>
<table class="details">
<tbody>
<tr class="inferred">
<td><pre><a name="line2">2</a> # Copyright 2013 Mirantis, Inc.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line3">3</a> #</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line4">4</a> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line5">5</a> # not use this file except in compliance with the License. You may obtain</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line6">6</a> # a copy of the License at</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line7">7</a> #</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line8">8</a> # http://www.apache.org/licenses/LICENSE-2.0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line9">9</a> #</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line10">10</a> # Unless required by applicable law or agreed to in writing, software</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line11">11</a> # distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line12">12</a> # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line13">13</a> # License for the specific language governing permissions and limitations</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line14">14</a> # under the License.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line15">15</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line16">16</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line17">17</a> # -*- coding: utf-8 -*-</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> module LogParser</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> LOG_PORTION = 10000</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line21">21</a> # Default values. Can be overrided by pattern_spec.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> # E.g. pattern_spec = {'separator' =&gt; 'new_separator', ...}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> PATH_PREFIX = '/var/log/remote/'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> SEPARATOR = &quot;SEPARATOR\n&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> class NoParsing</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> def initialize(*args)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line29">29</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> def method_missing(*args)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> # We just eat the call if we don't want to deal with logs</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> def progress_calculate(*args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> []</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> class ParseNodeLogs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> attr_reader :pattern_spec</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> def initialize(pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> @nodes_states = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> @pattern_spec = pattern_spec</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> @pattern_spec['path_prefix'] ||= PATH_PREFIX.to_s</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> @pattern_spec['separator'] ||= SEPARATOR.to_s</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line48">48</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> def progress_calculate(uids_to_calc, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> nodes_progress = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> uids_to_calc.each do |uid|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> node = nodes.select {|n| n['uid'] == uid}[0] # NOTE: use nodes hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> node_pattern_spec = @nodes_states[uid]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> unless node_pattern_spec</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line55">55</a> node_pattern_spec = Marshal.load(Marshal.dump(@pattern_spec))</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line56">56</a> @nodes_states[uid] = node_pattern_spec</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> path = &quot;#{@pattern_spec['path_prefix']}#{node['fqdn']}/#{@pattern_spec['filename']}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line59">59</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> progress = (get_log_progress(path, node_pattern_spec)*100).to_i # Return percent of progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> rescue Exception =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line63">63</a> Astute.logger.warn &quot;Some error occurred when calculate progress for node '#{uid}': #{e.message}, trace: #{e.backtrace.inspect}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line64">64</a> progress = 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> nodes_progress &lt;&lt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> 'uid' =&gt; uid,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> 'progress' =&gt; progress</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> nodes_progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> def prepare(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> @nodes_states = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> path = &quot;#{@pattern_spec['path_prefix']}#{node['ip']}/#{@pattern_spec['filename']}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> File.open(path, 'a') {|fo| fo.write @pattern_spec['separator'] } if File.writable?(path)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> def pattern_spec= (pattern_spec)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line84">84</a> initialise(pattern_spec) # NOTE: bug?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> def get_log_progress(path, node_pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> unless File.readable?(path)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line91">91</a> Astute.logger.debug &quot;Can't read file with logs: #{path}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line92">92</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> if node_pattern_spec.nil?</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line95">95</a> Astute.logger.warn &quot;Can't parse logs. Pattern_spec is empty.&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line96">96</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> progress = nil</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> File.open(path) do |fo|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> # Try to find well-known ends of log.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> endlog = find_endlog_patterns(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> return endlog if endlog</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> # Start reading from end of file.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line104">104</a> fo.pos = fo.stat.size</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line106">106</a> # Method 'calculate' should be defined at child classes.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> progress = calculate(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> node_pattern_spec['file_pos'] = fo.pos</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> unless progress</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line111">111</a> Astute.logger.warn(&quot;Wrong pattern #{node_pattern_spec.inspect} defined for calculating progress via logs.&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line112">112</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line115">115</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line116">116</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> def find_endlog_patterns(fo, pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> # Pattern example:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line119">119</a> # pattern_spec = {...,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> # 'endlog_patterns' =&gt; [{'pattern' =&gt; /Finished catalog run in [0-9]+\.[0-9]* seconds\n/, 'progress' =&gt; 1.0}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line121">121</a> # }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line122">122</a> endlog_patterns = pattern_spec['endlog_patterns']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line123">123</a> return nil unless endlog_patterns</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line124">124</a> fo.pos = fo.stat.size</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> chunk = get_chunk(fo, 100)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> return nil unless chunk</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line127">127</a> endlog_patterns.each do |pattern|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line128">128</a> return pattern['progress'] if chunk.end_with?(pattern['pattern'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line129">129</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line130">130</a> nil</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line131">131</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line133">133</a> def get_chunk(fo, size=nil, pos=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> if pos</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line135">135</a> fo.pos = pos</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line136">136</a> return fo.read</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line138">138</a> size = LOG_PORTION unless size</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> return nil if fo.pos == 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line140">140</a> size = fo.pos if fo.pos &lt; size</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line141">141</a> next_pos = fo.pos - size</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> fo.pos = next_pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> block = fo.read(size)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line144">144</a> fo.pos = next_pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line145">145</a> block</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line148">148</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line149">149</a> end</pre></td>
</tr>
</tbody>
</table>
<p>Generated on 2013-07-19 12:05:31 +0400 with <a href="https://github.com/fguillen/simplecov-rcov">SimpleCov-RCov 0.2.3</a></p>
</body>
</html>