1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# Copyright (C) 2013 Adam Stokes <adam.stokes@ubuntu.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
from sos.plugins import Plugin, UbuntuPlugin
from json import loads as json_load
def ensure_service_is_running(service):
def wrapper(callback):
def wrapped_f(self, *args, **kwargs):
try:
result = self.call_ext_prog("service {0} stop".format(service))
if result["status"] != 0:
raise Exception("Cannot stop {0} service".format(service))
callback(self, *args, **kwargs)
except Exception as ex:
self._log_error("Cannot stop {0}, exception: {1}".format(
service,
ex.message))
finally:
self.call_ext_prog("service {0} start".format(service))
return wrapped_f
return wrapper
class Juju(Plugin, UbuntuPlugin):
""" Juju orchestration tool
"""
plugin_name = 'juju'
profiles = ('virt', 'sysmgmt')
packages = ('juju',)
option_list = [
('export-mongodb',
'Export mongodb collections as json files', '', False),
]
def get_deployed_services(self):
cmd = "juju status --format json"
return json_load(
self.call_ext_prog(cmd)['output'])['services'].keys()
@ensure_service_is_running("juju-db")
def export_mongodb(self):
collections = (
"relations",
"environments",
"linkednetworks",
"system",
"settings",
)
for collection in collections:
self.add_cmd_output(
"/usr/lib/juju/bin/mongoexport --ssl \
--dbpath=/var/lib/juju/db --db juju --collection {0} \
--jsonArray".format(collection),
suggest_filename="{}.json".format(collection))
def setup(self):
self.add_copy_spec([
"/var/log/juju",
"/var/lib/juju"
])
self.add_cmd_output([
"juju -v status",
"juju -v get-constraints"
])
for service in self.get_deployed_services():
self.add_cmd_output("juju get {}".format(service))
if self.get_option("export-mongodb"):
self.export_mongodb()
# vim: et ts=4 sw=4
|