308
308
def __call__(self, manager, service_name, event_name):
309
309
service = manager.get_service(service_name)
310
new_ports = service.get('ports', [])
310
# turn this generator into a list,
311
# as we'll be going over it multiple times
312
new_ports = list(service.get('ports', []))
311
313
port_file = os.path.join(hookenv.charm_dir(), '.{}.ports'.format(service_name))
312
314
if os.path.exists(port_file):
313
315
with open(port_file) as fp:
314
316
old_ports = fp.read().split(',')
315
317
for old_port in old_ports:
317
old_port = int(old_port)
318
if old_port not in new_ports:
319
hookenv.close_port(old_port)
318
if bool(old_port) and not self.ports_contains(old_port, new_ports):
319
hookenv.close_port(old_port)
320
320
with open(port_file, 'w') as fp:
321
321
fp.write(','.join(str(port) for port in new_ports))
322
322
for port in new_ports:
323
# A port is either a number or 'ICMP'
325
if str(port).upper() == 'ICMP':
323
327
if event_name == 'start':
324
hookenv.open_port(port)
328
hookenv.open_port(port, protocol)
325
329
elif event_name == 'stop':
326
hookenv.close_port(port)
330
hookenv.close_port(port, protocol)
332
def ports_contains(self, port, ports):
335
if str(port).upper() != 'ICMP':
329
340
def service_stop(service_name):