47
61
# Supporting functions
48
62
###############################################################################
51
#------------------------------------------------------------------------------
52
# juju_log: calls juju-log and records the message defined by the message
54
#------------------------------------------------------------------------------
55
def juju_log(message=None):
56
return (subprocess.call(['juju-log', str(message)]) == 0)
59
#------------------------------------------------------------------------------
60
# service: Analogous to calling service on the command line to start/stop
61
# and get status of a service/daemon.
63
# service_name: The name of the service to act on.
64
# service_action: The action (start, stop, status, etc.)
65
# Returns: True if the command was successfully executed or False on
67
#------------------------------------------------------------------------------
68
def service(service_name=None, service_action=None):
69
juju_log("service: %s, action: %s" % (service_name, service_action))
70
if service_name is not None and service_action is not None:
71
retVal = subprocess.call(
72
["service", service_name, service_action]) == 0
75
juju_log("service %s %s returns: %s" %
76
(service_name, service_action, retVal))
80
#------------------------------------------------------------------------------
81
# unit_get: Convenience function wrapping the juju command unit-get
83
# setting_name: The setting to get out of unit_get
84
# Returns: The requested information or None on error
85
#------------------------------------------------------------------------------
86
def unit_get(setting_name=None):
87
juju_log("unit_get: %s" % setting_name)
89
cmd_line = ['unit-get', '--format=json']
90
if setting_name is not None:
91
cmd_line.append(setting_name)
92
unit_data = json.loads(subprocess.check_output(cmd_line))
94
subprocess.call(['juju-log', str(e)])
97
juju_log("unit_get %s returns: %s" % (setting_name, unit_data))
101
#------------------------------------------------------------------------------
102
# config_get: Returns a dictionary containing all of the config information
103
# Optional parameter: scope
104
# scope: limits the scope of the returned configuration to the
105
# desired config item.
106
#------------------------------------------------------------------------------
107
def config_get(scope=None):
108
juju_log("config_get: %s" % scope)
110
config_cmd_line = ['config-get']
111
if scope is not None:
112
config_cmd_line.append(scope)
113
config_cmd_line.append('--format=json')
114
config_data = json.loads(subprocess.check_output(config_cmd_line))
119
juju_log("config_get: %s returns: %s" % (scope, config_data))
123
#------------------------------------------------------------------------------
124
# relation_get: Returns a dictionary containing the relation information
125
# Optional parameters: scope, relation_id
126
# scope: limits the scope of the returned data to the
128
# unit_name: limits the data ( and optionally the scope )
129
# to the specified unit
130
# relation_id: specify relation id for out of context usage.
131
#------------------------------------------------------------------------------
132
def relation_get(scope=None, unit_name=None, relation_id=None,
133
wait_for=default_wait_for, max_tries=default_max_tries):
134
juju_log("relation_get: scope: %s, unit_name: %s, relation_id: %s" %
135
(scope, unit_name, relation_id))
138
relation_cmd_line = ['relation-get', '--format=json']
139
if relation_id is not None:
140
relation_cmd_line.extend(('-r', relation_id))
141
if scope is not None:
142
relation_cmd_line.append(scope)
144
relation_cmd_line.append('')
145
if unit_name is not None:
146
relation_cmd_line.append(unit_name)
147
relation_data = json.loads(subprocess.check_output(relation_cmd_line))
149
# while relation_data is None and current_try < max_tries:
150
# time.sleep(wait_for)
151
# relation_data = json.loads(subprocess.check_output(relation_cmd_line))
158
juju_log("relation_get returns: %s" % relation_data)
159
return(relation_data)
162
#------------------------------------------------------------------------------
163
# relation_set: Convenience function wrapping the juju command relation-set
165
# key_value_pairs: A dictionary containing the key/value pairs
167
# Optional Parameter:
168
# relation_id: The relation id to use
169
# Returns: True on success or False on failure
170
#------------------------------------------------------------------------------
171
def relation_set(key_value_pairs=None, relation_id=None):
172
juju_log("relation_set: kv: %s, relation_id: %s" %
173
(key_value_pairs, relation_id))
174
if key_value_pairs is None or not isinstance(key_value_pairs, dict):
175
juju_log("relation_set: Invalid key_value_pais.")
178
relation_cmd_line = ['relation-set', '--format=json']
179
if relation_id is not None:
180
relation_cmd_line.append('-r %s' % relation_id)
181
for (key, value) in key_value_pairs.items():
182
relation_cmd_line.append('%s=%s' % (key, value))
183
retVal = (subprocess.call(relation_cmd_line) == 0)
188
juju_log("relation_set returns: %s" % retVal)
192
def relation_list(relation_id=None, wait_for=default_wait_for,
193
max_tries=default_max_tries):
194
juju_log("relation_list: relation_id: %s" % relation_id)
197
relation_cmd_line = ['relation-list', '--format=json']
198
if relation_id is not None:
199
relation_cmd_line.append('-r %s' % relation_id)
200
relation_data = json.loads(subprocess.check_output(relation_cmd_line))
202
# while relation_data is None and current_try < max_tries:
203
# time.sleep(wait_for)
204
# relation_data = json.loads(subprocess.check_output(relation_cmd_line))
211
juju_log("relation_id %s returns: %s" % (relation_id, relation_data))
212
return(relation_data)
215
#------------------------------------------------------------------------------
216
# open_port: Convenience function to open a port in juju to
218
#------------------------------------------------------------------------------
219
def open_port(port=None, protocol="TCP"):
220
juju_log("open_port: port: %d protocol: %s" % (int(port), protocol))
224
retVal = subprocess.call(['open-port', "%d/%s" %
225
(int(port), protocol)]) == 0
226
juju_log("open_port %d/%s returns: %s" % (int(port), protocol, retVal))
230
#------------------------------------------------------------------------------
231
# close_port: Convenience function to close a port in juju to
233
#------------------------------------------------------------------------------
234
def close_port(port=None, protocol="TCP"):
235
juju_log("close_port: port: %d protocol: %s" % (int(port), protocol))
239
retVal = subprocess.call(['close-port', "%d/%s" %
240
(int(port), protocol)]) == 0
241
juju_log("close_port %d/%s returns: %s" % (int(port), protocol, retVal))
245
64
def port_check(host=None, port=None, protocol='TCP'):
246
65
if host is None or port is None:
247
66
juju_log("port_check: host and port must be defined.")
1085
904
def replica_set_relation_joined():
1086
905
juju_log("replica_set_relation_joined")
1087
906
my_hostname = unit_get('public-address')
1088
my_port = config_get('port')
1089
my_replset = config_get('replicaset')
907
my_port = config('port')
908
my_replset = config('replicaset')
1090
909
my_install_order = os.environ['JUJU_UNIT_NAME'].split('/')[1]
1091
910
juju_log("my_hostname: %s" % my_hostname)
1092
911
juju_log("my_port: %s" % my_port)
1093
912
juju_log("my_replset: %s" % my_replset)
1094
913
juju_log("my_install_order: %s" % my_install_order)
1095
return(enable_replset(my_replset) ==
1099
'hostname': my_hostname,
1101
'replset': my_replset,
1102
'install-order': my_install_order,
914
enabled = enable_replset(my_replset)
915
restarted = restart_mongod()
918
'hostname': my_hostname,
920
'replset': my_replset,
921
'install-order': my_install_order,
925
if enabled and restarted:
1107
930
def replica_set_relation_changed():
1108
931
juju_log("replica_set_relation_changed")
1109
932
my_hostname = unit_get('public-address')
1110
my_port = config_get('port')
933
my_port = config('port')
1111
934
my_install_order = os.environ['JUJU_UNIT_NAME'].split('/')[1]
1112
my_replicaset_master = config_get('replicaset_master')
935
my_replicaset_master = config('replicaset_master')
1114
937
# If we are joining an existing replicaset cluster, just join and leave.
1115
938
if my_replicaset_master != "auto":