Removing unnecessary data

This commit is contained in:
Vladmir Sharhsov(warpc) 2013-08-20 16:28:12 +04:00
parent 357751197f
commit 21c0b0cb45
50 changed files with 3 additions and 22377 deletions

View File

@ -1,4 +0,0 @@
source "https://rubygems.org"
gemspec

View File

@ -1,44 +0,0 @@
PATH
remote: .
specs:
astute (0.0.1)
activesupport (= 3.0.10)
mcollective-client (~> 2.2.4)
rest-client (~> 1.6.7)
symboltable (= 1.0.2)
GEM
remote: https://rubygems.org/
specs:
activesupport (3.0.10)
diff-lcs (1.2.4)
json (1.8.0)
mcollective-client (2.2.4)
json
stomp
systemu
metaclass (0.0.1)
mime-types (1.23)
mocha (0.13.3)
metaclass (~> 0.0.1)
rest-client (1.6.7)
mime-types (>= 1.16)
rspec (2.13.0)
rspec-core (~> 2.13.0)
rspec-expectations (~> 2.13.0)
rspec-mocks (~> 2.13.0)
rspec-core (2.13.1)
rspec-expectations (2.13.0)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.13.1)
stomp (1.2.11)
symboltable (1.0.2)
systemu (2.5.2)
PLATFORMS
ruby
DEPENDENCIES
astute!
mocha (= 0.13.3)
rspec (= 2.13.0)

View File

@ -1,2 +0,0 @@
* CLI client should be provided for API (with all available operations supported)
* Component to be used for orchestration transport layer (MComponent for orchestration transport layer should be pluggable. In addition to default option (MCollective) user should be able to prepare custom plugin (to use Salt, SSH, python Fabric etc) and rComponent for orchestration transport layer should be pluggable. In addition to default option (MCollective) user should be able to prepare custom plugin (to use Salt, SSH, python Fabric etc) and rCollective by default):

View File

@ -11,7 +11,7 @@ Gem::Specification.new do |s|
s.email = ['mscherbakov@mirantis.com']
s.add_dependency 'activesupport', '3.0.10'
s.add_dependency 'mcollective-client', '~> 2.3.1'
s.add_dependency 'mcollective-client', '2.3.1'
s.add_dependency 'symboltable', '1.0.2'
s.add_dependency 'rest-client', '~> 1.6.7'
s.add_dependency 'kwalify', '~> 0.7.2'

View File

