mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 17:33:54 +00:00
Merge pull request #19293 from DSRCompany/raet_presence_requests
Support joined, allowed, alived and reaped runners.
This commit is contained in:
commit
0487834e72
@ -1116,7 +1116,9 @@ class SaltRaetPresenter(ioflo.base.deeding.Deed):
|
||||
Ioinits = {'opts': '.salt.opts',
|
||||
'presence_req': '.salt.presence.event_req',
|
||||
'lane_stack': '.salt.lane.manor.stack',
|
||||
'alloweds': '.salt.var.presence.alloweds', # odict
|
||||
'aliveds': '.salt.var.presence.aliveds', # odict
|
||||
'reapeds': '.salt.var.presence.reapeds', # odict
|
||||
'availables': '.salt.var.presence.availables', # set
|
||||
}
|
||||
|
||||
@ -1129,12 +1131,43 @@ class SaltRaetPresenter(ioflo.base.deeding.Deed):
|
||||
if y_name not in self.lane_stack.value.nameRemotes: # subscriber not a remote
|
||||
pass # drop msg don't answer
|
||||
else:
|
||||
if 'data' in msg and 'state' in msg['data']:
|
||||
state = msg['data']['state']
|
||||
else:
|
||||
state = None
|
||||
# create answer message
|
||||
present = odict()
|
||||
for name in self.availables.value:
|
||||
minion = self.aliveds.value[name]
|
||||
present[name] = minion.ha[0] if minion else None
|
||||
data = {'present': present}
|
||||
if state is None or state == 'available' or state == 'present':
|
||||
present = odict()
|
||||
for name in self.availables.value:
|
||||
minion = self.aliveds.value[name]
|
||||
present[name] = minion.ha[0] if minion else None
|
||||
data = {'present': present}
|
||||
elif state == 'joined':
|
||||
joined = odict()
|
||||
# For now use alloweds here.
|
||||
# TODO: update to really return joineds
|
||||
for name in self.alloweds.value:
|
||||
joined[name] = self.alloweds.value[name].ha[0]
|
||||
data = {'joined': joined}
|
||||
elif state == 'allowed':
|
||||
allowed = odict()
|
||||
for name in self.alloweds.value:
|
||||
allowed[name] = self.alloweds.value[name].ha[0]
|
||||
data = {'allowed': allowed}
|
||||
elif state == 'alived':
|
||||
alived = odict()
|
||||
for name in self.aliveds.value:
|
||||
alived[name] = self.aliveds.value[name].ha[0]
|
||||
data = {'alived': alived}
|
||||
elif state == 'reaped':
|
||||
reaped = odict()
|
||||
for name in self.reapeds.value:
|
||||
reaped[name] = self.reapeds.value[name].ha[0]
|
||||
data = {'reaped': reaped}
|
||||
else:
|
||||
# error: wrong/unknown state requested
|
||||
log.error('Lane Router Received invalid message: {0}'.format(msg))
|
||||
return
|
||||
tag = tagify('present', 'presence')
|
||||
route = {'dst': (None, None, 'event_fire'),
|
||||
'src': (None, self.lane_stack.value.local.name, None)}
|
||||
|
@ -134,10 +134,95 @@ def up(): # pylint: disable=C0103
|
||||
return ret
|
||||
|
||||
|
||||
def list_state(subset=None, show_ipv4=False, state=None):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
state : 'available'
|
||||
Show minions being in specific state that is one of 'available', 'joined',
|
||||
'allowed', 'alived' or 'reaped'.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.list_state
|
||||
'''
|
||||
conf_file = __opts__['conf_file']
|
||||
opts = salt.config.client_config(conf_file)
|
||||
if opts['transport'] == 'raet':
|
||||
event = salt.utils.raetevent.PresenceEvent(__opts__, __opts__['sock_dir'], state=state)
|
||||
data = event.get_event(wait=60, tag=salt.utils.event.tagify('present', 'presence'))
|
||||
key = 'present' if state is None else state
|
||||
if not data or key not in data:
|
||||
minions = []
|
||||
else:
|
||||
minions = data[key]
|
||||
if subset:
|
||||
minions = [m for m in minions if m in subset]
|
||||
else:
|
||||
# Always return 'present' for 0MQ for now
|
||||
# TODO: implement other states spport for 0MQ
|
||||
ckminions = salt.utils.minions.CkMinions(__opts__)
|
||||
minions = ckminions.connected_ids(show_ipv4=show_ipv4, subset=subset)
|
||||
|
||||
connected = dict(minions) if show_ipv4 else sorted(minions)
|
||||
|
||||
return connected
|
||||
|
||||
|
||||
def list_not_state(subset=None, show_ipv4=False, state=None):
|
||||
'''
|
||||
Print a list of all minions that are NOT up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
state : 'available'
|
||||
Show minions being in specific state that is one of 'available', 'joined',
|
||||
'allowed', 'alived' or 'reaped'.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.list_not_state
|
||||
'''
|
||||
connected = list_state(subset=None, show_ipv4=show_ipv4, state=state)
|
||||
|
||||
key = salt.key.get_key(__opts__)
|
||||
keys = key.list_keys()
|
||||
|
||||
# TODO: Need better way to handle key/node name difference for raet
|
||||
# In raet case node name is '<name>_<kind>' meanwhile the key name
|
||||
# is just '<name>'. So append '_minion' to the name to match.
|
||||
appen_kind = isinstance(key, salt.key.RaetKey)
|
||||
|
||||
not_connected = []
|
||||
for minion in keys[key.ACC]:
|
||||
if appen_kind:
|
||||
minion += '_minion'
|
||||
if minion not in connected and (subset is None or minion in subset):
|
||||
not_connected.append(minion)
|
||||
|
||||
return not_connected
|
||||
|
||||
|
||||
def present(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent)
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
@ -151,20 +236,7 @@ def present(subset=None, show_ipv4=False):
|
||||
|
||||
salt-run manage.present
|
||||
'''
|
||||
conf_file = __opts__['conf_file']
|
||||
opts = salt.config.client_config(conf_file)
|
||||
if opts['transport'] == 'raet':
|
||||
event = salt.utils.raetevent.PresenceEvent(__opts__, __opts__['sock_dir'])
|
||||
data = event.get_event(wait=60, tag=salt.utils.event.tagify('present', 'presence'))
|
||||
present = data['present'] if data else []
|
||||
minions = [m for m in present if m in subset] if subset else present
|
||||
else:
|
||||
ckminions = salt.utils.minions.CkMinions(__opts__)
|
||||
minions = ckminions.connected_ids(show_ipv4=show_ipv4, subset=subset)
|
||||
|
||||
connected = dict(minions) if show_ipv4 else sorted(minions)
|
||||
|
||||
return connected
|
||||
return list_state(subset=subset, show_ipv4=show_ipv4)
|
||||
|
||||
|
||||
def not_present(subset=None, show_ipv4=False):
|
||||
@ -184,24 +256,167 @@ def not_present(subset=None, show_ipv4=False):
|
||||
|
||||
salt-run manage.not_present
|
||||
'''
|
||||
connected = present(subset=None, show_ipv4=show_ipv4)
|
||||
return list_not_state(subset=subset, show_ipv4=show_ipv4)
|
||||
|
||||
key = salt.key.get_key(__opts__)
|
||||
keys = key.list_keys()
|
||||
|
||||
# TODO: Need better way to handle key/node name difference for raet
|
||||
# In raet case node name is '<name>_<kind>' meanwhile the key name
|
||||
# is just '<name>'. So append '_minion' to the name to match.
|
||||
appen_kind = isinstance(key, salt.key.RaetKey)
|
||||
def joined(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
not_connected = []
|
||||
for minion in keys[key.ACC]:
|
||||
if appen_kind:
|
||||
minion += '_minion'
|
||||
if minion not in connected and (subset is None or minion in subset):
|
||||
not_connected.append(minion)
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
return not_connected
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.joined
|
||||
'''
|
||||
return list_state(subset=subset, show_ipv4=show_ipv4, state='joined')
|
||||
|
||||
|
||||
def not_joined(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are NOT up according to Salt's presence
|
||||
detection (no commands will be sent)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.not_joined
|
||||
'''
|
||||
return list_not_state(subset=subset, show_ipv4=show_ipv4, state='joined')
|
||||
|
||||
|
||||
def allowed(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.allowed
|
||||
'''
|
||||
return list_state(subset=subset, show_ipv4=show_ipv4, state='allowed')
|
||||
|
||||
|
||||
def not_allowed(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are NOT up according to Salt's presence
|
||||
detection (no commands will be sent)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.not_allowed
|
||||
'''
|
||||
return list_not_state(subset=subset, show_ipv4=show_ipv4, state='allowed')
|
||||
|
||||
|
||||
def alived(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.alived
|
||||
'''
|
||||
return list_state(subset=subset, show_ipv4=show_ipv4, state='alived')
|
||||
|
||||
|
||||
def not_alived(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are NOT up according to Salt's presence
|
||||
detection (no commands will be sent)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.not_alived
|
||||
'''
|
||||
return list_not_state(subset=subset, show_ipv4=show_ipv4, state='alived')
|
||||
|
||||
|
||||
def reaped(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are up according to Salt's presence
|
||||
detection (no commands will be sent to minions)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.reaped
|
||||
'''
|
||||
return list_state(subset=subset, show_ipv4=show_ipv4, state='reaped')
|
||||
|
||||
|
||||
def not_reaped(subset=None, show_ipv4=False):
|
||||
'''
|
||||
Print a list of all minions that are NOT up according to Salt's presence
|
||||
detection (no commands will be sent)
|
||||
|
||||
subset : None
|
||||
Pass in a CIDR range to filter minions by IP address.
|
||||
|
||||
show_ipv4 : False
|
||||
Also show the IP address each minion is connecting from.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run manage.not_reaped
|
||||
'''
|
||||
return list_not_state(subset=subset, show_ipv4=show_ipv4, state='reaped')
|
||||
|
||||
|
||||
def safe_accept(target, expr_form='glob'):
|
||||
|
@ -277,6 +277,10 @@ class RunnerEvent(MasterEvent):
|
||||
|
||||
class PresenceEvent(MasterEvent):
|
||||
|
||||
def __init__(self, opts, sock_dir, listen=True, state=None):
|
||||
self.state = state
|
||||
super(PresenceEvent, self).__init__(opts=opts, sock_dir=sock_dir, listen=listen)
|
||||
|
||||
def connect_pub(self):
|
||||
'''
|
||||
Establish the publish connection
|
||||
@ -286,6 +290,8 @@ class PresenceEvent(MasterEvent):
|
||||
route = {'dst': (None, self.ryn, 'presence_req'),
|
||||
'src': (None, self.stack.local.name, None)}
|
||||
msg = {'route': route}
|
||||
if self.state:
|
||||
msg['data'] = {'state': self.state}
|
||||
self.stack.transmit(msg, self.stack.nameRemotes[self.ryn].uid)
|
||||
self.stack.serviceAll()
|
||||
self.connected = True
|
||||
|
Loading…
Reference in New Issue
Block a user