cc1  v2.1
CC1 source code docs
 All Classes Namespaces Files Functions Variables Pages
s800_check_networking.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 # @COPYRIGHT_begin
3 #
4 # Copyright [2010-2014] Institute of Nuclear Physics PAN, Krakow, Poland
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 # @COPYRIGHT_end
19 
20 ##
21 #
22 # Compare brigde list on each node with vms in database
23 #
24 #
25 # Jesli musisz to czytac i zmienic to Ci wspolczuje...
26 #
27 from predefined.actions import *
28 from predefined.users import *
29 from predefined.macros import *
30 import settings
31 
32 actions = []
33 actions.append(list_clusters)
34 
35 actions.append(list_admin_vms)
36 actions.append(list_nodes)
37 
38 # Compare number of dnsmasq processes with virtual machines on node
39 actions.append({'type': 'pyscript',
40  'description': 'Compare number of dnsmasq processes with virtual machines on node',
41  'script': '''
42 import subprocess
43 import traceback
44 import sys
45 
46 try:
47  # walk over all nodes (from previous actions - list_nodes)
48  for node in stored_results['nodes']:
49  # Check only unlocked nodes (state == ok)
50  if node['state'] == 1:
51  # Count all dnsmasq processes
52  p = subprocess.Popen('ssh cc1@%s "pgrep -c dnsmasq"' % node['address'], shell=True, stdout=subprocess.PIPE)
53  if p.wait() != 0:
54  r = 'error'
55  log = log + 'Node %s is not responding (ssh)\\n' % node['address']
56  continue
57 
58  dnsmasq = int(p.stdout.read())
59  vms_on_node = []
60 
61  # Collect all vms on this node
62  for vm in stored_results['admin_vms']:
63  if vm['node'] == node['address']:
64  vms_on_node.append(vm)
65 
66  # Compare dnsmasq processes with vms on node
67  if len(vms_on_node) != dnsmasq:
68  r = 'error'
69  log = log + "Node %s has inconsistent networking\\n" % node["address"]
70 except Exception, e:
71  log = log + 'Exception: %s' % str(e)
72  r = 'error'
73  traceback.print_exc(limit=sys.getrecursionlimit())
74 '''})
75 
76 # Compare bridges with libvirt networks
77 actions.append({'type': 'pyscript',
78  'description': 'Compare bridges with libvirt networks',
79  'script': '''
80 import subprocess
81 import sys
82 import traceback
83 
84 try:
85  for node in stored_results['nodes']:
86  if node['state'] == 1:
87  # List all bridges on node without vm interfaces (which also are called bridgeNNNN-nic
88  p = subprocess.Popen('ssh cc1@%s "ls -1 /sys/class/net/ | grep br | grep -v nic"' % node['address'], shell=True, stdout=subprocess.PIPE)
89  if p.wait() != 0:
90  r = 'error'
91  log = log + 'Node %s is not responding (ssh)\\n' % node['address']
92  continue
93 
94  # Prepare output to easy compare with virsh output
95  bridges = p.stdout.read().splitlines()
96  bridges = [b.replace('br', 'net') for b in bridges]
97 
98  # Ask libvirt to list networks on node
99  p = subprocess.Popen('ssh cc1@%s "virsh -q -c qemu:///system net-list | tr -s \\' \\' | cut -d \\' \\' -f 1"' % node['address'], shell=True, stdout=subprocess.PIPE)
100  if p.wait() != 0:
101  r = 'error'
102  log = log + 'Node %s is not responding (virsh)\\n' % node['address']
103  continue
104  networks = p.stdout.read().splitlines()
105 
106  bridges.sort()
107  networks.sort()
108 
109  # Compare two outputs
110  if networks != bridges:
111  r = 'error'
112  log = log + "Node %s has inconsistent networking\\n" % node["address"]
113 except Exception, e:
114  log = log + 'Exception: %s' % str(e)
115  r = 'error'
116  traceback.print_exc(limit=sys.getrecursionlimit())
117 '''})
118 
119