@ -1,207 +0,0 @@
##Network section of node configuration
node_01: &node_01
role: primary-controller
network_data:
- name: public
ip: 10.108.2.94
dev: eth0
netmask: 255.255.255.0
gateway: 10.108.2.1
- name:
- management
- storage
ip: 10.20.1.94
dev: eth1
- name: fixed
dev: eth2
public_br: br-ex
internal_br: br-mgmt
id: 01
default_gateway: 10.20.0.1
uid: 01
mac: 52:54:00:de:bc:77
name: controller-01
ip: 10.108.2.94
profile: centos-x86_64
fqdn: controller-01.domain.tld
power_type: ssh
power_user: root
power_pass: /root/.ssh/bootstrap.rsa
power_address: 10.108.2.94
netboot_enabled: '1'
name_servers: ! '"10.108.2.2"'
ks_meta:
ks_spaces: '"[
{\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:01.1-scsi-0:0:0:0\",
\"volumes\":
[
{\"mount\": \"/boot\", \"type\": \"partition\", \"size\": 200 },
{\"type\": \"mbr\"}, {\"size\": 7989, \"type\": \"pv\", \"vg\": \"os\"}
],
\"size\": 8190
},
{\"type\": \"vg\", \"id\": \"os\", \"volumes\":
[
{\"mount\": \"/\", \"type\": \"lv\", \"name\": \"root\", \"size\": 7166 },
{\"mount\":\"swap\", \"type\": \"lv\", \"name\": \"swap\", \"size\": 1024 }
]
}
]"'
mco_enable: 1
mco_vhost: mcollective
mco_pskey: unset
mco_user: mcollective
puppet_enable: 0
install_log_2_syslog: 1
mco_password: marionette
puppet_auto_setup: 1
puppet_master: fuel.domain.tld
mco_auto_setup: 1
auth_key: ! '""'
puppet_version: 2.7.19
mco_connector: rabbitmq
mco_host: 10.108.2.2
interfaces:
eth0:
ip_address: 10.108.2.94
netmask: 255.255.255.0
dns_name: controller-01.domain.tld
static: '1'
mac_address: 52:54:00:de:bc:77
interfaces_extra:
eth2:
onboot: 'no'
peerdns: 'no'
eth1:
onboot: 'no'
peerdns: 'no'
eth0:
onboot: 'yes'
peerdns: 'no'
meta:
memory:
total: 778694656
interfaces:
- mac: 64:D8:E1:F6:66:43
max_speed: 100
name: eth2
ip: 10.22.0.94
netmask: 255.255.255.0
current_speed: 100
- mac: 64:C8:E2:3B:FD:6E
max_speed: 100
name: eth1
ip: 10.21.0.94
netmask: 255.255.255.0
current_speed: 100
- name: eth0
ip: 10.20.0.94
netmask: 255.255.255.0
mac: 64:43:7B:CA:56:DD
max_speed: 100
current_speed: 100
disks:
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-2:0:0:0
name: sdc
size: 2411724800000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-1:0:0:0
name: sdb
size: 536870912000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0
name: sda
size: 17179869184
system:
serial: '0'
version: '1.2'
fqdn: bootstrap
family: Virtual Machine
manufacturer: VirtualBox
cpu:
real: 0
total: 1
spec:
- model: Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
frequency: 2397
error_type:
nodes:
- <<: *node_01
attributes:
use_cow_images: true
libvirt_type: qemu
dns_nameservers:
- 10.20.0.1
verbose: true|false
debug: true|false
auto_assign_floating_ip: true
start_guests_on_host_boot: true
create_networks: true
compute_scheduler_driver: nova.scheduler.multi.MultiScheduler
quantum: true
master_hostname: controller-01
nagios: false
proj_name: test
nagios_master: fuelweb.domain.tld
management_vip: 10.108.2.2
public_vip: 10.108.2.2
#Nova-network part, gets ignored if $quantum = `false`
novanetwork_parameters:
fixed_network_range: CIDR
vlan_start: <1-1024>
network_manager: String
network_size: <Integer>
#Quantum part, used only if quantum='true'
quantum_parameters:
tenant_network_type: gre
segment_range: ! '300:500'
metadata_proxy_shared_secret: quantum
mysql:
root_password: root
glance:
db_password: glance
user_password: glance
swift:
user_password: swift_pass
nova:
db_password: nova
user_password: nova
access:
password: admin
user: admin
tenant: admin
email: admin@example.org
keystone:
db_password: keystone
admin_token: nova
quantum_access:
user_password: quantum
db_password: quantum
rabbit:
password: nova
user: nova
cinder:
password: cinder
user: cinder
floating_network_range:
- 10.20.0.100
base_syslog:
syslog_port: '514'
syslog_server: 10.108.2.2
syslog:
syslog_port: '514'
syslog_transport: udp
syslog_server: ''
deployment_id: 1
deployment_mode: ha
deployment_source: cli
deployment_engine: nailyfact
engine:
url: http://localhost/cobbler_api
username: cobbler
password: cobbler

View File

@ -100,7 +100,7 @@ def console_provision(orchestrator, reporter, environment)
res = orchestrator.fast_provision(reporter, environment['engine'], environment['nodes'])
if res == Astute::SUCCESS
puts "restarting nodes..."
sleep 10
sleep 5
puts "start watching progress"
res = orchestrator.provision(reporter, environment['task_uuid'], environment['nodes'])
end

Binary file not shown.

View File

@ -1,5 +0,0 @@
{
"result": {
"covered_percent": 91.2
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +0,0 @@
/* Hide controls */
body {
color: #000000;
background-color: #ffffff;
}
/* Hide controls */
div.filters {
display: none;
}

View File

@ -1,42 +0,0 @@
function toggleCode( id ) {
if ( document.getElementById ) {
elem = document.getElementById( id );
} else if ( document.all ) {
elem = eval( "document.all." + id );
} else {
return false;
}
elemStyle = elem.style;
if ( elemStyle.display != "block" ) {
elemStyle.display = "block";
} else {
elemStyle.display = "none";
}
return true;
}
function restripe() {
i = 0;
$('table#report_table tbody tr').each(function(){
if (this.style.display != "none") {
i += 1;
classes = this.className.split(" ");
if ($.inArray("even",classes) != -1) {
classes.splice($.inArray("even",classes),1);
} else if ($.inArray("odd",classes) != -1) {
classes.splice($.inArray("odd",classes),1);
}
if (i % 2 === 0) {
this.className = classes.join(" ") + " odd";
} else {
this.className = classes.join(" ") + " even";
}
}
});
}
// Fix IE's lack of support for indexOf (!)
if (!Array.indexOf) { Array.prototype.indexOf = function(obj){ for(var i=0; i<this.length; i++){ if(this[i]==obj){return i;} } return -1; }}

View File

@ -1,270 +0,0 @@
/* @group General */
body {
font-family: Verdana, Helvetica, Arial, Sans-Serif;
font-size: 12px;
color: #4C4C4C;
background-color: #F4F2ED;
padding: 1em;
}
a:link {
color: #191919;
}
a:visited {
color: #191919;
}
pre, code {
color: #000000;
font-family: "Bitstream Vera Sans Mono","Monaco","Courier New",monospace;
font-size: 95%;
line-height: 1.3em;
margin-top: 0;
margin-bottom: 0;
padding: 0;
word-wrap: break-word;
}
h1, h2, h3, h4, h5, h6 {
margin: 0em 0em 1em 0em;
color: #666666;
}
h1 {
display: block;
font-size: 2em;
letter-spacing: -1px;
}
h2 {
margin-top: -1em;
}
fieldset {
display: inline;
border: 0px;
padding: 0px;
margin-right: 1em;
}
div.filters {
margin-bottom: 1em;
}
.hidden {
display: none;
}
/* @end */
/* @group Cross-References */
span.cross-ref-title {
font-size: 140%;
}
span.cross-ref a {
text-decoration: none;
}
span.cross-ref {
background-color:#f3f7fa;
border: 1px dashed #333;
margin: 1em;
padding: 0.5em;
overflow: hidden;
}
a.crossref-toggle {
text-decoration: none;
}
/* @end */
/* @group Report Table */
div.report_table_wrapper {
min-width: 900px;
}
table.report {
border-collapse: collapse;
border: 1px solid #666666;
width: 100%;
margin-bottom: 1em;
}
table.report tr {
line-height: 1.75em;
}
table.report th {
background: #666666;
color: #ffffff;
text-align: right;
text-transform: uppercase;
font-size: .8em;
font-weight: bold;
padding: 0em .5em;
border: 1px solid #666666;
}
table.report tfoot tr {
background: #dddddd;
font-weight: bold;
padding: .5em;
border: 1px solid #666666;
}
th.left_align, td.left_align {
text-align: left !important;
}
th.right_align, td.right_align {
text-align: right;
padding-right: 2em !important;
}
table.report th.header:hover {
cursor: pointer;
text-decoration: underline;
}
table.report th.headerSortUp:after{
content: "\25BC";
margin-left: 1em;
}
table.report th.headerSortDown:after {
content: "\25B2";
margin-left: 1em;
}
table.report tr.summary_row {
background: #cccccc;
border: 1px solid #cccccc;
}
table.report tr.summary_row td {
padding-left: .2em !important;
color: #333333;
font-weight: bold;
}
table.report td {
padding: .2em .5em .2em .5em;
}
table.report td a {
text-decoration: none;
}
table.report tbody tr:hover {
background: #cccccc !important;
}
table.report tr.summary_row td {
border-bottom: 1px solid #aaaaaa;
}
table.report tr {
background-color: #eeeeee;
}
table.report tr.odd {
background-color: #dddddd;
}
/* @end */
/* @group Percentage Graphs */
div.percent_graph_legend {
width: 5.5em;
float: left;
margin: .5em 1em .5em 0em;
height: 1em;
line-height: 1em;
}
div.percent_graph {
height: 1em;
border: #333333 1px solid;
empty-cells: show;
padding: 0px;
border-collapse: collapse;
width: 100px !important;
float: left;
margin: .5em 1em .5em 0em;
}
div.percent_graph div {
float: left;
height: 1em;
padding: 0px !important;
}
div.percent_graph div.covered {
background: #649632;
}
div.percent_graph div.uncovered {
background: #a92730;
}
div.percent_graph div.NA {
background: #eaeaea;
}
/* @end */
/* @group Details page */
table.details {
margin-top: 1em;
border-collapse: collapse;
width: 100%;
border: 1px solid #666666;
}
table.details tr {
line-height: 1.75em;
}
table.details td {
padding: .25em;
}
span.inferred, span.inferred1, span.marked, span.marked1, span.uncovered, span.uncovered1 {
display: block;
padding: .25em;
}
tr.inferred td, span.inferred {
background-color: #e0dedb;
}
tr.inferred1 td, span.inferred1 {
background-color: #e0dedb;
}
tr.marked td, span.marked, span.marked1 {
background-color: #bed2be;
}
tr.uncovered td, span.uncovered {
background-color: #ce8b8c;
}
tr.uncovered1 td, span.uncovered1 {
background-color: #ce8b8c;
}
div.key {
border: 1px solid #666666;
margin: 1em 0em;
}
/* @end */

View File

@ -1,552 +0,0 @@
<!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>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>Astute C0 Coverage Information - SimpleCov - RCov style</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" />
<script type="text/javascript" src="./assets/0.2.3/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="./assets/0.2.3/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="./assets/0.2.3/rcov.js"></script>
</head>
<body>
<h1>Astute C0 Coverage Information - SimpleCov - RCov style</h1>
<noscript><style type="text/css">.if_js { display:none; }</style></noscript>
<div class="filters if_js">
<fieldset>
<label>File Filter:</label>
<select id="file_filter" class="filter">
<option value="all_files">Show All</option>
<option value="astute">astute/</option><option value="deployment_engine">deployment_engine/</option><option value="lib">lib/</option><option value="logparser">logparser/</option><option value="spec">spec/</option><option value="unit">unit/</option>
</select>
</fieldset>
<fieldset>
<label>Code Coverage Threshold:</label>
<select id="coverage_filter" class="filter">
<option value="all_coverage">Show All</option>
<option value="10">&lt; 10% Coverage</option><option value="20">&lt; 20% Coverage</option><option value="30">&lt; 30% Coverage</option><option value="40">&lt; 40% Coverage</option><option value="50">&lt; 50% Coverage</option><option value="60">&lt; 60% Coverage</option><option value="70">&lt; 70% Coverage</option><option value="80">&lt; 80% Coverage</option><option value="90">&lt; 90% Coverage</option><option value="100">&lt; 100% Coverage</option>
<option value="110">= 100% Coverage</option>
</select>
</fieldset>
</div>
<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>
<tfoot>
<tr>
<td class="left_align">TOTAL</td>
<td class='right_align'><tt>4723</tt></td>
<td class='right_align'><tt>2022</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>96.23%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:96px"></div>
<div class="uncovered" style="width:4px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class='coverage_total'>91.20%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:91px"></div>
<div class="uncovered" style="width:9px"></div>
</div></td>
</tr>
</tfoot>
<tbody>
<tr class="all_files all_coverage 90 100 lib even">
<td class="left_align"><a href="lib-astute_rb.html">lib/astute.rb</a></td>
<td class='right_align'><tt>63</tt></td>
<td class='right_align'><tt>37</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>93.65%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:94px"></div>
<div class="uncovered" style="width:6px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>89.19%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:89px"></div>
<div class="uncovered" style="width:11px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute odd">
<td class="left_align"><a href="lib-astute-cobbler_rb.html">lib/astute/cobbler.rb</a></td>
<td class='right_align'><tt>300</tt></td>
<td class='right_align'><tt>129</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>88.37%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:88px"></div>
<div class="uncovered" style="width:12px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute even">
<td class="left_align"><a href="lib-astute-config_rb.html">lib/astute/config.rb</a></td>
<td class='right_align'><tt>66</tt></td>
<td class='right_align'><tt>34</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>93.94%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:94px"></div>
<div class="uncovered" style="width:6px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>88.24%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:88px"></div>
<div class="uncovered" style="width:12px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 lib astute odd">
<td class="left_align"><a href="lib-astute-context_rb.html">lib/astute/context.rb</a></td>
<td class='right_align'><tt>26</tt></td>
<td class='right_align'><tt>7</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 lib astute even">
<td class="left_align"><a href="lib-astute-deployment_engine_rb.html">lib/astute/deployment_engine.rb</a></td>
<td class='right_align'><tt>217</tt></td>
<td class='right_align'><tt>128</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>97.24%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:97px"></div>
<div class="uncovered" style="width:3px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.31%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 lib astute deployment_engine odd">
<td class="left_align"><a href="lib-astute-deployment_engine-nailyfact_rb.html">lib/astute/deployment_engine/nailyfact.rb</a></td>
<td class='right_align'><tt>91</tt></td>
<td class='right_align'><tt>38</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>97.80%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>94.74%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 lib astute deployment_engine even">
<td class="left_align"><a href="lib-astute-deployment_engine-simple_puppet_rb.html">lib/astute/deployment_engine/simple_puppet.rb</a></td>
<td class='right_align'><tt>26</tt></td>
<td class='right_align'><tt>7</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute odd">
<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>
<tr class="all_files all_coverage 70 80 90 100 lib astute logparser even">
<td class="left_align"><a href="lib-astute-logparser-deployment_rb.html">lib/astute/logparser/deployment.rb</a></td>
<td class='right_align'><tt>171</tt></td>
<td class='right_align'><tt>88</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>82.46%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:82px"></div>
<div class="uncovered" style="width:18px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>65.91%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:66px"></div>
<div class="uncovered" style="width:34px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute logparser odd">
<td class="left_align"><a href="lib-astute-logparser-parser_patterns_rb.html">lib/astute/logparser/parser_patterns.rb</a></td>
<td class='right_align'><tt>534</tt></td>
<td class='right_align'><tt>8</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>99.81%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>87.50%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:88px"></div>
<div class="uncovered" style="width:12px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 80 90 100 lib astute logparser even">
<td class="left_align"><a href="lib-astute-logparser-provision_rb.html">lib/astute/logparser/provision.rb</a></td>
<td class='right_align'><tt>254</tt></td>
<td class='right_align'><tt>122</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>86.61%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:87px"></div>
<div class="uncovered" style="width:13px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>72.13%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:72px"></div>
<div class="uncovered" style="width:28px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute odd">
<td class="left_align"><a href="lib-astute-mclient_rb.html">lib/astute/mclient.rb</a></td>
<td class='right_align'><tt>135</tt></td>
<td class='right_align'><tt>75</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>91.11%</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=''>84.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:84px"></div>
<div class="uncovered" style="width:16px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 60 70 80 90 100 lib astute even">
<td class="left_align"><a href="lib-astute-metadata_rb.html">lib/astute/metadata.rb</a></td>
<td class='right_align'><tt>30</tt></td>
<td class='right_align'><tt>9</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>86.67%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:87px"></div>
<div class="uncovered" style="width:13px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>55.56%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:56px"></div>
<div class="uncovered" style="width:44px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 lib astute odd">
<td class="left_align"><a href="lib-astute-network_rb.html">lib/astute/network.rb</a></td>
<td class='right_align'><tt>112</tt></td>
<td class='right_align'><tt>45</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 lib astute even">
<td class="left_align"><a href="lib-astute-node_rb.html">lib/astute/node.rb</a></td>
<td class='right_align'><tt>93</tt></td>
<td class='right_align'><tt>44</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 lib astute odd">
<td class="left_align"><a href="lib-astute-nodes_remover_rb.html">lib/astute/nodes_remover.rb</a></td>
<td class='right_align'><tt>105</tt></td>
<td class='right_align'><tt>53</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>98.10%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>96.23%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:96px"></div>
<div class="uncovered" style="width:4px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 90 100 lib astute even">
<td class="left_align"><a href="lib-astute-orchestrator_rb.html">lib/astute/orchestrator.rb</a></td>
<td class='right_align'><tt>256</tt></td>
<td class='right_align'><tt>141</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>90.23%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:90px"></div>
<div class="uncovered" style="width:10px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>82.27%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:82px"></div>
<div class="uncovered" style="width:18px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 lib astute odd">
<td class="left_align"><a href="lib-astute-puppetd_rb.html">lib/astute/puppetd.rb</a></td>
<td class='right_align'><tt>170</tt></td>
<td class='right_align'><tt>86</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.88%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:96px"></div>
<div class="uncovered" style="width:4px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>91.86%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:92px"></div>
<div class="uncovered" style="width:8px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 lib astute even">
<td class="left_align"><a href="lib-astute-reporter_rb.html">lib/astute/reporter.rb</a></td>
<td class='right_align'><tt>124</tt></td>
<td class='right_align'><tt>57</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>99.19%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:99px"></div>
<div class="uncovered" style="width:1px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>98.25%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 30 40 50 60 70 80 90 100 lib astute odd">
<td class="left_align"><a href="lib-astute-rpuppet_rb.html">lib/astute/rpuppet.rb</a></td>
<td class='right_align'><tt>42</tt></td>
<td class='right_align'><tt>17</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>71.43%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:71px"></div>
<div class="uncovered" style="width:29px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>29.41%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:29px"></div>
<div class="uncovered" style="width:71px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 lib astute even">
<td class="left_align"><a href="lib-astute-ruby_removed_functions_rb.html">lib/astute/ruby_removed_functions.rb</a></td>
<td class='right_align'><tt>23</tt></td>
<td class='right_align'><tt>6</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit odd">
<td class="left_align"><a href="spec-unit-logparser_spec_rb.html">spec/unit/logparser_spec.rb</a></td>
<td class='right_align'><tt>278</tt></td>
<td class='right_align'><tt>153</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit even">
<td class="left_align"><a href="spec-unit-mclient_spec_rb.html">spec/unit/mclient_spec.rb</a></td>
<td class='right_align'><tt>95</tt></td>
<td class='right_align'><tt>51</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit odd">
<td class="left_align"><a href="spec-unit-nailyfact_deploy_spec_rb.html">spec/unit/nailyfact_deploy_spec.rb</a></td>
<td class='right_align'><tt>286</tt></td>
<td class='right_align'><tt>70</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit even">
<td class="left_align"><a href="spec-unit-node_spec_rb.html">spec/unit/node_spec.rb</a></td>
<td class='right_align'><tt>95</tt></td>
<td class='right_align'><tt>52</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 100 spec unit odd">
<td class="left_align"><a href="spec-unit-orchestrator_spec_rb.html">spec/unit/orchestrator_spec.rb</a></td>
<td class='right_align'><tt>423</tt></td>
<td class='right_align'><tt>183</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>98.58%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:99px"></div>
<div class="uncovered" style="width:1px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>96.72%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:97px"></div>
<div class="uncovered" style="width:3px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit even">
<td class="left_align"><a href="spec-unit-puppetd_spec_rb.html">spec/unit/puppetd_spec.rb</a></td>
<td class='right_align'><tt>233</tt></td>
<td class='right_align'><tt>105</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit odd">
<td class="left_align"><a href="spec-unit-reporter_spec_rb.html">spec/unit/reporter_spec.rb</a></td>
<td class='right_align'><tt>205</tt></td>
<td class='right_align'><tt>126</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
<tr class="all_files all_coverage 110 spec unit even">
<td class="left_align"><a href="spec-unit-simplepuppet_deploy_spec_rb.html">spec/unit/simplepuppet_deploy_spec.rb</a></td>
<td class='right_align'><tt>122</tt></td>
<td class='right_align'><tt>73</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
</tr>
</tbody>
</table>
</div>
<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>
<script type="text/javascript">
$(document).ready(function(){$("#report_table").tablesorter({widgets: ['zebra'], textExtraction: 'complex'});});
$('.filter').change(function(){
ff = $('#file_filter').val();
cf = $('#coverage_filter').val();
$('table#report_table tbody tr').each(function(i){
if ((this.className.split(" ").indexOf(ff) > -1) && (this.className.split(" ").indexOf(cf) > -1)) {
this.style.display = "";
} else {
this.style.display = "none";
};
restripe();
})
})
</script>
</body>
</html>

View File

@ -1,959 +0,0 @@
<!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/cobbler.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/cobbler.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-cobbler_rb.html">lib/astute/cobbler.rb</a></td>
<td class='right_align'><tt>300</tt></td>
<td class='right_align'><tt>129</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>88.37%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:88px"></div>
<div class="uncovered" style="width:12px"></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="marked">
<td><pre><a name="line17">17</a> require 'xmlrpc/client'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Provision</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> class CobblerError &lt; RuntimeError; end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> class Cobbler</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> attr_reader :remote, :token</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> def initialize(o={})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> Astute.logger.debug(&quot;Cobbler options: #{o.inspect}&quot;)</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> if (match = /^http:\/\/([^:]+?):?(\d+)?(\/.+)/.match(o['url']))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> host = match[1]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> port = match[2] || '80'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> path = match[3]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> host = o['host'] || 'localhost'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> port = o['port'] || '80'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> path = o['path'] || '/cobbler_api'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> username = o['username'] || 'cobbler'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> password = o['password'] || 'cobbler'</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> Astute.logger.debug(&quot;Connecting to cobbler with: host: #{host} port: #{port} path: #{path}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> @remote = XMLRPC::Client.new(host, path, port)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> Astute.logger.debug(&quot;Trying to log in to cobbler with username: #{username}, password: #{password}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> @token = remote.call('login', username, password)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> def item_from_hash(what, name, data, opts = {})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> options = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> :item_preremove =&gt; true,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> }.merge!(opts)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> cobsh = Cobsh.new(data.merge({'what' =&gt; what, 'name' =&gt; name}))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> cobblerized = cobsh.cobblerized</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> Astute.logger.debug(&quot;Creating/editing item from hash: #{cobsh.inspect}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> remove_item(what, name) if options[:item_preremove]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> # get existent item id or create new one</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> item_id = get_item_id(what, name)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line59">59</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> # defining all item options</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> cobblerized.each do |opt, value|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> next if opt == 'interfaces'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> Astute.logger.debug(&quot;Setting #{what} #{name} opt: #{opt}=#{value}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> remote.call('modify_item', what, item_id, opt, value, token)</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> # defining system interfaces</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> if what == 'system' &amp;&amp; cobblerized.has_key?('interfaces')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> Astute.logger.debug(&quot;Defining system interfaces #{name} #{cobblerized['interfaces']}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> remote.call('modify_system', item_id, 'modify_interface',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> cobblerized['interfaces'], token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> # save item into cobbler database</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> Astute.logger.debug(&quot;Saving #{what} #{name}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> remote.call('save_item', what, item_id, token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> def remove_item(what, name, recursive=true)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> remote.call('remove_item', what, name, token, recursive) if item_exists(what, name)</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 remove_system(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line84">84</a> remove_item('system', name)</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> def item_exists(what, name)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> remote.call('has_item', what, name)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> def system_exists(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line92">92</a> item_exists('system', name)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> def get_item_id(what, name)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line96">96</a> if item_exists(what, name)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> item_id = remote.call('get_item_handle', what, name, token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> item_id = remote.call('new_item', what, token)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> remote.call('modify_item', what, item_id, 'name', name, token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line101">101</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> item_id</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> def sync</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> remote.call('sync', token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> def power(name, action)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line110">110</a> options = {&quot;systems&quot; =&gt; [name], &quot;power&quot; =&gt; action}</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line111">111</a> remote.call('background_power_system', options, token)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> def power_on(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line115">115</a> power(name, 'on')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line116">116</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line117">117</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> def power_off(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line119">119</a> power(name, 'off')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> end</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> def power_reboot(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line123">123</a> power(name, 'reboot')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> def event_status(event_id)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line127">127</a> remote.call('get_task_status', event_id)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line129">129</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line130">130</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line131">131</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line132">132</a> class Cobsh &lt; ::Hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line133">133</a> ALIASES = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> 'ks_meta' =&gt; ['ksmeta'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line135">135</a> 'mac_address' =&gt; ['mac'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line136">136</a> 'ip_address' =&gt; ['ip'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line139">139</a> # these fields can be get from the cobbler code</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> # you can just import cobbler.item_distro.FIELDS</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> # or cobbler.item_system.FIELDS</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> FIELDS = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line143">143</a> 'system' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> 'fields' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line145">145</a> 'name', 'owners', 'profile', 'image', 'status', 'kernel_options',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> 'kernel_options_post', 'ks_meta', 'enable_gpxe', 'proxy',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> 'netboot_enabled', 'kickstart', 'comment', 'server',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line148">148</a> 'virt_path', 'virt_type', 'virt_cpus', 'virt_file_size',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line149">149</a> 'virt_disk_driver', 'virt_ram', 'virt_auto_boot', 'power_type',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> 'power_address', 'power_user', 'power_pass', 'power_id',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line151">151</a> 'hostname', 'gateway', 'name_servers', 'name_servers_search',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> 'ipv6_default_device', 'ipv6_autoconfiguration', 'mgmt_classes',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line153">153</a> 'mgmt_parameters', 'boot_files', 'fetchable_files',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> 'template_files', 'redhat_management_key', 'redhat_management_server',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> 'repos_enabled', 'ldap_enabled', 'ldap_type', 'monit_enabled',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> ],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> 'interfaces_fields' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line158">158</a> 'mac_address', 'mtu', 'ip_address', 'interface_type',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line159">159</a> 'interface_master', 'bonding_opts', 'bridge_opts',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> 'management', 'static', 'netmask', 'dhcp_tag', 'dns_name',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line161">161</a> 'static_routes', 'virt_bridge', 'ipv6_address', 'ipv6_secondaries',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> 'ipv6_mtu', 'ipv6_static_routes', 'ipv6_default_gateway'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> ],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line164">164</a> 'special' =&gt; ['interfaces', 'interfaces_extra']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line165">165</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line166">166</a> 'profile' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line167">167</a> 'fields' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line168">168</a> 'name', 'owners', 'distro', 'parent', 'enable_gpxe',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> 'enable_menu', 'kickstart', 'kernel_options', 'kernel_options_post',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> 'ks_meta', 'proxy', 'repos', 'comment', 'virt_auto_boot',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line171">171</a> 'virt_cpus', 'virt_file_size', 'virt_disk_driver',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line172">172</a> 'virt_ram', 'virt_type', 'virt_path', 'virt_bridge',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line173">173</a> 'dhcp_tag', 'server', 'name_servers', 'name_servers_search',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line174">174</a> 'mgmt_classes', 'mgmt_parameters', 'boot_files', 'fetchable_files',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line175">175</a> 'template_files', 'redhat_management_key', 'redhat_management_server'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line177">177</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line178">178</a> 'distro' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line179">179</a> 'fields' =&gt; ['name', 'owners', 'kernel', 'initrd', 'kernel_options',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> 'kernel_options_post', 'ks_meta', 'arch', 'breed',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line181">181</a> 'os_version', 'comment', 'mgmt_classes', 'boot_files',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> 'fetchable_files', 'template_files', 'redhat_management_key',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line183">183</a> 'redhat_management_server']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line184">184</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line185">185</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line186">186</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line187">187</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line188">188</a> def initialize(h)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line189">189</a> Astute.logger.debug(&quot;Cobsh is initialized with: #{h.inspect}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line190">190</a> raise CobblerError, &quot;Cobbler hash must have 'name' key&quot; unless h.has_key? 'name'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line191">191</a> raise CobblerError, &quot;Cobbler hash must have 'what' key&quot; unless h.has_key? 'what'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line192">192</a> raise CobblerError, &quot;Unsupported 'what' value&quot; unless FIELDS.has_key? h['what']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line193">193</a> h.each{|k, v| store(k, v)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line194">194</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line195">195</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line196">196</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line197">197</a> def cobblerized</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line198">198</a> Astute.logger.debug(&quot;Cobblerizing hash: #{inspect}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> ch = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> ks_meta = &quot;&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line201">201</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line202">202</a> each do |k, v|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line203">203</a> k = aliased(k)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line204">204</a> if ch.has_key?(k) &amp;&amp; ch[k] == v</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line205">205</a> next</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line206">206</a> elsif ch.has_key?(k)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line207">207</a> raise CobblerError, &quot;Wrong cobbler data: #{k} is duplicated&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line208">208</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line209">209</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line210">210</a> # skiping not valid item options</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> unless valid_field?(k)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line212">212</a> Astute.logger.debug(&quot;Key #{k} is not valid. Will be skipped.&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line213">213</a> next</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line214">214</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line215">215</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line216">216</a> # here we don't store ks_meta directly in ch (cobblerized hash)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line217">217</a> # instead we just append ks_meta value to store it later</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line218">218</a> if k == 'ks_meta'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line219">219</a> if v.kind_of?(Hash)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line220">220</a> v.each do |ks_meta_key, ks_meta_value|</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line221">221</a> ks_meta &lt;&lt; &quot; #{ks_meta_key}=#{ks_meta_value}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line222">222</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line223">223</a> elsif v.kind_of?(String)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line224">224</a> ks_meta &lt;&lt; &quot; #{v}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line225">225</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line226">226</a> raise &quot;Wrong ks_meta format. It must be Hash or String&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line227">227</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line228">228</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line229">229</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line230">230</a> # special handling for system interface fields</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line231">231</a> # which are the only objects in cobbler that will ever work this way</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line232">232</a> if k == 'interfaces'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line233">233</a> ch.store('interfaces', cobblerized_interfaces)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line234">234</a> next</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line235">235</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line236">236</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line237">237</a> # here we convert interfaces_extra options into ks_meta format</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line238">238</a> if k == 'interfaces_extra'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line239">239</a> ks_meta &lt;&lt; cobblerized_interfaces_extra</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line240">240</a> next</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line241">241</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line242">242</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line243">243</a> ch.store(k, v)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line244">244</a> end # each do |k, v|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line245">245</a> ch.store('ks_meta', ks_meta.strip) if ks_meta.strip.length &gt; 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line246">246</a> ch</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line247">247</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line248">248</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line249">249</a> def aliased(k)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line250">250</a> # converting 'foo-bar' keys into 'foo_bar' keys</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line251">251</a> k1 = k.gsub(/-/,'_')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line252">252</a> # converting orig keys into alias keys</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line253">253</a> # example: 'ksmeta' into 'ks_meta'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line254">254</a> k2 = ALIASES.each_key.select{|ak| ALIASES[ak].include?(k1)}[0] || k1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line255">255</a> Astute.logger.debug(&quot;Key #{k} aliased with #{k2}&quot;) if k != k2</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line256">256</a> k2</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line257">257</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line258">258</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line259">259</a> def valid_field?(k)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line260">260</a> (FIELDS[fetch('what')]['fields'].include?(k) or</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line261">261</a> (FIELDS[fetch('what')]['special'] or []).include?(k))</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line262">262</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line263">263</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line264">264</a> def valid_interface_field?(k)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line265">265</a> (FIELDS[fetch('what')]['interfaces_fields'] or []).include?(k)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line266">266</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line267">267</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line268">268</a> def cobblerized_interfaces</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line269">269</a> interfaces = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line270">270</a> fetch('interfaces').each do |iname, ihash|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line271">271</a> ihash.each do |iopt, ivalue|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line272">272</a> iopt = aliased(iopt)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line273">273</a> if interfaces.has_key?(&quot;#{iopt}-#{iname}&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line274">274</a> raise CobblerError, &quot;Wrong interface cobbler data: #{iopt} is duplicated&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line275">275</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line276">276</a> unless valid_interface_field?(iopt)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line277">277</a> Astute.logger.debug(&quot;Interface key #{iopt} is not valid. Skipping&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line278">278</a> next</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line279">279</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line280">280</a> Astute.logger.debug(&quot;Defining interfaces[#{iopt}-#{iname}] = #{ivalue}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line281">281</a> interfaces[&quot;#{iopt}-#{iname}&quot;] = ivalue</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line282">282</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line283">283</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line284">284</a> interfaces</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line285">285</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line286">286</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line287">287</a> def cobblerized_interfaces_extra</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line288">288</a> # here we just want to convert interfaces_extra into ks_meta</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line289">289</a> interfaces_extra_str = &quot;&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line290">290</a> fetch('interfaces_extra').each do |iname, iextra|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line291">291</a> iextra.each do |k, v|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line292">292</a> Astute.logger.debug(&quot;Adding into ks_meta interface_extra_#{iname}_#{k}=#{v}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line293">293</a> interfaces_extra_str &lt;&lt; &quot; interface_extra_#{iname}_#{k}=#{v}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line294">294</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line295">295</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line296">296</a> interfaces_extra_str</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line297">297</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line298">298</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line299">299</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line300">300</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line301">301</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>

View File

@ -1,257 +0,0 @@
<!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/config.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/config.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-config_rb.html">lib/astute/config.rb</a></td>
<td class='right_align'><tt>66</tt></td>
<td class='right_align'><tt>34</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>93.94%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:94px"></div>
<div class="uncovered" style="width:6px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>88.24%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:88px"></div>
<div class="uncovered" style="width:12px"></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="marked">
<td><pre><a name="line17">17</a> require 'symboltable'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'singleton'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> class ConfigError &lt; StandardError; end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> class UnknownOptionError &lt; ConfigError</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> attr_reader :name</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> def initialize(name)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line26">26</a> super(&quot;Unknown config option #{name}&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line27">27</a> @name = name</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> class MyConfig</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> include Singleton</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> attr_reader :configtable</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> def initialize</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> @configtable = SymbolTable.new</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> class ParseError &lt; ConfigError</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> attr_reader :line</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> def initialize(message, line)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line44">44</a> super(message)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line45">45</a> @line = line</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> end</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 self.config</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> config = MyConfig.instance.configtable</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> config.update(default_config) if config.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> return config</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> def self.default_config</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> conf = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> conf[:PUPPET_TIMEOUT] = 60*60 # maximum time it waits for the whole deployment</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> conf[:PUPPET_DEPLOY_INTERVAL] = 2 # sleep for ## sec, then check puppet status again</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> conf[:PUPPET_FADE_TIMEOUT] = 60 # how long it can take for puppet to exit after dumping to last_run_summary</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> conf[:MC_RETRIES] = 5 # MClient tries to call mcagent before failure</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> conf[:MC_RETRY_INTERVAL] = 1 # MClient sleeps for ## sec between retries</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> conf[:PUPPET_FADE_INTERVAL] = 1 # retry every ## seconds to check puppet state if it was running</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> conf[:PROVISIONING_TIMEOUT] = 90 * 60 # timeout for booting target OS in provision</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> conf[:REBOOT_TIMEOUT] = 120 # how long it can take for node to reboot </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> return conf</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</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>

View File

@ -1,137 +0,0 @@
<!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/context.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/context.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-context_rb.html">lib/astute/context.rb</a></td>
<td class='right_align'><tt>26</tt></td>
<td class='right_align'><tt>7</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> class Context</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> attr_accessor :task_id, :reporter, :deploy_log_parser</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> def initialize(task_id, reporter, deploy_log_parser=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @task_id = task_id</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> @reporter = reporter</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> @deploy_log_parser = deploy_log_parser</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</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>

View File

@ -1,332 +0,0 @@
<!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/deployment_engine/nailyfact.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/deployment_engine/nailyfact.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-deployment_engine-nailyfact_rb.html">lib/astute/deployment_engine/nailyfact.rb</a></td>
<td class='right_align'><tt>91</tt></td>
<td class='right_align'><tt>38</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>97.80%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>94.74%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></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="marked">
<td><pre><a name="line17">17</a> class Astute::DeploymentEngine::NailyFact &lt; Astute::DeploymentEngine</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> def deploy(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> attrs_for_mode = self.send(&quot;attrs_#{attrs['deployment_mode']}&quot;, nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> super(nodes, attrs_for_mode)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> def create_facts(node, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> # calculate_networks method is common and you can find it in superclass</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> # if node['network_data'] is undefined, we use empty list because we later try to iterate over it</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> # otherwise we will get KeyError</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> node_network_data = node['network_data'].nil? ? [] : node['network_data']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> interfaces = node['meta']['interfaces']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> network_data_puppet = calculate_networks(node_network_data, interfaces)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> metadata = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> 'role' =&gt; node['role'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> 'uid' =&gt; node['uid'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> 'network_data' =&gt; network_data_puppet.to_json</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> attrs.each do |k, v|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> if v.is_a? String</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> metadata[k] = v</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> else</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> # And it's the problem on the puppet side now to decode json</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> metadata[k] = v.to_json</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line44">44</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line45">45</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> # Let's calculate interface settings we need for OpenStack:</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> node_network_data.each do |iface|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> device = if iface['vlan'] &amp;&amp; iface['vlan'] &gt; 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> [iface['dev'], iface['vlan']].join('.')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line51">51</a> iface['dev']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> metadata[&quot;#{iface['name']}_interface&quot;] = device</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> if iface['ip']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> metadata[&quot;#{iface['name']}_address&quot;] = iface['ip'].split('/')[0]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line59">59</a> # internal_address is required for HA..</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> metadata['internal_address'] = node['network_data'].select{|nd| nd['name'] == 'management' }[0]['ip'].split('/')[0]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> if metadata['network_manager'] == 'VlanManager' &amp;&amp; !metadata['fixed_interface']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> metadata['fixed_interface'] = get_fixed_interface(node)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> Astute::Metadata.publish_facts(@ctx, node['uid'], metadata)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> def deploy_piece(nodes, attrs, retries=2, change_node_status=true)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> return false unless validate_nodes(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> @ctx.reporter.report nodes_status(nodes, 'deploying', {'progress' =&gt; 0})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> Astute.logger.info &quot;#{@ctx.task_id}: Calculation of required attributes to pass, include netw.settings&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> create_facts(node, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> Astute.logger.info &quot;#{@ctx.task_id}: All required attrs/metadata passed via facts extension. Starting deployment.&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries, change_node_status)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> nodes_roles = nodes.map { |n| { n['uid'] =&gt; n['role'] } }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> Astute.logger.info &quot;#{@ctx.task_id}: Finished deployment of nodes =&gt; roles: #{nodes_roles.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> def get_fixed_interface(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> return node['vlan_interface'] if node['vlan_interface']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> </pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line88">88</a> Astute.logger.warn &quot;Can not find vlan_interface for node #{node['uid']}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> nil</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</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>

View File

@ -1,137 +0,0 @@
<!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/deployment_engine/simple_puppet.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/deployment_engine/simple_puppet.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-deployment_engine-simple_puppet_rb.html">lib/astute/deployment_engine/simple_puppet.rb</a></td>
<td class='right_align'><tt>26</tt></td>
<td class='right_align'><tt>7</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> class Astute::DeploymentEngine::SimplePuppet &lt; Astute::DeploymentEngine</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> # It is trivial puppet run. It's assumed that user has prepared site.pp</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> # with all required parameters for modules</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> def deploy_piece(nodes, attrs, retries=2, change_node_status=true)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> return false unless validate_nodes(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @ctx.reporter.report nodes_status(nodes, 'deploying', {'progress' =&gt; 0})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries, change_node_status)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> nodes_roles = nodes.map { |n| { n['uid'] =&gt; n['role'] } }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> Astute.logger.info &quot;#{@ctx.task_id}: Finished deployment of nodes =&gt; roles: #{nodes_roles.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</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>

View File

@ -1,710 +0,0 @@
<!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/deployment_engine.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/deployment_engine.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-deployment_engine_rb.html">lib/astute/deployment_engine.rb</a></td>
<td class='right_align'><tt>217</tt></td>
<td class='right_align'><tt>128</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>97.24%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:97px"></div>
<div class="uncovered" style="width:3px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.31%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:95px"></div>
<div class="uncovered" style="width:5px"></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="marked">
<td><pre><a name="line17">17</a> require 'json'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'timeout'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> class DeploymentEngine</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def initialize(context)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> if self.class.superclass.name == 'Object'</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line24">24</a> raise &quot;Instantiation of this superclass is not allowed. Please subclass from #{self.class.name}.&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @ctx = context</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> def deploy(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> # See implementation in subclasses, this may be everriden</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> attrs['deployment_mode'] ||= 'multinode' # simple multinode deployment is the default</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> attrs['use_cinder'] ||= nodes.any?{|n| n['role'] == 'cinder'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> @ctx.deploy_log_parser.deploy_type = attrs['deployment_mode']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> Astute.logger.info &quot;Deployment mode #{attrs['deployment_mode']}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> result = self.send(&quot;deploy_#{attrs['deployment_mode']}&quot;, nodes, attrs)</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> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> def method_missing(method, *args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> Astute.logger.error &quot;Method #{method} is not implemented for #{self.class}, raising exception.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> raise &quot;Method #{method} is not implemented for #{self.class}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> def attrs_singlenode(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> ctrl_management_ip = nodes[0]['network_data'].select {|nd| nd['name'] == 'management'}[0]['ip']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> ctrl_public_ip = nodes[0]['network_data'].select {|nd| nd['name'] == 'public'}[0]['ip']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> attrs['controller_node_address'] = ctrl_management_ip.split('/')[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> attrs['controller_node_public'] = ctrl_public_ip.split('/')[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> attrs</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line49">49</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> def deploy_singlenode(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> # TODO(mihgen) some real stuff is needed</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> Astute.logger.info &quot;Starting deployment of single node OpenStack&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> deploy_piece(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> # we mix all attrs and prepare them for Puppet</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> # Works for multinode deployment mode</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> def attrs_multinode(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> ctrl_nodes = attrs['controller_nodes']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> # TODO(mihgen): we should report error back if there are not enough metadata passed</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> ctrl_management_ips = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> ctrl_public_ips = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> ctrl_nodes.each do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> ctrl_management_ips &lt;&lt; n['network_data'].select {|nd| nd['name'] == 'management'}[0]['ip']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> ctrl_public_ips &lt;&lt; n['network_data'].select {|nd| nd['name'] == 'public'}[0]['ip']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> attrs['controller_node_address'] = ctrl_management_ips[0].split('/')[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> attrs['controller_node_public'] = ctrl_public_ips[0].split('/')[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> attrs</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> # This method is called by Ruby metaprogramming magic from deploy method</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> # It should not contain any magic with attributes, and should not directly run any type of MC plugins</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> # It does only support of deployment sequence. See deploy_piece implementation in subclasses.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> def deploy_multinode(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> deploy_ha_full(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> def attrs_ha(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> # TODO(mihgen): we should report error back if there are not enough metadata passed</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> ctrl_nodes = attrs['controller_nodes']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> ctrl_manag_addrs = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> ctrl_public_addrs = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> ctrl_storage_addrs = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> ctrl_nodes.each do |n|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> # current puppet modules require `hostname -s`</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> hostname = n['fqdn'].split(/\./)[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> ctrl_manag_addrs.merge!({hostname =&gt;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> n['network_data'].select {|nd| nd['name'] == 'management'}[0]['ip'].split(/\//)[0]})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> ctrl_public_addrs.merge!({hostname =&gt;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> n['network_data'].select {|nd| nd['name'] == 'public'}[0]['ip'].split(/\//)[0]})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> ctrl_storage_addrs.merge!({hostname =&gt;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> n['network_data'].select {|nd| nd['name'] == 'storage'}[0]['ip'].split(/\//)[0]})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> attrs['nodes'] = ctrl_nodes.map do |n|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> 'name' =&gt; n['fqdn'].split(/\./)[0],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line101">101</a> 'role' =&gt; 'controller',</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> 'internal_address' =&gt; n['network_data'].select {|nd| nd['name'] == 'management'}[0]['ip'].split(/\//)[0],</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line103">103</a> 'public_address' =&gt; n['network_data'].select {|nd| nd['name'] == 'public'}[0]['ip'].split(/\//)[0],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> 'mountpoints' =&gt; &quot;1 1\n2 2&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> 'zone' =&gt; n['id'],</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> 'storage_local_net_ip' =&gt; n['network_data'].select {|nd| nd['name'] == 'storage'}[0]['ip'].split(/\//)[0],</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> attrs['nodes'].first['role'] = 'primary-controller'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> attrs['ctrl_hostnames'] = ctrl_nodes.map {|n| n['fqdn'].split(/\./)[0]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line111">111</a> attrs['master_hostname'] = ctrl_nodes[0]['fqdn'].split(/\./)[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> attrs['ctrl_public_addresses'] = ctrl_public_addrs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> attrs['ctrl_management_addresses'] = ctrl_manag_addrs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> attrs['ctrl_storage_addresses'] = ctrl_storage_addrs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> attrs</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line116">116</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line117">117</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> def deploy_ha(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> deploy_ha_full(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> end</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> def deploy_ha_compact(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line123">123</a> deploy_ha_full(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> def deploy_ha_full(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line127">127</a> primary_ctrl_nodes = nodes.select {|n| n['role'] == 'primary-controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line128">128</a> ctrl_nodes = nodes.select {|n| n['role'] == 'controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> unless primary_ctrl_nodes.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> if ctrl_nodes.size &gt; 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> primary_ctrl_nodes = [ctrl_nodes.shift]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> compute_nodes = nodes.select {|n| n['role'] == 'compute'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> quantum_nodes = nodes.select {|n| n['role'] == 'quantum'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> storage_nodes = nodes.select {|n| n['role'] == 'storage'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line137">137</a> proxy_nodes = nodes.select {|n| n['role'] == 'swift-proxy'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line138">138</a> primary_proxy_nodes = nodes.select {|n| n['role'] == 'primary-swift-proxy'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> other_nodes = nodes - ctrl_nodes - primary_ctrl_nodes - \</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> primary_proxy_nodes - quantum_nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> Astute.logger.info &quot;Starting deployment of primary controller&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> deploy_piece(primary_ctrl_nodes, attrs, 0, false)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line145">145</a> Astute.logger.info &quot;Starting deployment of all controllers one by one&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line146">146</a> ctrl_nodes.each {|n| deploy_piece([n], attrs)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line148">148</a> Astute.logger.info &quot;Starting deployment of 1st controller and 1st proxy&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> deploy_piece(primary_ctrl_nodes + primary_proxy_nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line151">151</a> Astute.logger.info &quot;Starting deployment of quantum nodes&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line152">152</a> deploy_piece(quantum_nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line153">153</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line154">154</a> Astute.logger.info &quot;Starting deployment of other nodes&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line155">155</a> deploy_piece(other_nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> return</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line158">158</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line160">160</a> def nodes_status(nodes, status, data_to_merge)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line161">161</a> {'nodes' =&gt; nodes.map { |n| {'uid' =&gt; n['uid'], 'status' =&gt; status}.merge(data_to_merge) }}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> def validate_nodes(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line165">165</a> if nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> Astute.logger.info &quot;#{@ctx.task_id}: Nodes to deploy are not provided. Do nothing.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> return false</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line168">168</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line169">169</a> return true</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line171">171</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line172">172</a> def calculate_networks(data, hwinterfaces)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line173">173</a> interfaces = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line174">174</a> data ||= []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line175">175</a> Astute.logger.info &quot;calculate_networks function was provided with #{data.size} interfaces&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line176">176</a> data.each do |net|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line177">177</a> Astute.logger.debug &quot;Calculating network for #{net.inspect}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> if net['vlan'] &amp;&amp; net['vlan'] != 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> name = [net['dev'], net['vlan']].join('.')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line181">181</a> name = net['dev']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line183">183</a> unless interfaces.has_key?(name)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line184">184</a> interfaces[name] = {'interface' =&gt; name, 'ipaddr' =&gt; []}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line185">185</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line186">186</a> iface = interfaces[name]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line187">187</a> if net['name'] == 'admin'</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line188">188</a> if iface['ipaddr'].size &gt; 0</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line189">189</a> Astute.logger.error &quot;Admin network interferes with openstack nets&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line190">190</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line191">191</a> iface['ipaddr'] += ['dhcp']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line192">192</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line193">193</a> if iface['ipaddr'].any?{|x| x == 'dhcp'}</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line194">194</a> Astute.logger.error &quot;Admin network interferes with openstack nets&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line195">195</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line196">196</a> if net['ip']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line197">197</a> iface['ipaddr'] += [net['ip']]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line198">198</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> if net['gateway'] &amp;&amp; net['name'] =~ /^public$/i</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> iface['gateway'] = net['gateway']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line201">201</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line202">202</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line203">203</a> Astute.logger.debug &quot;Calculated network for interface: #{name}, data: #{iface.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line204">204</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line205">205</a> interfaces['lo'] = {'interface'=&gt;'lo', 'ipaddr'=&gt;['127.0.0.1/8']} unless interfaces.has_key?('lo')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line206">206</a> hwinterfaces.each do |i|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line207">207</a> unless interfaces.has_key?(i['name'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line208">208</a> interfaces[i['name']] = {'interface' =&gt; i['name'], 'ipaddr' =&gt; []}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line209">209</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line210">210</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> interfaces.keys.each do |i|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line212">212</a> interfaces[i]['ipaddr'] = 'none' if interfaces[i]['ipaddr'].size == 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line213">213</a> interfaces[i]['ipaddr'] = 'dhcp' if interfaces[i]['ipaddr'] == ['dhcp']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line214">214</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line215">215</a> interfaces</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line216">216</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line217">217</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line218">218</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>

View File

@ -1,572 +0,0 @@
<!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/deployment.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/deployment.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-deployment_rb.html">lib/astute/logparser/deployment.rb</a></td>
<td class='right_align'><tt>171</tt></td>
<td class='right_align'><tt>88</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>82.46%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:82px"></div>
<div class="uncovered" style="width:18px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>65.91%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:66px"></div>
<div class="uncovered" style="width:34px"></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="marked">
<td><pre><a name="line17">17</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> module LogParser</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> class ParseDeployLogs &lt;ParseNodeLogs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> attr_reader :deploy_type</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> def initialize(deploy_type='multinode')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @deploy_type = deploy_type</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> pattern_spec = Patterns::get_default_pattern(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> &quot;puppet-log-components-list-#{@deploy_type}-controller&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> super(pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> def deploy_type= (deploy_type)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line29">29</a> @deploy_type = deploy_type</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line30">30</a> @nodes_states = {}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> def progress_calculate(uids_to_calc, nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> # Just create correct pattern for each node and then call parent method.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> uids_to_calc.each do |uid|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> node = nodes.select {|n| n['uid'] == uid}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> unless @nodes_states[uid]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> pattern_spec = Patterns::get_default_pattern(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> &quot;puppet-log-components-list-#{@deploy_type}-#{node['role']}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> pattern_spec['path_prefix'] ||= PATH_PREFIX.to_s</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> pattern_spec['separator'] ||= SEPARATOR.to_s</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> @nodes_states[uid] = pattern_spec</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line44">44</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> super(uids_to_calc, nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> def calculate(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> case node_pattern_spec['type']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> when 'count-lines'</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line52">52</a> progress = simple_line_counter(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> when 'components-list'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> progress = component_parser(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> def simple_line_counter(fo, pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> # Pattern specification example:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> # pattern_spec = {'type' =&gt; 'count-lines',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</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="line63">63</a> # 'expected_line_number' =&gt; 500}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> # Use custom separator if defined.</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line65">65</a> separator = pattern_spec['separator']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line66">66</a> counter = 0</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line67">67</a> end_of_scope = false</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line68">68</a> previous_subchunk = ''</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line69">69</a> until end_of_scope</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line70">70</a> chunk = get_chunk(fo, pattern_spec['chunk_size'])</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line71">71</a> break unless chunk</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> # Trying to find separator on border between chunks.</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line73">73</a> subchunk = chunk.slice((1-separator.size)..-1)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> # End of file reached. Exit from cycle.</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line75">75</a> end_of_scope = true unless subchunk</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line76">76</a> if subchunk and (subchunk + previous_subchunk).include?(separator)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> # Separator found on border between chunks. Exit from cycle.</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line78">78</a> end_of_scope = true</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line79">79</a> continue</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> </pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line82">82</a> pos = chunk.rindex(separator)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line83">83</a> if pos</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line84">84</a> end_of_scope = true</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line85">85</a> chunk = chunk.slice((pos + separator.size)..-1)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line87">87</a> counter += chunk.count(&quot;\n&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line89">89</a> number = pattern_spec['expected_line_number']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line90">90</a> unless number</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line91">91</a> Astute.logger.warn(&quot;Wrong pattern #{pattern_spec.inspect} defined for calculating progress via log.&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="uncovered">
<td><pre><a name="line94">94</a> progress = counter.to_f / number</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line95">95</a> progress = 1 if progress &gt; 1</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line96">96</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> def component_parser(fo, pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> # Pattern specification example:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line101">101</a> # pattern_spec = {'type' =&gt; 'components-list',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> # 'chunk_size' =&gt; 40000,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> # 'components_list' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> # {'name' =&gt; 'Horizon', 'weight' =&gt; 10, 'patterns' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> # {'pattern' =&gt; '/Stage[main]/Horizon/Package[mod_wsgi]/ensure) created', 'progress' =&gt; 0.1},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line106">106</a> # {'pattern' =&gt; '/Stage[main]/Horizon/File_line[horizon_redirect_rule]/ensure) created', 'progress' =&gt; 0.3},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> # {'pattern' =&gt; '/Stage[main]/Horizon/File[/etc/openstack-dashboard/local_settings]/group)', 'progress' =&gt; 0.7},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> # {'pattern' =&gt; '/Stage[main]/Horizon/Service[$::horizon::params::http_service]/ensure)'\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> # ' ensure changed \'stopped\' to \'running\'', 'progress' =&gt; 1},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> # ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> # },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> # ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> # }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> # Use custom separator if defined.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> separator = pattern_spec['separator']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> components_list = pattern_spec['components_list']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> unless components_list</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line118">118</a> Astute.logger.warn(&quot;Wrong pattern #{pattern_spec.inspect} defined for calculating progress via logs.&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line119">119</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> end</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> chunk = get_chunk(fo, pos=pattern_spec['file_pos'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line123">123</a> return 0 unless chunk</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line124">124</a> pos = chunk.rindex(separator)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> chunk = chunk.slice((pos + separator.size)..-1) if pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> block = chunk.split(&quot;\n&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line127">127</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> # Update progress of each component.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> while block.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> string = block.pop</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> components_list.each do |component|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line132">132</a> matched_pattern = nil</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line133">133</a> component['patterns'].each do |pattern|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> if pattern['regexp']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> matched_pattern = pattern if string.match(pattern['pattern'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line136">136</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line137">137</a> matched_pattern = pattern if string.include?(pattern['pattern'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> break if matched_pattern</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> if matched_pattern and</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> (not component['_progress'] or matched_pattern['progress'] &gt; component['_progress'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> component['_progress'] = matched_pattern['progress']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line145">145</a> end</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> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line148">148</a> # Calculate integral progress.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> weighted_components = components_list.select{|n| n['weight']}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line150">150</a> weight_sum = 0.0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line151">151</a> if weighted_components.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line152">152</a> weighted_components.each{|n| weight_sum += n['weight']}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> weight_sum = weight_sum * components_list.length / weighted_components.length</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line154">154</a> raise &quot;Total weight of weighted components equal to zero.&quot; if weight_sum == 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line156">156</a> nonweighted_delta = 1.0 / components_list.length</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line157">157</a> progress = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line158">158</a> components_list.each do |component|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> component['_progress'] = 0.0 unless component['_progress']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line160">160</a> weight = component['weight']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line161">161</a> if weight</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line162">162</a> progress += component['_progress'] * weight / weight_sum</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line164">164</a> progress += component['_progress'] * nonweighted_delta</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line165">165</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line166">166</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line167">167</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line171">171</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line172">172</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>

File diff suppressed because it is too large Load Diff

View File

@ -1,821 +0,0 @@
<!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/provision.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/provision.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-provision_rb.html">lib/astute/logparser/provision.rb</a></td>
<td class='right_align'><tt>254</tt></td>
<td class='right_align'><tt>122</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>86.61%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:87px"></div>
<div class="uncovered" style="width:13px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>72.13%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:72px"></div>
<div class="uncovered" style="width:28px"></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="marked">
<td><pre><a name="line17">17</a> require 'date'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module LogParser</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> class ParseProvisionLogs &lt;ParseNodeLogs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def initialize</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> pattern_spec = Patterns::get_default_pattern('anaconda-log-supposed-time-kvm')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> super(pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> def progress_calculate(uids_to_calc, nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> # Just create correct pattern for each node and then call parent method.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> uids_to_calc.each do |uid|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> node = nodes.select {|n| n['uid'] == uid}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> unless @nodes_states[uid]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> @nodes_states[uid] = get_pattern_for_node(node)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> super(uids_to_calc, nodes)</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> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> def calculate(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> case node_pattern_spec['type']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> when 'pattern-list'</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line42">42</a> progress = simple_pattern_finder(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> when 'supposed-time'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> progress = supposed_time_parser(fo, node_pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line45">45</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> return progress</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 get_pattern_for_node(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> if node['manufacturer'] == 'KVM'</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line51">51</a> pattern_spec = Patterns::get_default_pattern('anaconda-log-supposed-time-kvm')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> pattern_spec = Patterns::get_default_pattern('anaconda-log-supposed-time-baremetal')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> pattern_spec['path_prefix'] ||= PATH_PREFIX.to_s</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> pattern_spec['separator'] ||= SEPARATOR.to_s</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> hdd = node['meta']['disks'].select{|disk| not disk['removable']}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> if hdd</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> # Convert size from bytes to GB</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> hdd_size = hdd['size'] / 10 ** 9</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> else</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> # Default hdd size is 20 GB</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line64">64</a> hdd_size = 20</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="marked">
<td><pre><a name="line67">67</a> hdd_pattern = pattern_spec['pattern_list'].select {|el| el['hdd_size_multiplier']}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> hdd_pattern['supposed_time'] = (hdd_pattern['hdd_size_multiplier'] * hdd_size).to_i</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> return pattern_spec</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> def supposed_time_parser(fo, pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> # Pattern specification example:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> # pattern_spec = {'type' =&gt; 'supposed-time',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> # 'chunk_size' =&gt; 10000,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> # 'date_format' =&gt; '%Y-%m-%dT%H:%M:%S',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> # 'date_regexp' =&gt; '^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> # 'pattern_list' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> # {'pattern' =&gt; 'Running anaconda script', 'supposed_time' =&gt; 60},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> # {'pattern' =&gt; 'moving (1) to step enablefilesystems', 'supposed_time' =&gt; 3},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> # {'pattern' =&gt; &quot;notifying kernel of 'change' event on device&quot;, 'supposed_time' =&gt; 200},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> # {'pattern' =&gt; 'Preparing to install packages', 'supposed_time' =&gt; 9},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> # {'pattern' =&gt; 'Installing glibc-common-2.12', 'supposed_time' =&gt; 9},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> # {'pattern' =&gt; 'Installing bash-4.1.2', 'supposed_time' =&gt; 11},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> # {'pattern' =&gt; 'Installing coreutils-8.4-19', 'supposed_time' =&gt; 20},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> # {'pattern' =&gt; 'Installing centos-release-6-3', 'supposed_time' =&gt; 21},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> # {'pattern' =&gt; 'Installing attr-2.4.44', 'supposed_time' =&gt; 23},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> # {'pattern' =&gt; 'leaving (1) step installpackages', 'supposed_time' =&gt; 60},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> # {'pattern' =&gt; 'moving (1) to step postscripts', 'supposed_time' =&gt; 4},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> # {'pattern' =&gt; 'leaving (1) step postscripts', 'supposed_time' =&gt; 130},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> # ].reverse,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> # 'filename' =&gt; 'install/anaconda.log'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> # }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> # Use custom separator if defined.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> separator = pattern_spec['separator']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line96">96</a> log_patterns = pattern_spec['pattern_list']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> date_format = pattern_spec['date_format']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> date_regexp = pattern_spec['date_regexp']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> unless date_regexp and date_format and log_patterns</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line100">100</a> Astute.logger.warn(&quot;Wrong pattern_spec #{pattern_spec.inspect} defined for calculating progress via logs.&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line101">101</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line104">104</a> def self.get_elapsed_time(patterns)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> elapsed_time = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> patterns.each do |p|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> if p['_progress']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> break</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> elapsed_time += p['supposed_time']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> return elapsed_time</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line115">115</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> def self.get_progress(base_progress, elapsed_time, delta_time, supposed_time=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> return 1.0 if elapsed_time.zero?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> k = (1.0 - base_progress) / elapsed_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> supposed_time ? surplus = delta_time - supposed_time : surplus = nil</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> if surplus and surplus &gt; 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> progress = supposed_time * k + surplus * k/3 + base_progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line122">122</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line123">123</a> progress = delta_time * k + base_progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> progress = 1.0 if progress &gt; 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line127">127</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> def self.get_seconds_from_time(date)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> hours, mins, secs, frac = Date::day_fraction_to_time(date)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> return hours*60*60 + mins*60 + secs</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> chunk = get_chunk(fo, pattern_spec['chunk_size'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> return 0 unless chunk</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line137">137</a> pos = chunk.rindex(separator)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line138">138</a> chunk = chunk.slice((pos + separator.size)..-1) if pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> block = chunk.split(&quot;\n&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line141">141</a> now = DateTime.now()</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> prev_time = pattern_spec['_prev_time'] ||= now</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> prev_progress = pattern_spec['_prev_progress'] ||= 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line144">144</a> elapsed_time = pattern_spec['_elapsed_time'] ||= get_elapsed_time(log_patterns)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line145">145</a> seconds_since_prev = get_seconds_from_time(now - prev_time)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line147">147</a> until block.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line148">148</a> string = block.pop</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> log_patterns.each do |pattern|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line150">150</a> if string.include?(pattern['pattern'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line151">151</a> if pattern['_progress']</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> # We not found any new messages. Calculate progress with old data.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> progress = get_progress(prev_progress, elapsed_time,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> seconds_since_prev, pattern['supposed_time'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line155">155</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> else</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line158">158</a> # We found message that we never find before. We need to: </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line159">159</a> # calculate progress for this message;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> # recalculate control point and elapsed_time;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line161">161</a> # calculate progress for current time.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> # Trying to find timestamp of message.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> date_string = string.match(date_regexp)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line165">165</a> if date_string</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line166">166</a> # Get relative time when the message realy occured.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> date = DateTime.strptime(date_string[0], date_format) - prev_time.offset</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> real_time = get_seconds_from_time(date - prev_time)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> # Update progress of the message.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line170">170</a> prev_supposed_time = log_patterns.select{|n| n['_progress'] == prev_progress}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line171">171</a> prev_supposed_time = prev_supposed_time['supposed_time'] if prev_supposed_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line172">172</a> progress = get_progress(prev_progress, elapsed_time, real_time, prev_supposed_time)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line173">173</a> pattern['_progress'] = progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line174">174</a> # Recalculate elapsed time.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line175">175</a> elapsed_time = pattern_spec['_elapsed_time'] = get_elapsed_time(log_patterns)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> # Update time and progress for control point.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line177">177</a> prev_time = pattern_spec['_prev_time'] = date</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> prev_progress = pattern_spec['_prev_progress'] = progress</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> seconds_since_prev = get_seconds_from_time(now - date)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> # Calculate progress for current time.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line181">181</a> progress = get_progress(prev_progress, elapsed_time,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> seconds_since_prev, pattern['supposed_time'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line183">183</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line184">184</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line185">185</a> Astute.logger.info(&quot;Can't gather date (format: '#{date_regexp}') from string: #{string}&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line186">186</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line187">187</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line188">188</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line189">189</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line190">190</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line191">191</a> # We found nothing.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line192">192</a> progress = get_progress(prev_progress, elapsed_time, seconds_since_prev, log_patterns[0]['supposed_time'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line193">193</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line194">194</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line195">195</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line196">196</a> def simple_pattern_finder(fo, pattern_spec)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line197">197</a> # Pattern specification example:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line198">198</a> # pattern_spec = {'type' =&gt; 'pattern-list', 'separator' =&gt; &quot;custom separator\n&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line199">199</a> # 'chunk_size' =&gt; 40000,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line200">200</a> # 'pattern_list' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line201">201</a> # {'pattern' =&gt; 'Running kickstart %%pre script', 'progress' =&gt; 0.08},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line202">202</a> # {'pattern' =&gt; 'to step enablefilesystems', 'progress' =&gt; 0.09},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line203">203</a> # {'pattern' =&gt; 'to step reposetup', 'progress' =&gt; 0.13},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line204">204</a> # {'pattern' =&gt; 'to step installpackages', 'progress' =&gt; 0.16},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line205">205</a> # {'pattern' =&gt; 'Installing',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line206">206</a> # 'number' =&gt; 210, # Now it install 205 packets. Add 5 packets for growth in future.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line207">207</a> # 'p_min' =&gt; 0.16, # min percent</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line208">208</a> # 'p_max' =&gt; 0.87 # max percent</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line209">209</a> # },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line210">210</a> # {'pattern' =&gt; 'to step postinstallconfig', 'progress' =&gt; 0.87},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line211">211</a> # {'pattern' =&gt; 'to step dopostaction', 'progress' =&gt; 0.92},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line212">212</a> # ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line213">213</a> # }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line214">214</a> # Use custom separator if defined.</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line215">215</a> separator = pattern_spec['separator']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line216">216</a> log_patterns = pattern_spec['pattern_list']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line217">217</a> unless log_patterns</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line218">218</a> Astute.logger.warn(&quot;Wrong pattern #{pattern_spec.inspect} defined for calculating progress via logs.&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line219">219</a> return 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line220">220</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line221">221</a> </pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line222">222</a> chunk = get_chunk(fo, pattern_spec['chunk_size'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line223">223</a> # NOTE(mihgen): Following line fixes &quot;undefined method `rindex' for nil:NilClass&quot; for empty log file</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line224">224</a> return 0 unless chunk</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line225">225</a> pos = chunk.rindex(separator)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line226">226</a> chunk = chunk.slice((pos + separator.size)..-1) if pos</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line227">227</a> block = chunk.split(&quot;\n&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line228">228</a> return 0 unless block</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line229">229</a> while true</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line230">230</a> string = block.pop</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line231">231</a> return 0 unless string # If we found nothing</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line232">232</a> log_patterns.each do |pattern|</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line233">233</a> if string.include?(pattern['pattern'])</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line234">234</a> return pattern['progress'] if pattern['progress']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line235">235</a> if pattern['number']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line236">236</a> string = block.pop</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line237">237</a> counter = 1</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line238">238</a> while string</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line239">239</a> counter += 1 if string.include?(pattern['pattern'])</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line240">240</a> string = block.pop</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line241">241</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line242">242</a> progress = counter.to_f / pattern['number']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line243">243</a> progress = 1 if progress &gt; 1</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line244">244</a> progress = pattern['p_min'] + progress * (pattern['p_max'] - pattern['p_min'])</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line245">245</a> return progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line246">246</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line247">247</a> Astute.logger.warn(&quot;Wrong pattern #{pattern_spec.inspect} defined for calculating progress via log.&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line248">248</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line249">249</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line250">250</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line251">251</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line252">252</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line253">253</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line254">254</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line255">255</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>

View File

@ -1,503 +0,0 @@
<!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>

View File

@ -1,464 +0,0 @@
<!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/mclient.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/mclient.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-mclient_rb.html">lib/astute/mclient.rb</a></td>
<td class='right_align'><tt>135</tt></td>
<td class='right_align'><tt>75</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>91.11%</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=''>84.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:84px"></div>
<div class="uncovered" style="width:16px"></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="marked">
<td><pre><a name="line17">17</a> require 'mcollective'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> class MClient</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> include MCollective::RPC</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> attr_accessor :retries</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> def initialize(ctx, agent, nodes=nil, check_result=true, timeout=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @task_id = ctx.task_id</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> @agent = agent</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> @nodes = nodes.map { |n| n.to_s } if nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> @check_result = check_result</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> @retries = Astute.config.MC_RETRIES</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> @timeout = timeout</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> initialize_mclient</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> def on_respond_timeout(&amp;block)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> @on_respond_timeout = block</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> self</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> def method_missing(method, *args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> @mc_res = mc_send(method, *args)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> if method == :discover</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> @nodes = args[0][:nodes]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> return @mc_res</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line48">48</a> # Enable if needed. In normal case it eats the screen pretty fast</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> log_result(@mc_res, method)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> check_results_with_retries(method, args) if @check_result</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> @mc_res</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> def check_results_with_retries(method, args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> err_msg = ''</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> # Following error might happen because of misconfiguration, ex. direct_addressing = 1 only on client</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> # or.. could be just some hang? Let's retry if @retries is set</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> if @mc_res.length &lt; @nodes.length</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> # some nodes didn't respond</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> retry_index = 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> while retry_index &lt;= @retries</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> sleep rand</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> nodes_responded = @mc_res.map { |n| n.results[:sender] }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> not_responded = @nodes - nodes_responded</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> Astute.logger.debug &quot;Retry ##{retry_index} to run mcollective agent on nodes: '#{not_responded.join(',')}'&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> mc_send :discover, :nodes =&gt; not_responded</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> @new_res = mc_send(method, *args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> log_result(@new_res, method)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> # @new_res can have some nodes which finally responded</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> @mc_res += @new_res</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> break if @mc_res.length == @nodes.length</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> retry_index += 1</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> if @mc_res.length &lt; @nodes.length</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> nodes_responded = @mc_res.map { |n| n.results[:sender] }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> not_responded = @nodes - nodes_responded</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> if @on_respond_timeout</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line82">82</a> @on_respond_timeout.call not_responded</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> err_msg += &quot;MCollective agents '#{not_responded.join(',')}' didn't respond. \n&quot;</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> failed = @mc_res.select{|x| x.results[:statuscode] != 0 }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> if failed.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> err_msg += &quot;MCollective call failed in agent '#{@agent}', &quot;\</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> &quot;method '#{method}', failed nodes: #{failed.map{|x| x.results[:sender]}.join(',')} \n&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> unless err_msg.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> Astute.logger.error err_msg</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> raise &quot;#{@task_id}: #{err_msg}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> def mc_send(*args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> @mc.send(*args)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> rescue =&gt; ex</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line103">103</a> case ex</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> when Stomp::Error::NoCurrentConnection</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> # stupid stomp cannot recover severed connection</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line106">106</a> stomp = MCollective::PluginManager[&quot;connector_plugin&quot;]</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line107">107</a> stomp.disconnect rescue nil</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line108">108</a> stomp.instance_variable_set :@connection, nil</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line109">109</a> initialize_mclient</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line111">111</a> sleep rand</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line112">112</a> Astute.logger.error &quot;Retrying MCollective call after exception: #{ex}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line113">113</a> retry</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line115">115</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> def initialize_mclient</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> @mc = rpcclient(@agent, :exit_on_failure =&gt; false)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> @mc.timeout = @timeout if @timeout</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> @mc.progress = false</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> if @nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> @mc.discover :nodes =&gt; @nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line122">122</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> rescue =&gt; ex</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line124">124</a> Astute.logger.error &quot;Retrying RPC client instantiation after exception: #{ex}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line125">125</a> sleep 5</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line126">126</a> retry</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line127">127</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> def log_result(result, method)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> result.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> Astute.logger.debug &quot;#{@task_id}: MC agent '#{node.agent}', method '#{method}', &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> &quot;results: #{node.results.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line135">135</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line136">136</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>

View File

@ -1,149 +0,0 @@
<!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/metadata.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/metadata.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-metadata_rb.html">lib/astute/metadata.rb</a></td>
<td class='right_align'><tt>30</tt></td>
<td class='right_align'><tt>9</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>86.67%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:87px"></div>
<div class="uncovered" style="width:13px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>55.56%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:56px"></div>
<div class="uncovered" style="width:44px"></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="marked">
<td><pre><a name="line17">17</a> require 'json'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'ipaddr'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> module Metadata</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def self.publish_facts(ctx, uid, metadata)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> # This is synchronious RPC call, so we are sure that data were sent and processed remotely</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line24">24</a> Astute.logger.info &quot;#{ctx.task_id}: nailyfact - storing metadata for node uid=#{uid}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line25">25</a> Astute.logger.debug &quot;#{ctx.task_id}: nailyfact stores metadata: #{metadata.inspect}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line26">26</a> nailyfact = MClient.new(ctx, &quot;nailyfact&quot;, [uid])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> # TODO(mihgen) check results!</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line28">28</a> stats = nailyfact.post(:value =&gt; metadata.to_json)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line29">29</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</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>

View File

@ -1,395 +0,0 @@
<!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/network.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/network.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-network_rb.html">lib/astute/network.rb</a></td>
<td class='right_align'><tt>112</tt></td>
<td class='right_align'><tt>45</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> module Network</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> def self.check_network(ctx, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> if nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> Astute.logger.info(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> &quot;#{ctx.task_id}: Network checker: nodes list is empty. Nothing to check.&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> return {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> 'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> 'error' =&gt; &quot;Network verification requires a minimum of two nodes.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> elsif nodes.length == 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> Astute.logger.info(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> &quot;#{ctx.task_id}: Network checker: nodes list contains one node only. Do nothing.&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> return {'nodes' =&gt; [{</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> 'uid' =&gt; nodes[0]['uid'],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> 'networks' =&gt; nodes[0]['networks']</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> }]}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> uids = nodes.map { |node| node['uid'].to_s }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> # TODO Everything breakes if agent not found. We have to handle that</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> net_probe = MClient.new(ctx, &quot;net_probe&quot;, uids)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> start_frame_listeners(ctx, net_probe, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> ctx.reporter.report({'progress' =&gt; 30})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> send_probing_frames(ctx, net_probe, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> ctx.reporter.report({'progress' =&gt; 60})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> net_probe.discover(:nodes =&gt; uids)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> stats = net_probe.get_probing_info</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> result = format_result(stats)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> Astute.logger.debug &quot;#{ctx.task_id}: Network checking is done. Results: #{result.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> {'nodes' =&gt; result}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> def self.start_frame_listeners(ctx, net_probe, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> data_to_send = make_interfaces_to_send(node['networks'])</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> Astute.logger.debug(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> &quot;#{ctx.task_id}: Network checker listen: node: #{node['uid']} data: #{data_to_send.inspect}&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> net_probe.discover(:nodes =&gt; [node['uid'].to_s])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> net_probe.start_frame_listeners(:interfaces =&gt; data_to_send.to_json)</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> def self.send_probing_frames(ctx, net_probe, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> data_to_send = make_interfaces_to_send(node['networks'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> Astute.logger.debug(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> &quot;#{ctx.task_id}: Network checker send: node: #{node['uid']} data: #{data_to_send.inspect}&quot;)</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> net_probe.discover(:nodes =&gt; [node['uid'].to_s])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> net_probe.send_probing_frames(:interfaces =&gt; data_to_send.to_json)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> def self.make_interfaces_to_send(networks)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> data_to_send = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line82">82</a> networks.each do |network|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> data_to_send[network['iface']] = network['vlans'].join(&quot;,&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> data_to_send</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> end</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 self.format_result(stats)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> uids = stats.map{|node| node.results[:sender]}.sort</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> stats.map do |node|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> 'uid' =&gt; node.results[:sender],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> 'networks' =&gt; check_vlans_by_traffic(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> uids,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> node.results[:data][:neighbours])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> def self.check_vlans_by_traffic(uids, data)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> data.map do |iface, vlans|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> 'iface' =&gt; iface,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> 'vlans' =&gt; vlans.reject{ |k, v|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> v.keys.sort != uids</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> }.keys.map(&amp;:to_i)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</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>

View File

@ -1,338 +0,0 @@
<!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/node.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/node.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-node_rb.html">lib/astute/node.rb</a></td>
<td class='right_align'><tt>93</tt></td>
<td class='right_align'><tt>44</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require 'active_support/core_ext/hash/indifferent_access'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'ostruct'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> class Node &lt; OpenStruct</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def initialize(hash=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> if hash &amp;&amp; (uid = hash['uid'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> hash = hash.dup</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> hash['uid'] = uid.to_s</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> raise TypeError.new(&quot;Invalid data: #{hash.inspect}&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> super hash</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> def [](key)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> send key</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> def []=(key, value)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> send &quot;#{key}=&quot;, value</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> def uid</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> @table[:uid]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> def uid=(_)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> raise TypeError.new('Read-only attribute')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> def to_hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> @table.with_indifferent_access</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> class NodesHash &lt; Hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> alias uids keys</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> alias nodes values</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> def self.build(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> return nodes if nodes.kind_of? self</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> nodes.inject(self.new) do |hash, node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> hash &lt;&lt; node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> hash</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> def &lt;&lt;(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> node = normalize_value(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> self[node.uid] = node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> self</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> def push(*nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> nodes.each{|node| self.&lt;&lt; node }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> self</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> def [](key)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> super key.to_s</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line82">82</a> def []=(*args)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> super</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> def normalize_value(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> if node.kind_of? Node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> Node.new(node.to_hash)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</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>

View File

@ -1,374 +0,0 @@
<!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/nodes_remover.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/nodes_remover.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-nodes_remover_rb.html">lib/astute/nodes_remover.rb</a></td>
<td class='right_align'><tt>105</tt></td>
<td class='right_align'><tt>53</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>98.10%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>96.23%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:96px"></div>
<div class="uncovered" style="width:4px"></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="marked">
<td><pre><a name="line17">17</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> class NodesRemover</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> def initialize(ctx, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> @ctx = ctx</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @nodes = NodesHash.build(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> def remove</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> # TODO(mihgen): 1. Nailgun should process node error message</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> # 2. Should we rename nodes -&gt; removed_nodes array?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> # 3. If exception is raised here, we should not fully fall into error, but only failed node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> erased_nodes, error_nodes, inaccessible_nodes = remove_nodes(@nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> retry_remove_nodes(error_nodes, erased_nodes,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> Astute.config[:MC_RETRIES], Astute.config[:MC_RETRY_INTERVAL])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> retry_remove_nodes(inaccessible_nodes, erased_nodes,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> Astute.config[:MC_RETRIES], Astute.config[:MC_RETRY_INTERVAL])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> answer = {'nodes' =&gt; serialize_nodes(erased_nodes)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> unless inaccessible_nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> serialized_inaccessible_nodes = serialize_nodes(inaccessible_nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> answer.merge!({'inaccessible_nodes' =&gt; serialized_inaccessible_nodes})</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> Astute.logger.warn &quot;#{@ctx.task_id}: Removing of nodes #{@nodes.uids.inspect} finished &quot; \</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> &quot;with errors. Nodes #{serialized_inaccessible_nodes.inspect} are inaccessible&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line44">44</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line45">45</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> unless error_nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> serialized_error_nodes = serialize_nodes(error_nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> answer.merge!({'status' =&gt; 'error', 'error_nodes' =&gt; serialized_error_nodes})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line49">49</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> Astute.logger.error &quot;#{@ctx.task_id}: Removing of nodes #{@nodes.uids.inspect} finished &quot; \</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> &quot;with errors: #{serialized_error_nodes.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> Astute.logger.info &quot;#{@ctx.task_id}: Finished removing of nodes: #{@nodes.uids.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> answer</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> private</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> def serialize_nodes(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> nodes.nodes.map(&amp;:to_hash)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> def remove_nodes(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> if nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> Astute.logger.info &quot;#{@ctx.task_id}: Nodes to remove are not provided. Do nothing.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> return Array.new(3){ NodesHash.new }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> Astute.logger.info &quot;#{@ctx.task_id}: Starting removing of nodes: #{nodes.uids.inspect}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> remover = MClient.new(@ctx, &quot;erase_node&quot;, nodes.uids.sort, check_result=false)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> responses = remover.erase_node(:reboot =&gt; true)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> Astute.logger.debug &quot;#{@ctx.task_id}: Data received from nodes: #{responses.inspect}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> inaccessible_uids = nodes.uids - responses.map{|response| response.results[:sender] }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> inaccessible_nodes = NodesHash.build(inaccessible_uids.map do |uid|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> {'uid' =&gt; uid, 'error' =&gt; 'Node not answered by RPC.'}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> end)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> error_nodes = NodesHash.new</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> erased_nodes = NodesHash.new</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> responses.each do |response|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> node = Node.new('uid' =&gt; response.results[:sender])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> if response.results[:statuscode] != 0</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line81">81</a> node['error'] = &quot;RPC agent 'erase_node' failed. Result: #{response.results.inspect}&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line82">82</a> error_nodes &lt;&lt; node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> elsif not response.results[:data][:rebooted]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> node['error'] = &quot;RPC method 'erase_node' failed with message: #{response.results[:data][:error_msg]}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> error_nodes &lt;&lt; node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> erased_nodes &lt;&lt; node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> [erased_nodes, error_nodes, inaccessible_nodes]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> def retry_remove_nodes(error_nodes, erased_nodes, retries=3, interval=1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> retries.times do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> retried_erased_nodes = remove_nodes(error_nodes)[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line96">96</a> retried_erased_nodes.each do |uid, node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> error_nodes.delete uid</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> erased_nodes &lt;&lt; node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> return if error_nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> sleep(interval) if interval &gt; 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line106">106</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>

View File

@ -1,827 +0,0 @@
<!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/orchestrator.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/orchestrator.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-orchestrator_rb.html">lib/astute/orchestrator.rb</a></td>
<td class='right_align'><tt>256</tt></td>
<td class='right_align'><tt>141</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>90.23%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:90px"></div>
<div class="uncovered" style="width:10px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>82.27%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:82px"></div>
<div class="uncovered" style="width:18px"></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="marked">
<td><pre><a name="line16">16</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line17">17</a> class Orchestrator</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> def initialize(deploy_engine=nil, log_parsing=false)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> @deploy_engine = deploy_engine || Astute::DeploymentEngine::NailyFact</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> @log_parser = log_parsing ? LogParser::ParseDeployLogs.new : LogParser::NoParsing.new</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line21">21</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> def node_type(reporter, task_id, nodes, timeout=nil)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> context = Context.new(task_id, reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> uids = nodes.map {|n| n['uid']}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> systemtype = MClient.new(context, &quot;systemtype&quot;, uids, check_result=false, timeout)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> systems = systemtype.get_type</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> systems.map do |n|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line29">29</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> 'uid' =&gt; n.results[:sender],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> 'node_type' =&gt; n.results[:data][:node_type].chomp</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> def deploy(up_reporter, task_id, nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> raise &quot;Nodes to deploy are not provided!&quot; if nodes.empty?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> # Following line fixes issues with uids: it should always be string</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> nodes.map { |x| x['uid'] = x['uid'].to_s } # NOTE: perform that on environment['nodes'] initialization</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> proxy_reporter = ProxyReporter.new(up_reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> context = Context.new(task_id, proxy_reporter, @log_parser)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> deploy_engine_instance = @deploy_engine.new(context)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> Astute.logger.info &quot;Using #{deploy_engine_instance.class} for deployment.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> @log_parser.prepare(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> rescue Exception =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line47">47</a> Astute.logger.warn &quot;Some error occurred when prepare LogParser: #{e.message}, trace: #{e.backtrace.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line48">48</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> deploy_engine_instance.deploy(nodes, attrs)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> return SUCCESS</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> def fast_provision(reporter, engine_attrs, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> raise &quot;Nodes to provision are not provided!&quot; if nodes.empty?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> engine = create_engine(engine_attrs, reporter)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> reboot_events = reboot_nodes(engine, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> failed_nodes = check_reboot_nodes(engine, reboot_events)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> rescue RuntimeError =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line63">63</a> Astute.logger.error(&quot;Error occured while provisioning: #{e.inspect}&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line64">64</a> reporter.report({</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> 'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> 'error' =&gt; 'Cobbler error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> 'progress' =&gt; 100</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> })</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line69">69</a> raise StopIteration</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> ensure</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> engine.sync</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> if failed_nodes.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> report_result({}, reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> return SUCCESS</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> Astute.logger.error(&quot;Nodes failed to reboot: #{failed_nodes.inspect}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> reporter.report({</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> 'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> 'error' =&gt; &quot;Nodes failed to reboot: #{failed_nodes.inspect}&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> 'progress' =&gt; 100</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> })</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> raise StopIteration</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> def provision(reporter, task_id, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> raise &quot;Nodes to provision are not provided!&quot; if nodes.empty?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> # Following line fixes issues with uids: it should always be string</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> nodes.map { |x| x['uid'] = x['uid'].to_s } # NOTE: perform that on environment['nodes'] initialization</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> nodes_uids = nodes.map { |n| n['uid'] }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line96">96</a> provisionLogParser = LogParser::ParseProvisionLogs.new</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> proxy_reporter = ProxyReporter.new(reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> sleep_not_greater_than(10) do # Wait while nodes going to reboot</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> Astute.logger.info &quot;Starting OS provisioning for nodes: #{nodes_uids.join(',')}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> provisionLogParser.prepare(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> rescue =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line103">103</a> Astute.logger.warn &quot;Some error occurred when prepare LogParser: #{e.message}, trace: #{e.backtrace.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> nodes_not_booted = nodes_uids.clone</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> Timeout.timeout(Astute.config.PROVISIONING_TIMEOUT) do # Timeout for booting target OS</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> catch :done do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> while true</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line111">111</a> sleep_not_greater_than(5) do </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> types = node_type(proxy_reporter, task_id, nodes, 2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> types.each { |t| Astute.logger.debug(&quot;Got node types: uid=#{t['uid']} type=#{t['node_type']}&quot;) }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> Astute.logger.debug(&quot;Not target nodes will be rejected&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> target_uids = types.reject{|n| n['node_type'] != 'target'}.map{|n| n['uid']}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> nodes_not_booted -= types.map { |n| n['uid'] }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> Astute.logger.debug &quot;Not provisioned: #{nodes_not_booted.join(',')}, got target OSes: #{target_uids.join(',')}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line119">119</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> if nodes.length == target_uids.length</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> Astute.logger.info &quot;All nodes #{target_uids.join(',')} are provisioned.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line122">122</a> throw :done</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line124">124</a> Astute.logger.debug(&quot;Nodes list length is not equal to target nodes list length: #{nodes.length} != #{target_uids.length}&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line126">126</a> </pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line127">127</a> report_about_progress(proxy_reporter, provisionLogParser, nodes_uids, target_uids, nodes) </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> end</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> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line131">131</a> # We are here if jumped by throw from while cycle </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> rescue Timeout::Error</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> msg = &quot;Timeout of provisioning is exceeded.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> Astute.logger.error msg</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> error_nodes = nodes_not_booted.map { |n| {'uid' =&gt; n,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> 'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> 'error_msg' =&gt; msg,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line139">139</a> 'progress' =&gt; 100,</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line140">140</a> 'error_type' =&gt; 'provision'} }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line141">141</a> proxy_reporter.report({'status' =&gt; 'error', 'error' =&gt; msg, 'nodes' =&gt; error_nodes})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> return FAIL</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line143">143</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line145">145</a> nodes_progress = nodes.map do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line146">146</a> {'uid' =&gt; n['uid'], 'progress' =&gt; 100, 'status' =&gt; 'provisioned'}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line148">148</a> proxy_reporter.report({'nodes' =&gt; nodes_progress})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> return SUCCESS</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line151">151</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> def remove_nodes(reporter, task_id, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line154">154</a> NodesRemover.new(Context.new(task_id, reporter), nodes).remove</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line157">157</a> def verify_networks(reporter, task_id, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line158">158</a> Network.check_network(Context.new(task_id, reporter), nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line159">159</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line161">161</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line163">163</a> def report_result(result, reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> default_result = {'status' =&gt; 'ready', 'progress' =&gt; 100}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line165">165</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> result = {} unless result.instance_of?(Hash)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> status = default_result.merge(result)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> reporter.report(status)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line171">171</a> def sleep_not_greater_than(sleep_time, &amp;block)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line172">172</a> time = Time.now.to_f</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line173">173</a> block.call</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line174">174</a> time = time + sleep_time - Time.now.to_f</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line175">175</a> sleep (time) if time &gt; 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line177">177</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> def create_engine(engine_attrs, reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line180">180</a> Astute.logger.info(&quot;Trying to instantiate cobbler engine: #{engine_attrs.inspect}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line181">181</a> Astute::Provision::Cobbler.new(engine_attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> rescue</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line183">183</a> Astute.logger.error(&quot;Error occured during cobbler initializing&quot;)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line184">184</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line185">185</a> reporter.report({</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line186">186</a> 'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line187">187</a> 'error' =&gt; 'Cobbler can not be initialized',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line188">188</a> 'progress' =&gt; 100</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line189">189</a> })</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line190">190</a> raise StopIteration</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line191">191</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line192">192</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line193">193</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line194">194</a> def reboot_nodes(engine, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line195">195</a> reboot_events = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line196">196</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line197">197</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line198">198</a> Astute.logger.info(&quot;Adding #{node['name']} into cobbler&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> engine.item_from_hash('system', node['name'], node,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line200">200</a> :item_preremove =&gt; true)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line201">201</a> rescue RuntimeError =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line202">202</a> Astute.logger.error(&quot;Error occured while adding system #{node['name']} to cobbler&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line203">203</a> raise e</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line204">204</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line205">205</a> Astute.logger.debug(&quot;Trying to reboot node: #{node['name']}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line206">206</a> reboot_events[node['name']] = engine.power_reboot(node['name'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line207">207</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line208">208</a> reboot_events</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line209">209</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line210">210</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> def check_reboot_nodes(engine, reboot_events)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line212">212</a> begin</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line213">213</a> Astute.logger.debug(&quot;Waiting for reboot to be complete: nodes: #{reboot_events.keys}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line214">214</a> failed_nodes = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line215">215</a> Timeout::timeout(Astute.config.REBOOT_TIMEOUT) do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line216">216</a> while not reboot_events.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line217">217</a> reboot_events.each do |node_name, event_id|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line218">218</a> event_status = engine.event_status(event_id)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line219">219</a> Astute.logger.debug(&quot;Reboot task status: node: #{node_name} status: #{event_status}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line220">220</a> if event_status[2] =~ /^failed$/</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line221">221</a> Astute.logger.error(&quot;Error occured while trying to reboot: #{node_name}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line222">222</a> reboot_events.delete(node_name)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line223">223</a> failed_nodes &lt;&lt; node_name</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line224">224</a> elsif event_status[2] =~ /^complete$/</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line225">225</a> Astute.logger.debug(&quot;Successfully rebooted: #{node_name}&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line226">226</a> reboot_events.delete(node_name)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line227">227</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line228">228</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line229">229</a> sleep(5)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line230">230</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line231">231</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line232">232</a> rescue Timeout::Error =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line233">233</a> Astute.logger.debug(&quot;Reboot timeout: reboot tasks not completed for nodes #{reboot_events.keys}&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line234">234</a> raise e</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line235">235</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line236">236</a> failed_nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line237">237</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line238">238</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line239">239</a> def report_about_progress(reporter, provisionLogParser, nodes_uids, target_uids, nodes)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line240">240</a> begin</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line241">241</a> nodes_progress = provisionLogParser.progress_calculate(nodes_uids, nodes)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line242">242</a> nodes_progress.each do |n|</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line243">243</a> if target_uids.include?(n['uid'])</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line244">244</a> n['progress'] = 100</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line245">245</a> n['status'] = 'provisioned'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line246">246</a> else</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line247">247</a> n['status'] = 'provisioning'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line248">248</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line249">249</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line250">250</a> reporter.report({'nodes' =&gt; nodes_progress})</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line251">251</a> rescue =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line252">252</a> Astute.logger.warn &quot;Some error occurred when parse logs for nodes progress: #{e.message}, trace: #{e.backtrace.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line253">253</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line254">254</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line255">255</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line256">256</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line257">257</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>

View File

@ -1,569 +0,0 @@
<!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/puppetd.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/puppetd.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-puppetd_rb.html">lib/astute/puppetd.rb</a></td>
<td class='right_align'><tt>170</tt></td>
<td class='right_align'><tt>86</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>95.88%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:96px"></div>
<div class="uncovered" style="width:4px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>91.86%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:92px"></div>
<div class="uncovered" style="width:8px"></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="marked">
<td><pre><a name="line17">17</a> require 'json'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'timeout'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> module PuppetdDeployer</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> # As I (Andrey Danin) understand, Puppet agent goes through these steps:</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> # * Puppetd has 'stopped' state.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> # * We run it as a run_once, and puppetd goes to 'idling' state - it trying to</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> # retrieve catalog.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> # * If it can't retrieve catalog, it goes back to 'stopped' state without</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> # any update of last_run_summary file.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> # * If puppetd retrieve catalog, it goes to 'running' state, which means</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line29">29</a> # it appying catalog to system.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> # * When puppetd finished catalog run, it updates last_run_summary file</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> # but stays in 'running' state for a while.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> # * After puppetd finished all internal jobs connected with finished catalog,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> # it goes to 'idling' state.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> # * After a short time it goes to 'stopped' state because we ran it as a run_once.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> # Runs puppetd.runonce only if puppet is stopped on the host at the time</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> # If it isn't stopped, we wait a bit and try again.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> # Returns list of nodes uids which appear to be with hung puppet.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> def self.puppetd_runonce(puppetd, uids)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> started = Time.now.to_i</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> while Time.now.to_i - started &lt; Astute.config.PUPPET_FADE_TIMEOUT</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> puppetd.discover(:nodes =&gt; uids)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> last_run = puppetd.last_run_summary</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> running_uids = last_run.select {|x| x.results[:data][:status] != 'stopped'}.map {|n| n.results[:sender]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> stopped_uids = uids - running_uids</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> if stopped_uids.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> puppetd.discover(:nodes =&gt; stopped_uids)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> puppetd.runonce</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> uids = running_uids</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> break if uids.empty?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> sleep Astute.config.PUPPET_FADE_INTERVAL</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> Astute.logger.debug &quot;puppetd_runonce completed within #{Time.now.to_i - started} seconds.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> Astute.logger.debug &quot;Following nodes have puppet hung: '#{running_uids.join(',')}'&quot; if running_uids.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> running_uids</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> end</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> def self.calc_nodes_status(last_run, prev_run)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> # Finished are those which are not in running state,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> # and changed their last_run time, which is changed after application of catalog,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> # at the time of updating last_run_summary file. At that particular time puppet is</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> # still running, and will finish in a couple of seconds.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> # If Puppet had crashed before it got a catalog (e.g. certificate problems),</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> # it didn't update last_run_summary file and switched to 'stopped' state.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> stopped = last_run.select {|x| x.results[:data][:status] == 'stopped'}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> # Select all finished nodes which not failed and changed last_run time.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> succeed_nodes = stopped.select { |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> prev_n = prev_run.find{|ps| ps.results[:sender] == n.results[:sender] }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> n.results[:data][:resources]['failed'].to_i == 0 &amp;&amp;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> n.results[:data][:resources]['failed_to_restart'].to_i == 0 &amp;&amp;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> n.results[:data][:time]['last_run'] != (prev_n &amp;&amp; prev_n.results[:data][:time]['last_run'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> }.map{|x| x.results[:sender] }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> stopped_nodes = stopped.map {|x| x.results[:sender]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> error_nodes = stopped_nodes - succeed_nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> # Running are all which didn't appear in finished</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line82">82</a> running_nodes = last_run.map {|n| n.results[:sender]} - stopped_nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> nodes_to_check = running_nodes + succeed_nodes + error_nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> unless nodes_to_check.size == last_run.size</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line86">86</a> raise &quot;Shoud never happen. Internal error in nodes statuses calculation. Statuses calculated for: #{nodes_to_check.inspect},&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line87">87</a> &quot;nodes passed to check statuses of: #{last_run.map {|n| n.results[:sender]}}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> {'succeed' =&gt; succeed_nodes, 'error' =&gt; error_nodes, 'running' =&gt; running_nodes}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> public</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> def self.deploy(ctx, nodes, retries=2, change_node_status=true)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> # TODO: can we hide retries, ignore_failure into @ctx ?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> uids = nodes.map {|n| n['uid']}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> # Keep info about retries for each node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> node_retries = {}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> uids.each {|x| node_retries.merge!({x =&gt; retries}) }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> Astute.logger.debug &quot;Waiting for puppet to finish deployment on all nodes (timeout = #{Astute.config.PUPPET_TIMEOUT} sec)...&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> time_before = Time.now</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> Timeout::timeout(Astute.config.PUPPET_TIMEOUT) do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> puppetd = MClient.new(ctx, &quot;puppetd&quot;, uids)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> puppetd.on_respond_timeout do |uids|</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line104">104</a> ctx.reporter.report('nodes' =&gt; uids.map{|uid| {'uid' =&gt; uid, 'status' =&gt; 'error', 'error_type' =&gt; 'deploy'}})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> end if change_node_status</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> prev_summary = puppetd.last_run_summary</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> puppetd_runonce(puppetd, uids)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> nodes_to_check = uids</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> last_run = puppetd.last_run_summary</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> while nodes_to_check.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line111">111</a> calc_nodes = calc_nodes_status(last_run, prev_summary)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> Astute.logger.debug &quot;Nodes statuses: #{calc_nodes.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> # At least we will report about successfully deployed nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> nodes_to_report = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> nodes_to_report.concat(calc_nodes['succeed'].map { |n| {'uid' =&gt; n, 'status' =&gt; 'ready'} }) if change_node_status</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line117">117</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> # Process retries</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> nodes_to_retry = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> calc_nodes['error'].each do |uid|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> if node_retries[uid] &gt; 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line122">122</a> node_retries[uid] -= 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line123">123</a> Astute.logger.debug &quot;Puppet on node #{uid.inspect} will be restarted. &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> &quot;#{node_retries[uid]} retries remained.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> nodes_to_retry &lt;&lt; uid</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line126">126</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line127">127</a> Astute.logger.debug &quot;Node #{uid.inspect} has failed to deploy. There is no more retries for puppet run.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line128">128</a> nodes_to_report &lt;&lt; {'uid' =&gt; uid, 'status' =&gt; 'error', 'error_type' =&gt; 'deploy'} if change_node_status</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> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> if nodes_to_retry.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line132">132</a> Astute.logger.info &quot;Retrying to run puppet for following error nodes: #{nodes_to_retry.join(',')}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line133">133</a> puppetd_runonce(puppetd, nodes_to_retry)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> # We need this magic with prev_summary to reflect new puppetd run statuses..</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> prev_summary.delete_if { |x| nodes_to_retry.include?(x.results[:sender]) }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> prev_summary += last_run.select { |x| nodes_to_retry.include?(x.results[:sender]) }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> # /end of processing retries</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line139">139</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line140">140</a> if calc_nodes['running'].any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line141">141</a> begin</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line142">142</a> # Pass nodes because logs calculation needs IP address of node, not just uid</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> nodes_progress = ctx.deploy_log_parser.progress_calculate(calc_nodes['running'], nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line144">144</a> if nodes_progress.any?</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line145">145</a> Astute.logger.debug &quot;Got progress for nodes: #{nodes_progress.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> # Nodes with progress are running, so they are not included in nodes_to_report yet</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line147">147</a> nodes_progress.map! {|x| x.merge!({'status' =&gt; 'deploying'})}</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line148">148</a> nodes_to_report += nodes_progress</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line149">149</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> rescue Exception =&gt; e</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line151">151</a> Astute.logger.warn &quot;Some error occurred when parse logs for nodes progress: #{e.message}, &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> &quot;trace: #{e.backtrace.inspect}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line153">153</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line155">155</a> ctx.reporter.report('nodes' =&gt; nodes_to_report) if nodes_to_report.any?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> # we will iterate only over running nodes and those that we restart deployment for</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line158">158</a> nodes_to_check = calc_nodes['running'] + nodes_to_retry</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> break if nodes_to_check.empty?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line161">161</a> sleep Astute.config.PUPPET_DEPLOY_INTERVAL</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line162">162</a> puppetd.discover(:nodes =&gt; nodes_to_check)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line163">163</a> last_run = puppetd.last_run_summary</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line164">164</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line165">165</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> time_spent = Time.now - time_before</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> Astute.logger.info &quot;#{ctx.task_id}: Spent #{time_spent} seconds on puppet run &quot;\</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> &quot;for following nodes(uids): #{nodes.map {|n| n['uid']}.join(',')}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line171">171</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>

View File

@ -1,431 +0,0 @@
<!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/reporter.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/reporter.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-reporter_rb.html">lib/astute/reporter.rb</a></td>
<td class='right_align'><tt>124</tt></td>
<td class='right_align'><tt>57</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>99.19%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:99px"></div>
<div class="uncovered" style="width:1px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>98.25%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:98px"></div>
<div class="uncovered" style="width:2px"></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="marked">
<td><pre><a name="line17">17</a> require 'set'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> STATES = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> 'offline' =&gt; 0,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line21">21</a> 'discover' =&gt; 10,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line22">22</a> 'provisioning' =&gt; 30,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> 'provisioned' =&gt; 40,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> 'deploying' =&gt; 50,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line25">25</a> 'ready' =&gt; 60,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> 'error' =&gt; 70</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line28">28</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> class ProxyReporter</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> def initialize(up_reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> @up_reporter = up_reporter</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> @nodes = []</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> def report(data)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> nodes_to_report = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> nodes = (data['nodes'] or [])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> node = node_validate(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> nodes_to_report &lt;&lt; node if node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> # Let's report only if nodes updated</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> if nodes_to_report.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> data['nodes'] = nodes_to_report</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> @up_reporter.report(data)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> # Update nodes attributes in @nodes.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> nodes_to_report.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> saved_node = @nodes.select {|x| x['uid'] == node['uid']}.first # NOTE: use nodes hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> if saved_node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> node.each {|k, v| saved_node[k] = v}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> @nodes &lt;&lt; node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> private</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> def node_validate(node)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> # Validate basic correctness of attributes.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> err = []</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> if node['status'].nil?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> err &lt;&lt; &quot;progress value provided, but no status&quot; unless node['progress'].nil?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> err &lt;&lt; &quot;Status provided #{node['status']} is not supported&quot; if STATES[node['status']].nil?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> unless node['uid']</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line70">70</a> err &lt;&lt; &quot;Node uid is not provided&quot;</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> if err.any?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> msg = &quot;Validation of node: #{node.inspect} for report failed: #{err.join('; ')}.&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> Astute.logger.error(msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> raise msg</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> # Validate progress field.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> unless node['progress'].nil?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> if node['progress'] &gt; 100</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> Astute.logger.warn(&quot;Passed report for node with progress &gt; 100: &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> &quot;#{node.inspect}. Adjusting progress to 100.&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> node['progress'] = 100</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> if node['progress'] &lt; 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> Astute.logger.warn(&quot;Passed report for node with progress &lt; 0: &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> &quot;#{node.inspect}. Adjusting progress to 0.&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> node['progress'] = 0</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> if not node['status'].nil? and ['provisioned', 'ready'].include?(node['status']) and node['progress'] != 100</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> Astute.logger.warn(&quot;In #{node['status']} state node should have progress 100, &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> &quot;but node passed: #{node.inspect}. Setting it to 100&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> node['progress'] = 100</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> # Comparison with previous state.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> saved_node = @nodes.select {|x| x['uid'] == node['uid']}.first</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> unless saved_node.nil?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> saved_status = (STATES[saved_node['status']] or 0)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> node_status = (STATES[node['status']] or saved_status)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> saved_progress = (saved_node['progress'] or 0)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line103">103</a> node_progress = (node['progress'] or saved_progress)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> if node_status &lt; saved_status</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> Astute.logger.warn(&quot;Attempt to assign lower status detected: &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> &quot;Status was: #{saved_status}, attempted to &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> &quot;assign: #{node_status}. Skipping this node (id=#{node['uid']})&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> return</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line111">111</a> if node_progress &lt; saved_progress and node_status == saved_status</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> Astute.logger.warn(&quot;Attempt to assign lesser progress detected: &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> &quot;Progress was: #{saved_progress}, attempted to &quot;\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> &quot;assign: #{node_progress}. Skipping this node (id=#{node['uid']})&quot;)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> return</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line116">116</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line117">117</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> # We need to update node here only if progress is greater, or status changed</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> return if node.select{|k, v| not saved_node[k].eql?(v)}.empty?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> end</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> node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</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>

View File

@ -1,185 +0,0 @@
<!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/rpuppet.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/rpuppet.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-rpuppet_rb.html">lib/astute/rpuppet.rb</a></td>
<td class='right_align'><tt>42</tt></td>
<td class='right_align'><tt>17</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>71.43%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:71px"></div>
<div class="uncovered" style="width:29px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>29.41%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:29px"></div>
<div class="uncovered" style="width:71px"></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="marked">
<td><pre><a name="line17">17</a> require 'json'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'timeout'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line19">19</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> module RpuppetDeployer</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def self.rpuppet_deploy(ctx, nodes, parameters, classes, env=&quot;production&quot;)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line23">23</a> if nodes.empty?</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line24">24</a> Astute.logger.info &quot;#{ctx.task_id}: Nodes to deploy are not provided. Do nothing.&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line25">25</a> return false</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line27">27</a> uids = nodes.map {|n| n['uid']}</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line28">28</a> data = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line29">29</a> &quot;parameters&quot; =&gt; parameters,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> &quot;classes&quot; =&gt; classes,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> &quot;environment&quot; =&gt; env</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> }</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line33">33</a> Astute.logger.debug &quot;Waiting for puppet to finish deployment on all nodes (timeout = #{Astute.config.PUPPET_TIMEOUT} sec)...&quot;</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line34">34</a> time_before = Time.now</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line35">35</a> Timeout::timeout(Astute.config.PUPPET_TIMEOUT) do</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line36">36</a> rpuppet = MClient.new(ctx, &quot;rpuppet&quot;, uids)</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line37">37</a> rpuppet.run(:data =&gt; data.to_json)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> end</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line39">39</a> time_spent = Time.now - time_before</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line40">40</a> Astute.logger.info &quot;#{ctx.task_id}: Spent #{time_spent} seconds on puppet run for following nodes(uids): #{nodes.map {|n| n['uid']}.join(',')}&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</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>

View File

@ -1,128 +0,0 @@
<!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/ruby_removed_functions.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/ruby_removed_functions.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-ruby_removed_functions_rb.html">lib/astute/ruby_removed_functions.rb</a></td>
<td class='right_align'><tt>23</tt></td>
<td class='right_align'><tt>6</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> class Date</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> def self.day_fraction_to_time(fr)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> ss, fr = fr.divmod(Rational(1, 86400))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> h, ss = ss.divmod(3600)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> min, s = ss.divmod(60)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> return h, min, s, fr</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</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>

View File

@ -1,248 +0,0 @@
<!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.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.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_rb.html">lib/astute.rb</a></td>
<td class='right_align'><tt>63</tt></td>
<td class='right_align'><tt>37</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>93.65%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:94px"></div>
<div class="uncovered" style="width:6px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>89.19%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:89px"></div>
<div class="uncovered" style="width:11px"></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="marked">
<td><pre><a name="line16">16</a> require 'astute/ruby_removed_functions'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line17">17</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line18">18</a> require 'json'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> require 'logger'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> require 'astute/config'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> require 'astute/logparser'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> require 'astute/orchestrator'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> require 'astute/metadata'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> require 'astute/deployment_engine'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> require 'astute/network'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> require 'astute/puppetd'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> require 'astute/rpuppet'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> require 'astute/deployment_engine/simple_puppet'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> require 'astute/deployment_engine/nailyfact'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> require 'astute/cobbler'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> module Astute</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> autoload 'Context', 'astute/context'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> autoload 'MClient', 'astute/mclient'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> autoload 'ProxyReporter', 'astute/reporter'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> autoload 'NodesRemover', 'astute/nodes_remover'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> autoload 'Node', 'astute/node'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> autoload 'NodesHash', 'astute/node'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> LogParser.autoload :ParseDeployLogs, 'astute/logparser/deployment'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> LogParser.autoload :ParseProvisionLogs, 'astute/logparser/provision'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line42">42</a> LogParser.autoload :Patterns, 'astute/logparser/parser_patterns'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> SUCCESS = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> FAIL = 1</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> def self.logger</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> unless @logger</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line49">49</a> @logger = Logger.new('/var/log/astute.log')</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line50">50</a> @logger.formatter = proc do |severity, datetime, progname, msg|</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line51">51</a> severity_map = {'DEBUG' =&gt; 'debug', 'INFO' =&gt; 'info', 'WARN' =&gt; 'warning', 'ERROR' =&gt; 'err', 'FATAL' =&gt; 'crit'}</pre></td>
</tr>
<tr class="uncovered">
<td><pre><a name="line52">52</a> &quot;#{datetime.strftime(&quot;%Y-%m-%dT%H:%M:%S&quot;)} #{severity_map[severity]}: [#{Process.pid}] #{msg}\n&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> @logger</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> def self.logger=(logger)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> @logger = logger</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> config_file = '/opt/astute/astute.conf'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> Astute.config.update(YAML.load(File.read(config_file))) if File.exists?(config_file)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</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>

View File

@ -1,893 +0,0 @@
<!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>spec/unit/logparser_spec.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>spec/unit/logparser_spec.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="spec-unit-logparser_spec_rb.html">spec/unit/logparser_spec.rb</a></td>
<td class='right_align'><tt>278</tt></td>
<td class='right_align'><tt>153</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> include Astute</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> describe LogParser do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> def get_statistics_variables(progress_table)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> # Calculate some statistics variables: expectancy, standart deviation and</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> # correlation coefficient between real and ideal progress calculation.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> total_time = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> real_expectancy = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> real_sqr_expectancy = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> prev_event_date = nil</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> progress_table.each do |el|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> date = el[:date]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> prev_event_date = date unless prev_event_date</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> progress = el[:progress].to_f</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> period = date - prev_event_date</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> hours, mins, secs, frac = Date::day_fraction_to_time(period)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> period_in_sec = hours * 60 * 60 + mins * 60 + secs</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> total_time += period_in_sec</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> real_expectancy += period_in_sec * progress</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> real_sqr_expectancy += period_in_sec * progress ** 2</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> el[:time_delta] = period_in_sec</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> prev_event_date = date</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> # Calculate standart deviation for real progress distibution.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> real_expectancy = real_expectancy.to_f / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> real_sqr_expectancy = real_sqr_expectancy.to_f / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> real_standart_deviation = Math.sqrt(real_sqr_expectancy - real_expectancy ** 2)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line48">48</a> # Calculate PCC (correlation coefficient).</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> ideal_sqr_expectancy = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> ideal_expectancy = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> t = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> ideal_delta = 100.0 / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> mixed_expectancy = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> progress_table.each do |el|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> t += el[:time_delta]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> ideal_progress = t * ideal_delta</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> ideal_expectancy += ideal_progress * el[:time_delta]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> ideal_sqr_expectancy += ideal_progress ** 2 * el[:time_delta]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> el[:ideal_progress] = ideal_progress</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> mixed_expectancy += el[:progress] * ideal_progress * el[:time_delta]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> ideal_expectancy = ideal_expectancy / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> ideal_sqr_expectancy = ideal_sqr_expectancy / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> mixed_expectancy = mixed_expectancy / total_time</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> ideal_standart_deviation = Math.sqrt(ideal_sqr_expectancy - ideal_expectancy ** 2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> covariance = mixed_expectancy - ideal_expectancy * real_expectancy</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> pcc = covariance / (ideal_standart_deviation * real_standart_deviation)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> statistics = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> 'real_expectancy' =&gt; real_expectancy,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> 'real_sqr_expectancy' =&gt; real_sqr_expectancy,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> 'real_standart_deviation' =&gt; real_standart_deviation,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> 'ideal_expectancy' =&gt; ideal_expectancy,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> 'ideal_sqr_expectancy' =&gt; ideal_sqr_expectancy,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> 'ideal_standart_deviation' =&gt; ideal_standart_deviation,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> 'mixed_expectancy' =&gt; mixed_expectancy,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> 'covariance' =&gt; covariance,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> 'pcc' =&gt; pcc,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> 'total_time' =&gt; total_time,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> }</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> return statistics</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> def get_next_line(fo, date_regexp, date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> until fo.eof?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> line = fo.readline</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> date_string = line.match(date_regexp)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> if date_string</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> date = DateTime.strptime(date_string[0], date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> return line, date</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> def get_next_lines_by_date(fo, now, date_regexp, date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> lines = ''</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> until fo.eof?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> pos = fo.pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> line, date = get_next_line(fo, date_regexp, date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> if date &lt;= now</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line103">103</a> lines += line</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> fo.pos = pos</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> return lines</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> return lines</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> context &quot;Correlation coeff. (PCC) of Provisioning progress bar calculation&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> def provision_parser_wrapper(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> uids = [node['uid']]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> nodes = [node]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> time_delta = 5.0/24/60/60</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> log_delay = 6*time_delta</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> deploy_parser = Astute::LogParser::ParseProvisionLogs.new</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> pattern_spec = deploy_parser.pattern_spec</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> date_regexp = '^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line122">122</a> date_format = '%Y-%m-%dT%H:%M:%S'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line124">124</a> Dir.mktmpdir do |dir|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</a> # Create temp log files and structures.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> pattern_spec['path_prefix'] = &quot;#{dir}/&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line127">127</a> path = &quot;#{pattern_spec['path_prefix']}#{node['fqdn']}/#{pattern_spec['filename']}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line128">128</a> Dir.mkdir(File.dirname(File.dirname(path)))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> Dir.mkdir(File.dirname(path))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> node['file'] = File.open(path, 'w')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> src_filename = File.join(File.dirname(__FILE__), &quot;..&quot;, &quot;example-logs&quot;, node['src_filename'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line132">132</a> node['src'] = File.open(src_filename)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line133">133</a> line, date = get_next_line(node['src'], date_regexp, date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> node['src'].pos = 0</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> node['now'] = date - log_delay</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> node['progress_table'] ||= []</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> # End 'while' cycle if reach EOF at all src files.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> until node['src'].eof?</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> # Copy logs line by line from example logfile to tempfile and collect progress for each step.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line141">141</a> lines, date = get_next_lines_by_date(node['src'], node['now'], date_regexp, date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line142">142</a> node['file'].write(lines)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> node['file'].flush</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line144">144</a> node['last_lines'] = lines</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line145">145</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line146">146</a> DateTime.stubs(:now).returns(node['now'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line147">147</a> node_progress = deploy_parser.progress_calculate(uids, nodes)[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line148">148</a> node['progress_table'] &lt;&lt; {:date =&gt; node['now'], :progress =&gt; node_progress['progress']}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> node['now'] += time_delta</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line151">151</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line152">152</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> node['statistics'] = get_statistics_variables(node['progress_table'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> # Clear temp files.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line156">156</a> node['file'].close</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line157">157</a> File.unlink(node['file'].path)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line158">158</a> Dir.unlink(File.dirname(node['file'].path))</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line159">159</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line161">161</a> return node</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> it &quot;should be greather than 0.96&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line165">165</a> node = {'uid' =&gt; '1', 'ip' =&gt; '1.0.0.1', 'fqdn' =&gt; 'slave-1.domain.tld', 'role' =&gt; 'controller', 'src_filename' =&gt; 'anaconda.log_',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line166">166</a> 'meta' =&gt; { 'disks' =&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line167">167</a> [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line168">168</a> {'name' =&gt; 'flash drive', 'removable' =&gt; true, 'size' =&gt; 1000},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> {'name' =&gt; 'sda', 'removable'=&gt; false, 'size' =&gt; 32*1000*1000*1000},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line171">171</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line172">172</a> }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line173">173</a> calculated_node = provision_parser_wrapper(node)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line174">174</a> calculated_node['statistics']['pcc'].should &gt; 0.96</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line175">175</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line177">177</a> it &quot;it must be updated at least 5 times&quot; do</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line178">178</a> # Otherwise progress bar has no meaning I guess...</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> pending('Not yet implemented')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line181">181</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line183">183</a> context &quot;Correlation coeff. (PCC) of Deploying progress bar calculation&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line184">184</a> def deployment_parser_wrapper(cluster_type, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line185">185</a> uids = nodes.map{|n| n['uid']}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line186">186</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line187">187</a> deploy_parser = Astute::LogParser::ParseDeployLogs.new(cluster_type)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line188">188</a> pattern_spec = deploy_parser.pattern_spec</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line189">189</a> date_regexp = '^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line190">190</a> date_format = '%Y-%m-%dT%H:%M:%S'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line191">191</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line192">192</a> Dir.mktmpdir do |dir|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line193">193</a> # Create temp log files and structures.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line194">194</a> pattern_spec['path_prefix'] = &quot;#{dir}/&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line195">195</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line196">196</a> path = &quot;#{pattern_spec['path_prefix']}#{node['fqdn']}/#{pattern_spec['filename']}&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line197">197</a> Dir.mkdir(File.dirname(path))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line198">198</a> node['file'] = File.open(path, 'w')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> src_filename = File.join(File.dirname(__FILE__), &quot;..&quot;, &quot;example-logs&quot;, node['src_filename'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> node['src'] = File.open(src_filename)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line201">201</a> node['progress_table'] ||= []</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line202">202</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line203">203</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line204">204</a> # End 'while' cycle if reach EOF at all src files.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line205">205</a> while nodes.index{|n| not n['src'].eof?}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line206">206</a> # Copy logs line by line from example logfile to tempfile and collect progress for each step.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line207">207</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line208">208</a> unless node['src'].eof?</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line209">209</a> line = node['src'].readline</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line210">210</a> node['file'].write(line)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> node['file'].flush</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line212">212</a> node['last_line'] = line</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line213">213</a> else</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line214">214</a> node['last_line'] = ''</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line215">215</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line216">216</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line217">217</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line218">218</a> nodes_progress = deploy_parser.progress_calculate(uids, nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line219">219</a> nodes_progress.each do |progress|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line220">220</a> node = nodes.at(nodes.index{|n| n['uid'] == progress['uid']})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line221">221</a> date_string = node['last_line'].match(date_regexp)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line222">222</a> if date_string</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line223">223</a> date = DateTime.strptime(date_string[0], date_format)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line224">224</a> node['progress_table'] &lt;&lt; {:date =&gt; date, :progress =&gt; progress['progress']}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line225">225</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line226">226</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line227">227</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line228">228</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line229">229</a> nodes.each do |node|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line230">230</a> node['statistics'] = get_statistics_variables(node['progress_table'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line231">231</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line232">232</a> # Clear temp files.</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line233">233</a> nodes.each do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line234">234</a> n['file'].close</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line235">235</a> File.unlink(n['file'].path)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line236">236</a> Dir.unlink(File.dirname(n['file'].path))</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line237">237</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line238">238</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line239">239</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line240">240</a> return nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line241">241</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line242">242</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line243">243</a> it &quot;should be greather than 0.85 for HA deployment&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line244">244</a> nodes = [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line245">245</a> {'uid' =&gt; '1', 'ip' =&gt; '1.0.0.1', 'fqdn' =&gt; 'slave-1.domain.tld', 'role' =&gt; 'controller', 'src_filename' =&gt; 'puppet-agent.log.ha.contr.2'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line246">246</a> {'uid' =&gt; '2', 'ip' =&gt; '1.0.0.2', 'fqdn' =&gt; 'slave-2.domain.tld', 'role' =&gt; 'compute', 'src_filename' =&gt; 'puppet-agent.log.ha.compute'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line247">247</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line248">248</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line249">249</a> calculated_nodes = deployment_parser_wrapper('ha', nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line250">250</a> calculated_nodes.each {|node| node['statistics']['pcc'].should &gt; 0.85}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line251">251</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line252">252</a> # For debug purposes.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line253">253</a> # print &quot;\n&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line254">254</a> # calculated_nodes.each do |node|</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line255">255</a> # print node['statistics'].inspect, &quot;\n&quot;, node['statistics']['pcc'], &quot;\n&quot;, node['progress_table'][-1][:progress], &quot;\n&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line256">256</a> # end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line257">257</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line258">258</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line259">259</a> it &quot;should be greather than 0.97 for singlenode deployment&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line260">260</a> nodes = [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line261">261</a> {'uid' =&gt; '1', 'ip' =&gt; '1.0.0.1', 'fqdn' =&gt; 'slave-1.domain.tld', 'role' =&gt; 'controller', 'src_filename' =&gt; 'puppet-agent.log.singlenode'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line262">262</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line263">263</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line264">264</a> calculated_nodes = deployment_parser_wrapper('singlenode', nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line265">265</a> calculated_nodes.each {|node| node['statistics']['pcc'].should &gt; 0.97}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line266">266</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line267">267</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line268">268</a> it &quot;should be greather than 0.94 for multinode deployment&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line269">269</a> nodes = [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line270">270</a> {'uid' =&gt; '1', 'ip' =&gt; '1.0.0.1', 'fqdn' =&gt; 'slave-1.domain.tld', 'role' =&gt; 'controller', 'src_filename' =&gt; 'puppet-agent.log.multi.contr'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line271">271</a> {'uid' =&gt; '2', 'ip' =&gt; '1.0.0.2', 'fqdn' =&gt; 'slave-2.domain.tld', 'role' =&gt; 'compute', 'src_filename' =&gt; 'puppet-agent.log.multi.compute'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line272">272</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line273">273</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line274">274</a> calculated_nodes = deployment_parser_wrapper('multinode', nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line275">275</a> calculated_nodes.each {|node| node['statistics']['pcc'].should &gt; 0.94}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line276">276</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line277">277</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line278">278</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line279">279</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>

View File

@ -1,344 +0,0 @@
<!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>spec/unit/mclient_spec.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>spec/unit/mclient_spec.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="spec-unit-mclient_spec_rb.html">spec/unit/mclient_spec.rb</a></td>
<td class='right_align'><tt>95</tt></td>
<td class='right_align'><tt>51</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> include Astute</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> describe MClient do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> include SpecHelpers</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> before(:each) do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> @ctx = mock('context')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @ctx.stubs(:task_id)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> @ctx.stubs(:reporter)</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> it &quot;should receive method call and process valid result correctly&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> nodes = [{'uid' =&gt; 1}, {'uid' =&gt; 2}, {'uid' =&gt; 3}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> mc_valid_result = mock_mc_result</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> rpcclient.expects(:echo).with(:msg =&gt; 'hello world').once.returns([mc_valid_result]*3)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> mclient = MClient.new(@ctx, &quot;faketest&quot;, nodes.map {|x| x['uid']})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> stats = mclient.echo(:msg =&gt; 'hello world')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> stats.should eql([mc_valid_result]*3)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> end</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> it &quot;should return even bad result if check_result=false&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> nodes = [{'uid' =&gt; 1}, {'uid' =&gt; 2}, {'uid' =&gt; 3}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> mc_valid_result = mock_mc_result</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> mc_error_result = mock_mc_result({:statuscode =&gt; 1, :sender =&gt; '2'})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> rpcclient.expects(:echo).with(:msg =&gt; 'hello world').once.\</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line49">49</a> returns([mc_valid_result, mc_error_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> mclient = MClient.new(@ctx, &quot;faketest&quot;, nodes.map {|x| x['uid']}, check_result=false)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> stats = mclient.echo(:msg =&gt; 'hello world')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> stats.should eql([mc_valid_result, mc_error_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> it &quot;should try to retry for non-responded nodes&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> nodes = [{'uid' =&gt; 1}, {'uid' =&gt; 2}, {'uid' =&gt; 3}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> rpcclient = mock('rpcclient') do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> stubs(:progress=)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> expects(:discover).with(:nodes =&gt; ['1','2','3'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> expects(:discover).with(:nodes =&gt; ['2','3'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> Astute::MClient.any_instance.stubs(:rpcclient).returns(rpcclient)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> mc_valid_result = mock_mc_result</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> mc_valid_result2 = mock_mc_result({:sender =&gt; '2'})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> rpcclient.stubs(:echo).returns([mc_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> returns([mc_valid_result2]).then</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> mclient = MClient.new(@ctx, &quot;faketest&quot;, nodes.map {|x| x['uid']})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> mclient.retries = 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> expect { mclient.echo(:msg =&gt; 'hello world') }.to raise_error(/MCollective agents '3' didn't respond./)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> it &quot;should raise error if agent returns statuscode != 0&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> nodes = [{'uid' =&gt; 1}, {'uid' =&gt; 2}, {'uid' =&gt; 3}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> rpcclient = mock('rpcclient') do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> stubs(:progress=)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> expects(:discover).with(:nodes =&gt; ['1','2','3'])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> expects(:discover).with(:nodes =&gt; ['2','3'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> Astute::MClient.any_instance.stubs(:rpcclient).returns(rpcclient)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> mc_valid_result = mock_mc_result</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> mc_failed_result = mock_mc_result({:sender =&gt; '2', :statuscode =&gt; 1})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> rpcclient.stubs(:echo).returns([mc_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> returns([mc_failed_result]).then</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line91">91</a> mclient = MClient.new(@ctx, &quot;faketest&quot;, nodes.map {|x| x['uid']})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> mclient.retries = 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> expect { mclient.echo(:msg =&gt; 'hello world') }.to \</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> raise_error(/MCollective agents '3' didn't respond. \n.* failed nodes: 2/)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</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>

View File

@ -1,917 +0,0 @@
<!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>spec/unit/nailyfact_deploy_spec.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>spec/unit/nailyfact_deploy_spec.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="spec-unit-nailyfact_deploy_spec_rb.html">spec/unit/nailyfact_deploy_spec.rb</a></td>
<td class='right_align'><tt>286</tt></td>
<td class='right_align'><tt>70</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> describe &quot;NailyFact DeploymentEngine&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> context &quot;When deploy is called, &quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> before(:each) do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @ctx = mock</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> @ctx.stubs(:task_id)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> @ctx.stubs(:deploy_log_parser).returns(Astute::LogParser::NoParsing.new)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> reporter = mock</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @ctx.stubs(:reporter).returns(reporter)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> reporter.stubs(:report)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> @deploy_engine = Astute::DeploymentEngine::NailyFact.new(@ctx)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> meta = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> 'interfaces' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> 'name' =&gt; 'eth1',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line33">33</a> }, {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line34">34</a> 'name' =&gt; 'eth0',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> @data = {&quot;args&quot; =&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> {&quot;attributes&quot; =&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> {&quot;storage_network_range&quot; =&gt; &quot;172.16.0.0/24&quot;, &quot;auto_assign_floating_ip&quot; =&gt; false,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line41">41</a> &quot;mysql&quot; =&gt; {&quot;root_password&quot; =&gt; &quot;Z2EqsZo5&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> &quot;keystone&quot; =&gt; {&quot;admin_token&quot; =&gt; &quot;5qKy0i63&quot;, &quot;db_password&quot; =&gt; &quot;HHQ86Rym&quot;, &quot;admin_tenant&quot; =&gt; &quot;admin&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> &quot;nova&quot; =&gt; {&quot;user_password&quot; =&gt; &quot;h8RY8SE7&quot;, &quot;db_password&quot; =&gt; &quot;Xl9I51Cb&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line44">44</a> &quot;glance&quot; =&gt; {&quot;user_password&quot; =&gt; &quot;nDlUxuJq&quot;, &quot;db_password&quot; =&gt; &quot;V050pQAn&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line45">45</a> &quot;rabbit&quot; =&gt; {&quot;user&quot; =&gt; &quot;nova&quot;, &quot;password&quot; =&gt; &quot;FLF3txKC&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> &quot;management_network_range&quot; =&gt; &quot;192.168.0.0/24&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line47">47</a> &quot;public_network_range&quot; =&gt; &quot;240.0.1.0/24&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line48">48</a> &quot;fixed_network_range&quot; =&gt; &quot;10.0.0.0/24&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line49">49</a> &quot;floating_network_range&quot; =&gt; &quot;240.0.0.0/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> &quot;task_uuid&quot; =&gt; &quot;19d99029-350a-4c9c-819c-1f294cf9e741&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line51">51</a> &quot;nodes&quot; =&gt; [{&quot;mac&quot; =&gt; &quot;52:54:00:0E:B8:F5&quot;, &quot;status&quot; =&gt; &quot;provisioning&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> &quot;uid&quot; =&gt; &quot;devnailgun.mirantis.com&quot;, &quot;error_type&quot; =&gt; nil,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> &quot;fqdn&quot; =&gt; &quot;devnailgun.mirantis.com&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> &quot;network_data&quot; =&gt; [{&quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.2/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> {&quot;gateway&quot; =&gt; &quot;240.0.1.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line59">59</a> &quot;name&quot; =&gt; &quot;public&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> &quot;brd&quot; =&gt; &quot;240.0.1.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> &quot;vlan&quot; =&gt; 101, &quot;ip&quot; =&gt; &quot;240.0.1.2/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> {&quot;name&quot; =&gt; &quot;floating&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 120},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> {&quot;name&quot; =&gt; &quot;fixed&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 103},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> {&quot;name&quot; =&gt; &quot;storage&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 104,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> &quot;ip&quot; =&gt; &quot;172.16.1.2/24&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> &quot;brd&quot; =&gt; &quot;172.16.1.255&quot;}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> &quot;id&quot; =&gt; 1,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> &quot;ip&quot; =&gt; &quot;10.20.0.200&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> &quot;role&quot; =&gt; &quot;controller&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> 'meta' =&gt; meta},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> {&quot;mac&quot; =&gt; &quot;52:54:00:50:91:DD&quot;, &quot;status&quot; =&gt; &quot;provisioning&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line72">72</a> &quot;uid&quot; =&gt; 2, &quot;error_type&quot; =&gt; nil,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line73">73</a> &quot;fqdn&quot; =&gt; &quot;slave-2.mirantis.com&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> &quot;network_data&quot; =&gt; [{&quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.3/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> {&quot;gateway&quot; =&gt; &quot;240.0.1.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line79">79</a> &quot;name&quot; =&gt; &quot;public&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> &quot;brd&quot; =&gt; &quot;240.0.1.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> &quot;vlan&quot; =&gt; 101, &quot;ip&quot; =&gt; &quot;240.0.1.3/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> {&quot;name&quot; =&gt; &quot;floating&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 120},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> {&quot;name&quot; =&gt; &quot;fixed&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 103},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> {&quot;name&quot; =&gt; &quot;storage&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 104,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line85">85</a> &quot;ip&quot; =&gt; &quot;172.16.1.3/24&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> &quot;brd&quot; =&gt; &quot;172.16.1.255&quot;}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> &quot;id&quot; =&gt; 2,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> &quot;ip&quot; =&gt; &quot;10.20.0.221&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> &quot;role&quot; =&gt; &quot;compute&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> 'meta' =&gt; meta},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> {&quot;mac&quot; =&gt; &quot;52:54:00:C3:2C:28&quot;, &quot;status&quot; =&gt; &quot;provisioning&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> &quot;uid&quot; =&gt; 3, &quot;error_type&quot; =&gt; nil,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> &quot;fqdn&quot; =&gt; &quot;slave-3.mirantis.com&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line94">94</a> &quot;network_data&quot; =&gt; [{&quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.4/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> {&quot;gateway&quot; =&gt; &quot;240.0.1.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> &quot;name&quot; =&gt; &quot;public&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> &quot;brd&quot; =&gt; &quot;240.0.1.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line101">101</a> &quot;vlan&quot; =&gt; 101, &quot;ip&quot; =&gt; &quot;240.0.1.4/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> {&quot;name&quot; =&gt; &quot;floating&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 120},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> {&quot;name&quot; =&gt; &quot;fixed&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 103},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> {&quot;name&quot; =&gt; &quot;storage&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 104,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> &quot;ip&quot; =&gt; &quot;172.16.1.4/24&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line106">106</a> &quot;brd&quot; =&gt; &quot;172.16.1.255&quot;}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line107">107</a> &quot;id&quot; =&gt; 3,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line108">108</a> &quot;ip&quot; =&gt; &quot;10.20.0.68&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> &quot;role&quot; =&gt; &quot;compute&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> 'meta' =&gt; meta}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> &quot;method&quot; =&gt; &quot;deploy&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> &quot;respond_to&quot; =&gt; &quot;deploy_resp&quot;}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line113">113</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> @data['args']['attributes']['controller_nodes'] = @data['args']['nodes'].</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> select { |node| node['role'] == 'controller'}</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> ha_nodes = @data['args']['nodes'] +</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> [{&quot;mac&quot; =&gt; &quot;52:54:00:0E:88:88&quot;, &quot;status&quot; =&gt; &quot;provisioned&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line119">119</a> &quot;uid&quot; =&gt; &quot;4&quot;, &quot;error_type&quot; =&gt; nil,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> &quot;fqdn&quot; =&gt; &quot;controller-4.mirantis.com&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line121">121</a> &quot;network_data&quot; =&gt; [{&quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line122">122</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.5/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line125">125</a> {&quot;gateway&quot; =&gt; &quot;240.0.1.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line126">126</a> &quot;name&quot; =&gt; &quot;public&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line127">127</a> &quot;brd&quot; =&gt; &quot;240.0.1.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> &quot;vlan&quot; =&gt; 101, &quot;ip&quot; =&gt; &quot;240.0.1.5/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line129">129</a> {&quot;name&quot; =&gt; &quot;floating&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 120},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line130">130</a> {&quot;name&quot; =&gt; &quot;fixed&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 103},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line131">131</a> {&quot;name&quot; =&gt; &quot;storage&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 104,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> &quot;ip&quot; =&gt; &quot;172.16.1.5/24&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> &quot;brd&quot; =&gt; &quot;172.16.1.255&quot;}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> &quot;id&quot; =&gt; 4,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line135">135</a> &quot;ip&quot; =&gt; &quot;10.20.0.205&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line136">136</a> &quot;role&quot; =&gt; &quot;controller&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line137">137</a> 'meta' =&gt; meta},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> {&quot;mac&quot; =&gt; &quot;52:54:00:0E:99:99&quot;, &quot;status&quot; =&gt; &quot;provisioned&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line139">139</a> &quot;uid&quot; =&gt; &quot;5&quot;, &quot;error_type&quot; =&gt; nil,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> &quot;fqdn&quot; =&gt; &quot;controller-5.mirantis.com&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> &quot;network_data&quot; =&gt; [{&quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line142">142</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line143">143</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.6/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line145">145</a> {&quot;gateway&quot; =&gt; &quot;240.0.1.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> &quot;name&quot; =&gt; &quot;public&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> &quot;brd&quot; =&gt; &quot;240.0.1.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line148">148</a> &quot;vlan&quot; =&gt; 101, &quot;ip&quot; =&gt; &quot;240.0.1.6/24&quot;},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line149">149</a> {&quot;name&quot; =&gt; &quot;floating&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 120},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> {&quot;name&quot; =&gt; &quot;fixed&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 103},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line151">151</a> {&quot;name&quot; =&gt; &quot;storage&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;, &quot;vlan&quot; =&gt; 104,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> &quot;ip&quot; =&gt; &quot;172.16.1.6/24&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line153">153</a> &quot;brd&quot; =&gt; &quot;172.16.1.255&quot;}],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> &quot;id&quot; =&gt; 5,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> &quot;ip&quot; =&gt; &quot;10.20.0.206&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line156">156</a> &quot;role&quot; =&gt; &quot;controller&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> 'meta' =&gt; meta}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line158">158</a> @data_ha = Marshal.load(Marshal.dump(@data))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> @data_ha['args']['nodes'] = ha_nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line160">160</a> @data_ha['args']['attributes']['deployment_mode'] = &quot;ha&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line161">161</a> # VIPs are required for HA mode and should be passed from Nailgun (only in HA)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line162">162</a> @data_ha['args']['attributes']['management_vip'] = &quot;192.168.0.111&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line163">163</a> @data_ha['args']['attributes']['public_vip'] = &quot;240.0.1.111&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line164">164</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line165">165</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> it &quot;it should call valid method depends on attrs&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> nodes = [{'uid' =&gt; 1}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> attrs = {'deployment_mode' =&gt; 'ha'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line169">169</a> attrs_modified = attrs.merge({'some' =&gt; 'somea'})</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line170">170</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line171">171</a> @deploy_engine.expects(:attrs_ha).with(nodes, attrs).returns(attrs_modified)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line172">172</a> @deploy_engine.expects(:deploy_ha).with(nodes, attrs_modified)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line173">173</a> # All implementations of deploy_piece go to subclasses</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line174">174</a> @deploy_engine.respond_to?(:deploy_piece).should be_true</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line175">175</a> @deploy_engine.deploy(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line177">177</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> it &quot;it should raise an exception if deployment mode is unsupported&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> nodes = [{'uid' =&gt; 1}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line180">180</a> attrs = {'deployment_mode' =&gt; 'unknown'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line181">181</a> expect {@deploy_engine.deploy(nodes, attrs)}.to raise_exception(/Method attrs_unknown is not implemented/)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line183">183</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line184">184</a> it &quot;multinode deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line185">185</a> @data['args']['attributes']['deployment_mode'] = &quot;multinode&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line186">186</a> Astute::Metadata.expects(:publish_facts).times(@data['args']['nodes'].size)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line187">187</a> # we got two calls, one for controller, and another for all computes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line188">188</a> controller_nodes = @data['args']['nodes'].select{|n| n['role'] == 'controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line189">189</a> compute_nodes = @data['args']['nodes'].select{|n| n['role'] == 'compute'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line190">190</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, controller_nodes, instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line191">191</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, compute_nodes, instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line192">192</a> @deploy_engine.deploy(@data['args']['nodes'], @data['args']['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line193">193</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line194">194</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line195">195</a> it &quot;ha deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line196">196</a> Astute::Metadata.expects(:publish_facts).at_least_once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line197">197</a> controller_nodes = @data_ha['args']['nodes'].select{|n| n['role'] == 'controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line198">198</a> primary_nodes = [controller_nodes.shift]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> compute_nodes = @data_ha['args']['nodes'].select{|n| n['role'] == 'compute'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_nodes, 0, false).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line201">201</a> controller_nodes.each do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line202">202</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, [n], 2, true).once</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line203">203</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line204">204</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_nodes, 2, true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line205">205</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, compute_nodes, instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line206">206</a> @deploy_engine.deploy(@data_ha['args']['nodes'], @data_ha['args']['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line207">207</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line208">208</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line209">209</a> it &quot;ha deploy should not raise any exception if there are only one controller&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line210">210</a> Astute::Metadata.expects(:publish_facts).at_least_once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> Astute::PuppetdDeployer.expects(:deploy).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line212">212</a> ctrl = @data_ha['args']['nodes'].select {|n| n['role'] == 'controller'}[0]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line213">213</a> @deploy_engine.deploy([ctrl], @data_ha['args']['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line214">214</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line215">215</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line216">216</a> it &quot;singlenode deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line217">217</a> @data['args']['attributes']['deployment_mode'] = &quot;singlenode&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line218">218</a> @data['args']['nodes'] = [@data['args']['nodes'][0]] # We have only one node in singlenode</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line219">219</a> Astute::Metadata.expects(:publish_facts).times(@data['args']['nodes'].size)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line220">220</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, @data['args']['nodes'], instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line221">221</a> @deploy_engine.deploy(@data['args']['nodes'], @data['args']['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line222">222</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line223">223</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line224">224</a> describe 'Vlan manager' do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line225">225</a> it 'Should set fixed_interface value' do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line226">226</a> node = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line227">227</a> 'role' =&gt; 'controller',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line228">228</a> 'uid' =&gt; 1,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line229">229</a> 'vlan_interface' =&gt; 'eth2',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line230">230</a> 'network_data' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line231">231</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line232">232</a> &quot;gateway&quot; =&gt; &quot;192.168.0.1&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line233">233</a> &quot;name&quot; =&gt; &quot;management&quot;, &quot;dev&quot; =&gt; &quot;eth0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line234">234</a> &quot;brd&quot; =&gt; &quot;192.168.0.255&quot;, &quot;netmask&quot; =&gt; &quot;255.255.255.0&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line235">235</a> &quot;vlan&quot; =&gt; 102, &quot;ip&quot; =&gt; &quot;192.168.0.2/24&quot;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line236">236</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line237">237</a> ],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line238">238</a> 'meta' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line239">239</a> 'interfaces' =&gt; [</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line240">240</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line241">241</a> 'name' =&gt; 'eth1',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line242">242</a> }, {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line243">243</a> 'name' =&gt; 'eth0',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line244">244</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line245">245</a> ]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line246">246</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line247">247</a> }</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line248">248</a> attrs = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line249">249</a> 'network_manager' =&gt; 'VlanManager'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line250">250</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line251">251</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line252">252</a> expect = {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line253">253</a> &quot;role&quot; =&gt; &quot;controller&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line254">254</a> &quot;uid&quot;=&gt;1,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line255">255</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line256">256</a> &quot;network_data&quot; =&gt; {&quot;eth0.102&quot; =&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line257">257</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line258">258</a> &quot;interface&quot; =&gt; &quot;eth0.102&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line259">259</a> &quot;ipaddr&quot; =&gt; [&quot;192.168.0.2/24&quot;]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line260">260</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line261">261</a> &quot;lo&quot; =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line262">262</a> &quot;interface&quot; =&gt; &quot;lo&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line263">263</a> &quot;ipaddr&quot; =&gt; [&quot;127.0.0.1/8&quot;]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line264">264</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line265">265</a> 'eth1' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line266">266</a> 'interface' =&gt; 'eth1',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line267">267</a> 'ipaddr' =&gt; 'none'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line268">268</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line269">269</a> 'eth0' =&gt; {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line270">270</a> 'interface' =&gt;'eth0',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line271">271</a> 'ipaddr' =&gt; 'none'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line272">272</a> },</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line273">273</a> }.to_json,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line274">274</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line275">275</a> &quot;fixed_interface&quot; =&gt; &quot;eth2&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line276">276</a> &quot;network_manager&quot; =&gt; &quot;VlanManager&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line277">277</a> &quot;management_interface&quot; =&gt; &quot;eth0.102&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line278">278</a> &quot;internal_address&quot; =&gt; &quot;192.168.0.2&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line279">279</a> 'management_address' =&gt; '192.168.0.2'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line280">280</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line281">281</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line282">282</a> Astute::Metadata.expects(:publish_facts).with(@ctx, node['uid'], expect)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line283">283</a> @deploy_engine.create_facts(node, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line284">284</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line285">285</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line286">286</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line287">287</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>

View File

@ -1,344 +0,0 @@
<!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>spec/unit/node_spec.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>spec/unit/node_spec.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="spec-unit-node_spec_rb.html">spec/unit/node_spec.rb</a></td>
<td class='right_align'><tt>95</tt></td>
<td class='right_align'><tt>52</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> describe Astute::Node do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> it &quot;accepts hash for initialization&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> node = Astute::Node.new('uid' =&gt; 'abc', 'info' =&gt; 'blabla')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> node.uid.should == 'abc'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> node.info.should == 'blabla'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line24">24</a> end</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> it &quot;requires uid&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> expect{ Astute::Node.new({}) }.to raise_error(TypeError)</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> it &quot;stringifies uid&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line31">31</a> node = Astute::Node.new('uid' =&gt; :abc)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> node.uid.should == 'abc'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> node = Astute::Node.new('uid' =&gt; 123)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> node.uid.should == '123'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> it &quot;denies uid changes&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> node = Astute::Node.new('uid' =&gt; 1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> expect{ node.uid = 2 }.to raise_error(TypeError)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> expect{ node['uid'] = 2 }.to raise_error(TypeError)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> expect{ node[:uid] = 2 }.to raise_error(TypeError)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line43">43</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> it &quot;allows [] accessors&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> node = Astute::Node.new('uid' =&gt; 123, 'info' =&gt; 'abc')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> node['info'].should == 'abc'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> node[:info].should == 'abc'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> node['info'] = 'cba'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line49">49</a> node['info'].should == 'cba'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> node[:info] = 'dcb'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> node[:info].should == 'dcb'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> it &quot;unwraps to hash&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> hash = {'uid' =&gt; '123', 'info' =&gt; 'abc'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> node = Astute::Node.new(hash)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> node.to_hash.should == hash</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> node.to_hash.should_not === node.instance_variable_get(:@table)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line59">59</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line60">60</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> describe Astute::NodesHash do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> it &quot;accepts array of hashes or nodes for initialization and allows accessing by uid&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> nodes = Astute::NodesHash.build(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> [{'uid' =&gt; 123, 'info' =&gt; 'blabla1'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line66">66</a> Astute::Node.new({'uid' =&gt; 'abc', 'info' =&gt; 'blabla2'})])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line67">67</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> nodes['123'].info.should == 'blabla1'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> nodes['abc'].info.should == 'blabla2'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line70">70</a> nodes[123].info.should == 'blabla1'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> nodes[:abc].info.should == 'blabla2'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> nodes['123'].uid.should == '123'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> nodes.values.map(&amp;:class).uniq.should == [Astute::Node]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line74">74</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> it &quot;allows easy elements addition and normalizes data&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> nodes = Astute::NodesHash.new</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> nodes &lt;&lt; {'uid' =&gt; 1} &lt;&lt; {'uid' =&gt; 2}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> nodes.push({'uid' =&gt; 3}, {'uid' =&gt; 4}, {'uid' =&gt; 5})</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> nodes.keys.sort.should == %w(1 2 3 4 5)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> nodes.values.map(&amp;:class).uniq.should == [Astute::Node]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line82">82</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> it &quot;introduces meaningful aliases&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> nodes = Astute::NodesHash.build(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> [{'uid' =&gt; 123, 'info' =&gt; 'blabla1'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line87">87</a> Astute::Node.new({'uid' =&gt; 'abc', 'info' =&gt; 'blabla2'})])</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> nodes.uids.should == nodes.keys</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> nodes.nodes.should == nodes.values</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> it &quot;denies direct accessors&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> expect{ Astute::NodesHash.new['fake-uid'] = {'bla' =&gt; 'bla'} }.to raise_error(NoMethodError)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</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>

File diff suppressed because it is too large Load Diff

View File

@ -1,758 +0,0 @@
<!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>spec/unit/puppetd_spec.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>spec/unit/puppetd_spec.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="spec-unit-puppetd_spec_rb.html">spec/unit/puppetd_spec.rb</a></td>
<td class='right_align'><tt>233</tt></td>
<td class='right_align'><tt>105</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> include Astute</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> describe &quot;Puppetd&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> include SpecHelpers</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line23">23</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> context &quot;PuppetdDeployer&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> before :each do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @ctx = mock</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> @ctx.stubs(:task_id)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> @reporter = mock('reporter')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> @ctx.stubs(:reporter).returns(ProxyReporter.new(@reporter))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line30">30</a> @ctx.stubs(:deploy_log_parser).returns(Astute::LogParser::NoParsing.new)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line32">32</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> it &quot;reports ready status for node if puppet deploy finished successfully&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> @reporter.expects(:report).with('nodes' =&gt; [{'uid' =&gt; '1', 'status' =&gt; 'ready', 'progress' =&gt; 100}])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> last_run_result = {:data=&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> {:time=&gt;{&quot;last_run&quot;=&gt;1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> :status =&gt; &quot;running&quot;, :resources =&gt; {'failed' =&gt; 0},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line38">38</a> :running =&gt; 1, :idling =&gt; 0},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line39">39</a> :sender=&gt;&quot;1&quot;}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line40">40</a> last_run_result_new = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line41">41</a> last_run_result_new[:data][:time]['last_run'] = 1358426000</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line42">42</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> last_run_result_finished = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> last_run_result_finished[:data][:status] = 'stopped'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> last_run_result_finished[:data][:time]['last_run'] = 1358427000</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> nodes = [{'uid' =&gt; '1'}]</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> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> rpcclient_valid_result = mock_mc_result(last_run_result)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> rpcclient_new_res = mock_mc_result(last_run_result_new)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> rpcclient_finished_res = mock_mc_result(last_run_result_finished)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line54">54</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> rpcclient.stubs(:last_run_summary).returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line57">57</a> returns([rpcclient_new_res]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line58">58</a> returns([rpcclient_finished_res])</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> rpcclient.expects(:runonce).at_least_once.returns([rpcclient_valid_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line61">61</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries=0)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> it &quot;doesn't report ready status for node if change_node_status disabled&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> @reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> last_run_result = {:data=&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line68">68</a> {:time=&gt;{&quot;last_run&quot;=&gt;1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> :status =&gt; &quot;running&quot;, :resources =&gt; {'failed' =&gt; 0},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> :running =&gt; 1, :idling =&gt; 0},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> :sender=&gt;&quot;1&quot;}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> last_run_result_new = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> last_run_result_new[:data][:time]['last_run'] = 1358426000</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> last_run_result_finished = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line76">76</a> last_run_result_finished[:data][:status] = 'stopped'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> last_run_result_finished[:data][:time]['last_run'] = 1358427000</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line78">78</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> nodes = [{'uid' =&gt; '1'}]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line80">80</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> rpcclient = mock_rpcclient(nodes)</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> rpcclient_valid_result = mock_mc_result(last_run_result)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> rpcclient_new_res = mock_mc_result(last_run_result_new)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> rpcclient_finished_res = mock_mc_result(last_run_result_finished)</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> rpcclient.stubs(:last_run_summary).returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line88">88</a> returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line89">89</a> returns([rpcclient_new_res]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> returns([rpcclient_finished_res])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> rpcclient.expects(:runonce).at_least_once.returns([rpcclient_valid_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line93">93</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries=0, change_node_status=false)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line95">95</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line97">97</a> it &quot;publishes error status for node if puppet failed&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line98">98</a> @reporter.expects(:report).with('nodes' =&gt; [{'status' =&gt; 'error',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> 'error_type' =&gt; 'deploy', 'uid' =&gt; '1'}])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line100">100</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> last_run_result = {:statuscode=&gt;0, :data=&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line102">102</a> {:changes=&gt;{&quot;total&quot;=&gt;1}, :time=&gt;{&quot;last_run&quot;=&gt;1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line103">103</a> :resources=&gt;{&quot;failed&quot;=&gt;0}, :status =&gt; &quot;stopped&quot;, :enabled =&gt; 1,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> :stopped =&gt; 1, :idling =&gt; 0, :running =&gt; 0, :runtime =&gt; 1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> :sender=&gt;&quot;1&quot;}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line106">106</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> last_run_result_idle_pre = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> last_run_result_idle_pre[:data].update(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> {:status =&gt; 'idling', :idling =&gt; 1, :stopped =&gt; 0}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line110">110</a> )</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> last_run_result_running = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> last_run_result_running[:data].update(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> {:status =&gt; 'running', :running =&gt; 1, :stopped =&gt; 0}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line115">115</a> )</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> last_run_result_finishing = Marshal.load(Marshal.dump(last_run_result_running))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> last_run_result_finishing[:data].update(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line119">119</a> {</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line120">120</a> :runtime =&gt; 1358426000, :time =&gt; {&quot;last_run&quot; =&gt; 1358426000},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line121">121</a> :resources =&gt; {&quot;failed&quot; =&gt; 1}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line122">122</a> }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> )</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> last_run_result_idle_post = Marshal.load(Marshal.dump(last_run_result_finishing))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> last_run_result_idle_post[:data].update(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line127">127</a> {:status =&gt; 'idling', :idling =&gt; 1, :running =&gt; 0}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line128">128</a> )</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line129">129</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> last_run_result_finished = Marshal.load(Marshal.dump(last_run_result_finishing))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> last_run_result_finished[:data].update(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> {:status =&gt; 'stopped', :stopped =&gt; 1, :running =&gt; 0}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> )</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line134">134</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> nodes = [{'uid' =&gt; '1'}]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line136">136</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line137">137</a> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line138">138</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> rpcclient.stubs(:last_run_summary).times(9).</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line140">140</a> returns([ mock_mc_result(last_run_result) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> returns([ mock_mc_result(last_run_result) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line142">142</a> returns([ mock_mc_result(last_run_result_idle_pre) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line143">143</a> returns([ mock_mc_result(last_run_result_idle_pre) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line144">144</a> returns([ mock_mc_result(last_run_result_running) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line145">145</a> returns([ mock_mc_result(last_run_result_running) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line146">146</a> returns([ mock_mc_result(last_run_result_finishing) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line147">147</a> returns([ mock_mc_result(last_run_result_idle_post) ]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line148">148</a> returns([ mock_mc_result(last_run_result_finished) ])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> rpcclient.expects(:runonce).once.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line150">150</a> returns([ mock_mc_result(last_run_result) ])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line151">151</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line152">152</a> MClient.any_instance.stubs(:rpcclient).returns(rpcclient)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, 0)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line154">154</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line155">155</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line156">156</a> it &quot;doesn't publish error status for node if change_node_status disabled&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line157">157</a> @reporter.expects(:report).never</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line158">158</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> last_run_result = {:statuscode=&gt;0, :data=&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line160">160</a> {:changes=&gt;{&quot;total&quot;=&gt;1}, :time=&gt;{&quot;last_run&quot;=&gt;1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line161">161</a> :resources=&gt;{&quot;failed&quot;=&gt;0}, :status =&gt; &quot;running&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> :running =&gt; 1, :idling =&gt; 0, :runtime =&gt; 100},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> :sender=&gt;&quot;1&quot;}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> last_run_result_new = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line165">165</a> last_run_result_new[:data][:time]['last_run'] = 1358426000</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> last_run_result_new[:data][:resources]['failed'] = 1</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line167">167</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line168">168</a> nodes = [{'uid' =&gt; '1'}]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line170">170</a> last_run_result_finished = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line171">171</a> last_run_result_finished[:data][:status] = 'stopped'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line172">172</a> last_run_result_finished[:data][:time]['last_run'] = 1358427000</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line173">173</a> last_run_result_finished[:data][:resources]['failed'] = 1</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line174">174</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line175">175</a> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line176">176</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line177">177</a> rpcclient_valid_result = mock_mc_result(last_run_result)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> rpcclient_new_res = mock_mc_result(last_run_result_new)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line179">179</a> rpcclient_finished_res = mock_mc_result(last_run_result_finished)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line181">181</a> rpcclient.stubs(:last_run_summary).returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line182">182</a> returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line183">183</a> returns([rpcclient_new_res]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line184">184</a> returns([rpcclient_finished_res])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line185">185</a> rpcclient.expects(:runonce).at_least_once.returns([rpcclient_valid_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line186">186</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line187">187</a> MClient.any_instance.stubs(:rpcclient).returns(rpcclient)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line188">188</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries=0, change_node_status=false)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line189">189</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line190">190</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line191">191</a> it &quot;retries to run puppet if it fails&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line192">192</a> @reporter.expects(:report).with('nodes' =&gt; [{'uid' =&gt; '1', 'status' =&gt; 'ready', 'progress' =&gt; 100}])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line193">193</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line194">194</a> last_run_result = {:statuscode=&gt;0, :data=&gt;</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line195">195</a> {:changes=&gt;{&quot;total&quot;=&gt;1}, :time=&gt;{&quot;last_run&quot;=&gt;1358425701},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line196">196</a> :resources=&gt;{&quot;failed&quot;=&gt;0}, :status =&gt; &quot;running&quot;,</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line197">197</a> :running =&gt; 1, :idling =&gt; 0, :runtime =&gt; 100},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line198">198</a> :sender=&gt;&quot;1&quot;}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> last_run_failed = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> last_run_failed[:data][:time]['last_run'] = 1358426000</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line201">201</a> last_run_failed[:data][:resources]['failed'] = 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line202">202</a> last_run_failed[:data][:status] = 'stopped'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line203">203</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line204">204</a> last_run_fixing = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line205">205</a> last_run_fixing[:data][:time]['last_run'] = 1358426000</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line206">206</a> last_run_fixing[:data][:resources]['failed'] = 1</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line207">207</a> last_run_fixing[:data][:status] = 'running'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line208">208</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line209">209</a> last_run_success = Marshal.load(Marshal.dump(last_run_result))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line210">210</a> last_run_success[:data][:time]['last_run'] = 1358428000</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line211">211</a> last_run_success[:data][:status] = 'stopped'</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line212">212</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line213">213</a> nodes = [{'uid' =&gt; '1'}]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line214">214</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line215">215</a> rpcclient = mock_rpcclient(nodes)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line216">216</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line217">217</a> rpcclient_valid_result = mock_mc_result(last_run_result)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line218">218</a> rpcclient_failed = mock_mc_result(last_run_failed)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line219">219</a> rpcclient_fixing = mock_mc_result(last_run_fixing)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line220">220</a> rpcclient_succeed = mock_mc_result(last_run_success)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line221">221</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line222">222</a> rpcclient.stubs(:last_run_summary).returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line223">223</a> returns([rpcclient_valid_result]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line224">224</a> returns([rpcclient_failed]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line225">225</a> returns([rpcclient_failed]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line226">226</a> returns([rpcclient_fixing]).then.</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line227">227</a> returns([rpcclient_succeed])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line228">228</a> rpcclient.expects(:runonce).at_least_once.returns([rpcclient_valid_result])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line229">229</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line230">230</a> MClient.any_instance.stubs(:rpcclient).returns(rpcclient)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line231">231</a> Astute::PuppetdDeployer.deploy(@ctx, nodes, retries=1)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line232">232</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line233">233</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line234">234</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>

View File

@ -1,674 +0,0 @@
<!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>spec/unit/reporter_spec.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>spec/unit/reporter_spec.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="spec-unit-reporter_spec_rb.html">spec/unit/reporter_spec.rb</a></td>
<td class='right_align'><tt>205</tt></td>
<td class='right_align'><tt>126</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> include Astute</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line20">20</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> describe &quot;ProxyReporter&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> context &quot;Instance of ProxyReporter class&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> before :each do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> @msg = {'nodes' =&gt; [{'status' =&gt; 'ready', 'uid' =&gt; '1'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> @msg_pr = {'nodes' =&gt; [@msg['nodes'][0],</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line26">26</a> {'status' =&gt; 'deploying', 'uid' =&gt; '2',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line27">27</a> 'progress' =&gt; 54}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> @up_reporter = mock('up_reporter')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> @reporter = ProxyReporter.new(@up_reporter)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> it &quot;reports first-come data&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> @up_reporter.expects(:report).with(@msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> @reporter.report(@msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line35">35</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line36">36</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line37">37</a> it &quot;does not report the same message&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> @up_reporter.expects(:report).with(@msg).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> 5.times { @reporter.report(@msg) }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> end</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> it &quot;reports only updated node&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> updated_node = @msg_pr['nodes'][1]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> expected_msg = {'nodes' =&gt; [updated_node]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> @up_reporter.expects(:report).with(@msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line46">46</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line47">47</a> @reporter.report(@msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line48">48</a> @reporter.report(@msg_pr)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line49">49</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line50">50</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> it &quot;reports only if progress value is greater&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line52">52</a> msg1 = {'nodes' =&gt; [{'status' =&gt; 'deploying', 'uid' =&gt; '1', 'progress' =&gt; 54},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line53">53</a> {'status' =&gt; 'deploying', 'uid' =&gt; '2', 'progress' =&gt; 54}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> msg2 = Marshal.load(Marshal.dump(msg1))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line55">55</a> msg2['nodes'][1]['progress'] = 100</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line56">56</a> msg2['nodes'][1]['status'] = 'ready'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> updated_node = msg2['nodes'][1]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> expected_msg = {'nodes' =&gt; [updated_node]}</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> @up_reporter.expects(:report).with(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line62">62</a> @reporter.report(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line63">63</a> @reporter.report(msg2)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line64">64</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line65">65</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> it &quot;raises exception if wrong key passed&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> @msg['nodes'][0]['ups'] = 'some_value'</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> lambda {@reporter.report(@msg)}.should raise_error</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line69">69</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line71">71</a> it &quot;adjusts progress to 100 if passed greater&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 120}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line75">75</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line77">77</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> it &quot;adjusts progress to 0 if passed less&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; -20}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 0}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line81">81</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line82">82</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line83">83</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line84">84</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> it &quot;adjusts progress to 100 if status provisioned and no progress given&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line86">86</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line88">88</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line89">89</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line90">90</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line92">92</a> it &quot;adjusts progress to 100 if status ready and no progress given&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line96">96</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line99">99</a> it &quot;adjusts progress to 100 if status provisioned with progress&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned', 'progress' =&gt; 50}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line103">103</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line104">104</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line105">105</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> it &quot;adjusts progress to 100 if status ready with progress&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> input_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready', 'progress' =&gt; 50}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> expected_msg = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line109">109</a> @up_reporter.expects(:report).with(expected_msg)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> @reporter.report(input_msg)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line111">111</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line112">112</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> it &quot;does not report if node was in ready, and trying to set is deploying&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line114">114</a> msg1 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> msg2 = {'nodes' =&gt; [{'uid' =&gt; 2, 'status' =&gt; 'ready'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line116">116</a> msg3 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line117">117</a> @up_reporter.expects(:report).with(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line118">118</a> @up_reporter.expects(:report).with(msg2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> @reporter.report(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line121">121</a> @reporter.report(msg2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line122">122</a> 5.times { @reporter.report(msg3) }</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line124">124</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line125">125</a> it &quot;reports even not all keys provided&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line126">126</a> msg1 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line127">127</a> msg2 = {'nodes' =&gt; [{'uid' =&gt; 2, 'status' =&gt; 'ready'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line128">128</a> @up_reporter.expects(:report).with(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line129">129</a> @up_reporter.expects(:report).with(msg2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line130">130</a> @reporter.report(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line131">131</a> @reporter.report(msg2)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line132">132</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line133">133</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line134">134</a> it &quot;raises exception if progress provided and no status&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line135">135</a> msg1 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line136">136</a> msg2 = {'nodes' =&gt; [{'uid' =&gt; 1, 'progress' =&gt; 100}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line137">137</a> @up_reporter.expects(:report).with(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line138">138</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line139">139</a> @reporter.report(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line140">140</a> lambda {@reporter.report(msg2)}.should raise_error</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line141">141</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line142">142</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line143">143</a> it &quot;raises exception if status of node is not supported&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line144">144</a> msg1 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'hah'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line145">145</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line146">146</a> lambda {@reporter.report(msg1)}.should raise_error</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> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line149">149</a> it &quot;some other attrs are valid and passed&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line150">150</a> msg1 = {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line151">151</a> msg2 = {'status' =&gt; 'error', 'error_type' =&gt; 'deploy',</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line152">152</a> 'nodes' =&gt; [{'uid' =&gt; 2, 'status' =&gt; 'error', 'message' =&gt; 'deploy'}]}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line153">153</a> @up_reporter.expects(:report).with(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line154">154</a> @up_reporter.expects(:report).with(msg2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line155">155</a> @reporter.report(msg1)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line156">156</a> @reporter.report(msg2)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line157">157</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line158">158</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line159">159</a> it &quot;reports if status is greater&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line160">160</a> msgs = [{'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line161">161</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line162">162</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'ready'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line163">163</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'error'}]}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line164">164</a> @up_reporter.expects(:report).with(msgs[0])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line165">165</a> @up_reporter.expects(:report).with(msgs[2])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line166">166</a> @up_reporter.expects(:report).with(msgs[3])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line167">167</a> msgs.each {|msg| @reporter.report(msg)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line168">168</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line169">169</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line170">170</a> it &quot;doesn't update progress if it less than previous progress with same status&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line171">171</a> msgs = [{'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'progress' =&gt; 50}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line172">172</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'progress' =&gt; 10}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line173">173</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 50}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line174">174</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 10}]}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line175">175</a> @up_reporter.expects(:report).with(msgs[0])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line176">176</a> @up_reporter.expects(:report).with(msgs[2])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line177">177</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line178">178</a> msgs.each {|msg| @reporter.report(msg)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line179">179</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line180">180</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line181">181</a> it &quot;updates progress if it less than previous progress when changing status&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line182">182</a> msgs = [{'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'progress' =&gt; 50}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line183">183</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line184">184</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioned', 'progress' =&gt; 100}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line185">185</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'deploying', 'progress' =&gt; 0}]}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line186">186</a> @up_reporter.expects(:report).with(msgs[0])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line187">187</a> @up_reporter.expects(:report).with(msgs[2])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line188">188</a> @up_reporter.expects(:report).with(msgs[3])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line189">189</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line190">190</a> msgs.each {|msg| @reporter.report(msg)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line191">191</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line192">192</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line193">193</a> it &quot;doesn't forget previously reported attributes&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line194">194</a> msgs = [{'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'progress' =&gt; 50}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line195">195</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line196">196</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'key' =&gt; 'value'}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line197">197</a> {'nodes' =&gt; [{'uid' =&gt; 1, 'status' =&gt; 'provisioning', 'progress' =&gt; 0}]},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line198">198</a> ]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line199">199</a> @up_reporter.expects(:report).with(msgs[0])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line200">200</a> @up_reporter.expects(:report).with(msgs[2])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line201">201</a> @up_reporter.expects(:report).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line202">202</a> msgs.each {|msg| @reporter.report(msg)}</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line203">203</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line204">204</a> </pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line205">205</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line206">206</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>

View File

@ -1,425 +0,0 @@
<!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>spec/unit/simplepuppet_deploy_spec.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>spec/unit/simplepuppet_deploy_spec.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="spec-unit-simplepuppet_deploy_spec_rb.html">spec/unit/simplepuppet_deploy_spec.rb</a></td>
<td class='right_align'><tt>122</tt></td>
<td class='right_align'><tt>73</tt></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></div>
</div></td>
<td class="left_align"><div class="percent_graph_legend"><tt class=''>100.00%</tt></div>
<div class="percent_graph">
<div class="covered" style="width:100px"></div>
<div class="uncovered" style="width:0px"></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="marked">
<td><pre><a name="line17">17</a> require File.join(File.dirname(__FILE__), '../spec_helper')</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line18">18</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line19">19</a> describe &quot;SimplePuppet DeploymentEngine&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line20">20</a> context &quot;When deploy is called, &quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line21">21</a> before(:each) do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line22">22</a> @ctx = mock</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line23">23</a> @ctx.stubs(:task_id)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line24">24</a> @ctx.stubs(:deploy_log_parser).returns(Astute::LogParser::NoParsing.new)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line25">25</a> @reporter = mock('reporter')</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line26">26</a> @reporter.stub_everything</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line27">27</a> @ctx.stubs(:reporter).returns(Astute::ProxyReporter.new(@reporter))</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line28">28</a> @deploy_engine = Astute::DeploymentEngine::SimplePuppet.new(@ctx)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line29">29</a> @env = YAML.load_file(File.join(File.dirname(__FILE__), &quot;..&quot;, &quot;..&quot;, &quot;examples&quot;, &quot;no_attrs.yaml&quot;))</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line30">30</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line31">31</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line32">32</a> it &quot;it should call valid method depends on attrs&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line33">33</a> nodes = [{'uid' =&gt; 1}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line34">34</a> attrs = {'deployment_mode' =&gt; 'ha'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line35">35</a> @deploy_engine.expects(:attrs_ha).never # It is not supported in SimplePuppet</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line36">36</a> @deploy_engine.expects(:deploy_ha).with(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line37">37</a> # All implementations of deploy_piece go to subclasses</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line38">38</a> @deploy_engine.respond_to?(:deploy_piece).should be_true</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line39">39</a> @deploy_engine.deploy(nodes, attrs)</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line40">40</a> end</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> it &quot;it should raise an exception if deployment mode is unsupported&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line43">43</a> nodes = [{'uid' =&gt; 1}]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line44">44</a> attrs = {'deployment_mode' =&gt; 'unknown'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line45">45</a> expect {@deploy_engine.deploy(nodes, attrs)}.to raise_exception(</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line46">46</a> /Method deploy_unknown is not implemented/)</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> it &quot;multinode deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line50">50</a> @env['attributes']['deployment_mode'] = &quot;multinode&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line51">51</a> Astute::Metadata.expects(:publish_facts).never # It is not supported in SimplePuppet</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line52">52</a> # we got two calls, one for controller, and another for all computes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line53">53</a> Astute::PuppetdDeployer.expects(:deploy).twice</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line54">54</a> @deploy_engine.deploy(@env['nodes'], @env['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line55">55</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line56">56</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line57">57</a> it &quot;ha deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line58">58</a> @env['attributes']['deployment_mode'] = &quot;ha&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line59">59</a> Astute::Metadata.expects(:publish_facts).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line60">60</a> Astute::PuppetdDeployer.expects(:deploy).times(2)</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line61">61</a> @deploy_engine.deploy(@env['nodes'], @env['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line62">62</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line63">63</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line64">64</a> it &quot;singlenode deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line65">65</a> @env['attributes']['deployment_mode'] = &quot;singlenode&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line66">66</a> @env['nodes'] = [@env['nodes'][0]] # We have only one node in singlenode</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line67">67</a> Astute::Metadata.expects(:publish_facts).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line68">68</a> Astute::PuppetdDeployer.expects(:deploy).once # one call for one node</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line69">69</a> @deploy_engine.deploy(@env['nodes'], @env['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line70">70</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line71">71</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line72">72</a> it &quot;ha_compact deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line73">73</a> @env['attributes']['deployment_mode'] = &quot;ha_compact&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line74">74</a> @env['nodes'].concat([{'uid'=&gt;'c1', 'role'=&gt;'controller'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line75">75</a> {'uid'=&gt;'c2', 'role'=&gt;'controller'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line76">76</a> {'uid'=&gt;'o1', 'role'=&gt;'other'}])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line77">77</a> controller_nodes = @env['nodes'].select{|n| n['role'] == 'controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line78">78</a> compute_nodes = @env['nodes'].select{|n| n['role'] == 'compute'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line79">79</a> other_nodes = @env['nodes'] - controller_nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line80">80</a> primary_ctrl_nodes = [controller_nodes.shift]</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line81">81</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line82">82</a> Astute::Metadata.expects(:publish_facts).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line83">83</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_ctrl_nodes, 0, false).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line84">84</a> controller_nodes.each do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line85">85</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, [n], 2, true).once</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line86">86</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line87">87</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_ctrl_nodes, 2, true).once</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> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, other_nodes, instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line90">90</a> @deploy_engine.deploy(@env['nodes'], @env['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line91">91</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line92">92</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line93">93</a> it &quot;ha_full deploy should not raise any exception&quot; do</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line94">94</a> @env['attributes']['deployment_mode'] = &quot;ha_full&quot;</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line95">95</a> @env['nodes'].concat([{'uid'=&gt;'c1', 'role'=&gt;'controller'}, {'uid'=&gt;'c2', 'role'=&gt;'controller'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line96">96</a> {'uid'=&gt;'q1', 'role'=&gt;'quantum'}, {'uid'=&gt;'q2', 'role'=&gt;'quantum'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line97">97</a> {'uid'=&gt;'st1', 'role'=&gt;'storage'}, {'uid'=&gt;'st2', 'role'=&gt;'storage'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line98">98</a> {'uid'=&gt;'sw1', 'role'=&gt;'primary-swift-proxy'}, {'uid'=&gt;'sw2', 'role'=&gt;'swift-proxy'},</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line99">99</a> {'uid'=&gt;'o1', 'role'=&gt;'other'}])</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line100">100</a> controller_nodes = @env['nodes'].select{|n| n['role'] == 'controller'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line101">101</a> primary_ctrl_nodes = [controller_nodes.shift]</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line102">102</a> compute_nodes = @env['nodes'].select{|n| n['role'] == 'compute'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line103">103</a> quantum_nodes = @env['nodes'].select {|n| n['role'] == 'quantum'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line104">104</a> storage_nodes = @env['nodes'].select {|n| n['role'] == 'storage'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line105">105</a> proxy_nodes = @env['nodes'].select {|n| n['role'] == 'swift-proxy'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line106">106</a> primary_proxy_nodes = @env['nodes'].select {|n| n['role'] == 'primary-swift-proxy'}</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line107">107</a> primary_nodes = primary_ctrl_nodes + primary_proxy_nodes</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line108">108</a> other_nodes = @env['nodes'] - controller_nodes - primary_nodes - quantum_nodes</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line109">109</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line110">110</a> Astute::Metadata.expects(:publish_facts).never</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line111">111</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_ctrl_nodes, 0, false).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line112">112</a> controller_nodes.each do |n|</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line113">113</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, [n], 2, true).once</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line114">114</a> end</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line115">115</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, primary_nodes, 2, true).once</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> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, quantum_nodes, 2, true).once</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line118">118</a> </pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line119">119</a> Astute::PuppetdDeployer.expects(:deploy).with(@ctx, other_nodes, instance_of(Fixnum), true).once</pre></td>
</tr>
<tr class="marked">
<td><pre><a name="line120">120</a> @deploy_engine.deploy(@env['nodes'], @env['attributes'])</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line121">121</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line122">122</a> end</pre></td>
</tr>
<tr class="inferred">
<td><pre><a name="line123">123</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>

View File

@ -25,8 +25,6 @@ nodes:
- management
- storage
- name: eth0
#ip_address: 10.20.0.49 # ip, power_address
#netmask: 255.255.255.0
dns_name: controller-8.domain.tld # fqdn
static: 0
mac_address: 08:00:27:11:2D:DF # mac
@ -36,20 +34,6 @@ nodes:
network_name:
- public
default_gateway: 10.20.0.1
# network_data:
# - name: public
# ip: 172.18.94.41
# dev: eth1
# netmask: 255.255.255.0
# gateway: 172.18.94.33
# - name:
# - management
# - storage
# ip: 10.20.0.45
# dev: eth0
# netmask: 255.255.255.0
# - name: fixed
# dev: eth2
attributes:
master_ip: 10.20.0.2
@ -98,7 +82,6 @@ attributes:
password: cinder
user: cinder
floating_network_range: 10.20.0.150/28
#fixed_network_range: CIDR
fixed_network_range: 10.20.1.0/24
base_syslog:
syslog_port: '514'

View File

@ -110,7 +110,7 @@ nodes:
#netmask: 255.255.255.0
dns_name: controller-8.domain.tld # fqdn
static: 1
mac_address: 08:00:27:83:80:92 # mac
mac_address: 08:00:27:11:2D:DF # mac
onboot: 'yes'
peerdns: 'no'
use_for_provision: true

View File

@ -1,240 +0,0 @@
---
# Base config
task_uuid: deployment_task
engine:
url: http://localhost/cobbler_api
username: cobbler
password: cobbler
power_info: &power_info
power_type: ssh
power_user: root
name_servers: ! '"10.20.0.2"'
power_pass: /root/.ssh/bootstrap.rsa
netboot_enabled: '1'
ks_meta: &ks_meta
mco_enable: 1
mco_vhost: mcollective
mco_pskey: unset
mco_user: mcollective
puppet_enable: 0
install_log_2_syslog: 1
mco_password: marionette
puppet_auto_setup: 1
puppet_master: fuelweb.domain.tld
mco_auto_setup: 1
auth_key: ! '""'
puppet_version: 2.7.19
mco_connector: rabbitmq
mco_host: 10.20.0.2
# Nodes
node_22: &node_22
id: 22
uid: 22
mac: 08:00:27:C2:06:DE
ip: &ip 10.20.0.95
fqdn: &fqdn controller-22.domain.tld
# Data for provision
profile: centos-x86_64
ks_meta:
<<: *ks_meta
ks_spaces: ! '"[{\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0\",
\"volumes\": [{\"mount\": \"/boot\", \"type\": \"partition\", \"size\": 209715200},
{\"type\": \"mbr\"}, {\"size\": 16959668224, \"type\": \"pv\", \"vg\": \"os\"}],
\"size\": 17179869184}, {\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-1:0:0:0\",
\"volumes\": [{\"size\": 536860426240, \"type\": \"pv\", \"vg\": \"os\"}], \"size\":
536870912000}, {\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-2:0:0:0\",
\"volumes\": [{\"size\": 2411714314240, \"type\": \"pv\", \"vg\": \"os\"}],
\"size\": 2411724800000}, {\"type\": \"vg\", \"id\": \"os\", \"volumes\": [{\"mount\":
\"/\", \"type\": \"lv\", \"name\": \"root\", \"size\": 2963243016192}, {\"mount\":
\"swap\", \"type\": \"lv\", \"name\": \"swap\", \"size\": 2090065920}]}]"'
<<: *power_info
name: controller-22
hostname: *fqdn
power_address: *ip
interfaces:
eth2:
ip_address: 10.20.0.187
netmask: 255.255.255.0
static: '0'
mac_address: '08:00:27:31:09:34'
eth1:
ip_address: 10.20.0.186
netmask: 255.255.255.0
static: '0'
mac_address: 08:00:27:93:54:B0
eth0:
ip_address: 10.20.0.188
netmask: 255.255.255.0
dns_name: *fqdn
static: '0'
mac_address: 08:00:27:C2:06:DE
interfaces_extra:
eth2:
onboot: 'no'
peerdns: 'no'
eth1:
onboot: 'no'
peerdns: 'no'
eth0:
onboot: 'yes'
peerdns: 'no'
#End data for provision
meta:
memory:
total: 778694656
interfaces:
- mac: '08:00:27:31:09:34'
max_speed: 100
name: eth2
current_speed: 100
- mac: 08:00:27:93:54:B0
max_speed: 100
name: eth1
current_speed: 100
- name: eth0
ip: 10.20.0.95
netmask: 255.255.255.0
mac: 08:00:27:C2:06:DE
max_speed: 100
current_speed: 100
disks:
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-2:0:0:0
name: sdc
size: 2411724800000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-1:0:0:0
name: sdb
size: 536870912000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0
name: sda
size: 17179869184
system:
serial: '0'
version: '1.2'
fqdn: bootstrap
family: Virtual Machine
manufacturer: VirtualBox
cpu:
real: 0
total: 1
spec:
- model: Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
frequency: 2397
error_type:
network_data:
- name: management
ip: 192.168.6.2/24
vlan: 125
dev: eth0
netmask: 255.255.255.0
brd: 192.168.6.255
gateway: 192.168.6.1
- name: public
ip: 240.0.13.2/24
vlan: 124
dev: eth0
netmask: 255.255.255.0
brd: 240.0.13.255
gateway: 240.0.13.1
- name: storage
ip: 172.16.6.2/24
vlan: 126
dev: eth0
netmask: 255.255.255.0
brd: 172.16.6.255
gateway: 172.16.6.1
- name: management
ip: 192.168.6.5/24
vlan: 125
dev: eth0
netmask: 255.255.255.0
brd: 192.168.6.255
gateway: 192.168.6.1
- name: public
ip: 240.0.13.5/24
vlan: 124
dev: eth0
netmask: 255.255.255.0
brd: 240.0.13.255
gateway: 240.0.13.1
- name: storage
ip: 172.16.6.5/24
vlan: 126
dev: eth0
netmask: 255.255.255.0
brd: 172.16.6.255
gateway: 172.16.6.1
- vlan: 124
name: floating
dev: eth0
- vlan: 127
name: fixed
dev: eth0
- name: admin
dev: eth0
role: controller
online: true
progress: 0
nodes:
- <<: *node_22
attributes:
#deployment_engine: simplepuppet
use_cow_images: true
network_manager: FlatDHCPManager
libvirt_type: qemu
controller_nodes:
- <<: *node_22
mysql:
root_password: X1HWFL2i
glance:
db_password: hW3VFgdb
user_password: UMDMMYfp
network_size: 256
swift:
user_password: ODwuK9ij
fixed_network_range: 10.0.6.0/24
nova:
db_password: vlY5FhkA
user_password: UeVjkUxq
access:
password: admin
user: admin
tenant: admin
email: admin@example.org
keystone:
db_password: XjwwZsBU
admin_token: giVDBp05
auto_assign_floating_ip: false
start_guests_on_host_boot: true
rabbit:
password: 3ix8DkDi
management_network_range: 192.168.6.0/24
base_syslog:
syslog_port: '514'
syslog_server: 10.20.0.2
storage_network_range: 172.16.6.0/24
floating_network_range:
- 240.0.12.10
- 240.0.12.11
auth_key: ''
syslog:
syslog_port: '514'
syslog_transport: udp
syslog_server: ''
compute_scheduler_driver: nova.scheduler.filter_scheduler.FilterScheduler
deployment_mode: multinode
cinder:
db_password: rveahKih
user_password: ENwyu6oa
deployment_id: 8

View File

@ -1,190 +0,0 @@
---
# Base config
task_uuid: deployment_task
engine:
url: http://localhost/cobbler_api
username: cobbler
password: cobbler
power_info: &power_info
power_type: ssh
power_user: root
name_servers: ! '"10.20.0.2"'
power_pass: /root/.ssh/bootstrap.rsa
netboot_enabled: '1'
ks_meta: &ks_meta
mco_enable: 1
mco_vhost: mcollective
mco_pskey: unset
mco_user: mcollective
puppet_enable: 0
install_log_2_syslog: 1
mco_password: marionette
puppet_auto_setup: 1
puppet_master: fuelweb.domain.tld
mco_auto_setup: 1
auth_key: ! '""'
puppet_version: 2.7.19
mco_connector: rabbitmq
mco_host: 10.20.0.2
# Nodes
node_22: &node_22
id: 22
uid: 22
mac: 08:00:27:C2:06:DE
ip: &ip 10.20.0.95
fqdn: &fqdn controller-22.domain.tld
# Data for provision
profile: centos-x86_64
ks_meta:
<<: *ks_meta
ks_spaces: ! '"[{\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0\",
\"volumes\": [{\"mount\": \"/boot\", \"type\": \"partition\", \"size\": 209715200},
{\"type\": \"mbr\"}, {\"size\": 16959668224, \"type\": \"pv\", \"vg\": \"os\"}],
\"size\": 17179869184}, {\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-1:0:0:0\",
\"volumes\": [{\"size\": 536860426240, \"type\": \"pv\", \"vg\": \"os\"}], \"size\":
536870912000}, {\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:0d.0-scsi-2:0:0:0\",
\"volumes\": [{\"size\": 2411714314240, \"type\": \"pv\", \"vg\": \"os\"}],
\"size\": 2411724800000}, {\"type\": \"vg\", \"id\": \"os\", \"volumes\": [{\"mount\":
\"/\", \"type\": \"lv\", \"name\": \"root\", \"size\": 2963243016192}, {\"mount\":
\"swap\", \"type\": \"lv\", \"name\": \"swap\", \"size\": 2090065920}]}]"'
<<: *power_info
name: controller-22
hostname: *fqdn
power_address: *ip
interfaces:
eth2:
ip_address: 10.20.0.187
netmask: 255.255.255.0
static: '0'
mac_address: '08:00:27:31:09:34'
eth1:
ip_address: 10.20.0.186
netmask: 255.255.255.0
static: '0'
mac_address: 08:00:27:93:54:B0
eth0:
ip_address: 10.20.0.188
netmask: 255.255.255.0
dns_name: *fqdn
static: '0'
mac_address: 08:00:27:C2:06:DE
interfaces_extra:
eth2:
onboot: 'no'
peerdns: 'no'
eth1:
onboot: 'no'
peerdns: 'no'
eth0:
onboot: 'yes'
peerdns: 'no'
#End data for provision
meta:
memory:
total: 778694656
interfaces:
- mac: '08:00:27:31:09:34'
max_speed: 100
name: eth2
current_speed: 100
- mac: 08:00:27:93:54:B0
max_speed: 100
name: eth1
current_speed: 100
- name: eth0
ip: 10.20.0.95
netmask: 255.255.255.0
mac: 08:00:27:C2:06:DE
max_speed: 100
current_speed: 100
disks:
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-2:0:0:0
name: sdc
size: 2411724800000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-1:0:0:0
name: sdb
size: 536870912000
- model: VBOX HARDDISK
disk: disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0
name: sda
size: 17179869184
system:
serial: '0'
version: '1.2'
fqdn: bootstrap
family: Virtual Machine
manufacturer: VirtualBox
cpu:
real: 0
total: 1
spec:
- model: Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
frequency: 2397
error_type:
network_data:
- name: management
ip: 192.168.6.2/24
vlan: 125
dev: eth0
netmask: 255.255.255.0
brd: 192.168.6.255
gateway: 192.168.6.1
- name: public
ip: 240.0.13.2/24
vlan: 124
dev: eth0
netmask: 255.255.255.0
brd: 240.0.13.255
gateway: 240.0.13.1
- name: storage
ip: 172.16.6.2/24
vlan: 126
dev: eth0
netmask: 255.255.255.0
brd: 172.16.6.255
gateway: 172.16.6.1
- name: management
ip: 192.168.6.5/24
vlan: 125
dev: eth0
netmask: 255.255.255.0
brd: 192.168.6.255
gateway: 192.168.6.1
- name: public
ip: 240.0.13.5/24
vlan: 124
dev: eth0
netmask: 255.255.255.0
brd: 240.0.13.255
gateway: 240.0.13.1
- name: storage
ip: 172.16.6.5/24
vlan: 126
dev: eth0
netmask: 255.255.255.0
brd: 172.16.6.255
gateway: 172.16.6.1
- vlan: 124
name: floating
dev: eth0
- vlan: 127
name: fixed
dev: eth0
- name: admin
dev: eth0
role: controller
online: true
progress: 0
nodes:
- <<: *node_22

View File

@ -1,74 +0,0 @@
# Copyright 2013 Mirantis, Inc.
#
# Licensed 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.
require 'yaml'
require 'rest-client'
require 'json'
module Astute
class Enviroment
def self.load_file(file)
env = YAML.load_file(file)
expand_data(env)
end
def self.expand_data(env)
env['nodes'].each do |node|
net_data = node['interfaces'].values.select { |value| value if value['use_for_provision'] } rescue []
id = api_data.find{ |v| v['id'] if v['mac'] == net_data[0]['mac_address'] }['id']
if net_data.size == 1
node.merge!({
'ip' => net_data[0]['ip_address'],
'power_address' => net_data[0]['ip_address'],
'fqdn' => net_data[0]['dns_name'],
'mac' => net_data[0]['mac_address'],
'id' => id,
'uid' => id
})
p "== 123 ==="
p node['ip']
p node['mac']
p "=== end ==="
else
Astute.logger.error "Not find use_for_provision in #{node[:name]}"
end
end
env
end
def get_data_from_nailgun
# Get additional data from FuelWeb
begin
response = RestClient.get 'http://localhost:8000/api/nodes'
rescue => e
e.response
end
if response.
api_data = JSON.parse(response)
end
def set_param(env, param, new)
env[param]
end
end
end

View File

@ -36,19 +36,6 @@ class Hash
!absent?(key)
end
# def recursive_merge!(other)
# other.keys.each do |k|
# if self[k].is_a?(Array) && other[k].is_a?(Array)
# self[k] += other[k]
# elsif self[k].is_a?(Hash) && other[k].is_a?(Hash)
# self[k].recursive_merge!(other[k])
# else
# self[k] = other[k]
# end
# end
# self
# end
def deep_merge(other_hash)
self.merge(other_hash) do |key, oldval, newval|
oldval = oldval.to_hash if oldval.respond_to?(:to_hash)