support pep8 check
[doctor.git] / doctor_tests / monitor / collectd.py
1 ##############################################################################
2 # Copyright (c) 2017 NEC Corporation and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9 import os
10 import socket
11 import getpass
12
13 from doctor_tests.monitor.base import BaseMonitor
14
15
16 class CollectdMonitor(BaseMonitor):
17     def __init__(self, conf, inspector_url, log):
18         super(CollectdMonitor, self).__init__(conf, inspector_url, log)
19         monitor_dir = os.path.split(os.path.realpath(__file__))[0]
20         self.top_dir = os.path.dirname(monitor_dir)
21         tmp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
22         tmp_sock.connect(("8.8.8.8", 80))
23
24         # control_ip is the IP of primary interface of control node i.e.
25         # eth0, eno1. It is used by collectd monitor to communicate with
26         # sample inspector.
27         # TODO (umar) see if mgmt IP of control is a better option. Also
28         # primary interface may not be the right option
29         self.control_ip = tmp_sock.getsockname()[0]
30         self.compute_user = getpass.getuser()
31         self.interface_name = os.environ.get('INTERFACE_NAME') or ''
32         self.inspector_type = os.environ.get('INSPECTOR_TYPE', 'sample')
33         self.auth_url = os.environ.get('OS_AUTH_URL')
34         self.username = os.environ.get('OS_USERNAME')
35         self.password = os.environ.get('OS_PASSWORD')
36         self.project_name = os.environ.get('OS_PROJECT_NAME')
37         self.user_domain_name = \
38             os.environ.get('OS_USER_DOMAIN_NAME') or 'default'
39         self.user_domain_id = os.environ.get('OS_USER_DOMAIN_ID')
40         self.project_domain_name = \
41             os.environ.get('OS_PROJECT_DOMAIN_NAME') or 'default'
42         self.project_domain_id = os.environ.get('OS_PROJECT_DOMAIN_ID')
43         self.ssh_opts_cpu = \
44             '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
45
46     def start(self, host):
47         self.log.info("Collectd monitor start.........")
48         self.compute_host = host.name
49         self.compute_ip = host.ip
50         f = open("%s/collectd.conf" % self.top_dir, 'w')
51         collectd_conf_file = """
52 Hostname %s
53 FQDNLookup false
54 Interval 1
55 MaxReadInterval 2
56
57 <LoadPlugin python>
58 Globals true
59 </LoadPlugin>
60 LoadPlugin ovs_events
61 LoadPlugin logfile
62
63 <Plugin logfile>
64     File \"/var/log/collectd.log\"
65     Timestamp true
66     LogLevel \"info\"
67 </Plugin>
68
69 <Plugin python>
70     ModulePath \"/home/%s\"
71     LogTraces true
72     Interactive false
73     Import \"collectd_plugin\"
74     <Module \"collectd_plugin\">
75         control_ip \"%s\"
76         compute_ip \"%s\"
77         compute_host \"%s\"
78         compute_user \"%s\"
79         inspector_type \"%s\"
80         os_auth_url \"%s\"
81         os_username \"%s\"
82         os_password \"%s\"
83         os_project_name \"%s\"
84         os_user_domain_name \"%s\"
85         os_user_domain_id \"%s\"
86         os_project_domain_name \"%s\"
87         os_project_domain_id \"%s\"
88     </Module>
89 </Plugin>
90
91 <Plugin ovs_events>
92     Port 6640
93     Socket \"/var/run/openvswitch/db.sock\"
94     Interfaces \"@INTERFACE_NAME@\"
95     SendNotification true
96     DispatchValues false
97 </Plugin>
98             """ % (self.compute_host, self.compute_user, self.control_ip,
99                    self.compute_ip, self.compute_host, self.compute_user,
100                    self.inspector_type, self.auth_url, self.username,
101                    self.password, self.project_name, self.user_domain_name,
102                    self.user_domain_id, self.project_domain_name,
103                    self.project_domain_id)
104         f.write(collectd_conf_file)
105         f.close()
106
107         os.system("scp %s %s/collectd.conf %s@%s: "
108                   % (self.ssh_opts_cpu, self.top_dir,
109                      self.compute_user, self.compute_ip))
110         self.log.info("after first scp")
111         # @TODO (umar) Always assuming that the interface is assigned an IP if
112         # interface name is not provided. See if there is a better approach
113         os.system(""" ssh %s %s@%s \"if [ -n \"%s\" ]; then
114             dev=%s
115         else
116             dev=\$(sudo ip a | awk '/ %s\//{print \$NF}')
117         fi
118         sed -i -e \"s/@INTERFACE_NAME@/\$dev/\" collectd.conf
119         collectd_conf=/opt/collectd/etc/collectd.conf
120         if [ -e \$collectd_conf ]; then
121             sudo cp \$collectd_conf \${collectd_conf}-doctor-saved
122         else
123             sudo touch \${collectd_conf}-doctor-created
124         fi
125         sudo mv collectd.conf /opt/collectd/etc/collectd.conf\" """
126                   % (self.ssh_opts_cpu, self.compute_user,
127                      self.compute_ip, self.interface_name,
128                      self.interface_name, self.compute_ip))
129         self.log.info("after first ssh")
130         os.system("scp %s %s/monitor/collectd_plugin.py"
131                   "%s@%s:collectd_plugin.py"
132                   % (self.ssh_opts_cpu, self.top_dir,
133                      self.compute_user, self.compute_ip))
134         self.log.info("after sec scp")
135         os.system("ssh %s %s@%s \"sudo pkill collectd;"
136                   "sudo /opt/collectd/sbin/collectd\" "
137                   % (self.ssh_opts_cpu, self.compute_user, self.compute_ip))
138         self.log.info("after sec ssh")
139
140     def stop(self):
141         os.system(" ssh %s %s@%s \"sudo pkill collectd\" "
142                   % (self.ssh_opts_cpu, self.compute_user, self.compute_ip))
143
144     def cleanup(self):
145         os.system(""" ssh %s %s@%s \"
146             collectd_conf=/opt/collectd/etc/collectd.conf
147             if [ -e \"\${collectd_conf}-doctor-created\" ]; then
148                 sudo rm \"\${collectd_conf}-doctor-created\"
149                 sudo rm \$collectd_conf
150             elif [ -e \"\${collectd_conf}-doctor-saved\" ]; then
151                 sudo cp -f \"\${collectd_conf}-doctor-saved\" \$collectd_conf
152                 sudo rm \"\${collectd_conf}-doctor-saved\"
153             fi\" """ % (self.ssh_opts_cpu, self.compute_user, self.compute_ip))
154         os.remove("%s/collectd.conf" % self.top_dir)