mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Fixed XenOrchestra inventory plugin failing due to not checking response ID. (#6227)
* Added call method to select proper response from xo server * Added changelog fragment * Removed excess blank lines * Moved period in changelog fragment * Made suggested changes * Remove f-strings for Python 2.7 compatibility Co-authored-by: Felix Fontein <felix@fontein.de> --------- Co-authored-by: Linus Kirkwood <lkirkwood@allette.com.au> Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
81b16a88ee
commit
cd706454ec
2 changed files with 32 additions and 8 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- xenorchestra inventory plugin - fix failure to receive objects from server due to not checking the id of the response (https://github.com/ansible-collections/community.general/pull/6227).
|
|
@ -78,6 +78,7 @@ compose:
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import ssl
|
import ssl
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
|
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
|
||||||
|
@ -138,21 +139,42 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
self.conn = create_connection(
|
self.conn = create_connection(
|
||||||
'{0}://{1}/api/'.format(proto, xoa_api_host), sslopt=sslopt)
|
'{0}://{1}/api/'.format(proto, xoa_api_host), sslopt=sslopt)
|
||||||
|
|
||||||
|
CALL_TIMEOUT = 100
|
||||||
|
"""Number of 1/10ths of a second to wait before method call times out."""
|
||||||
|
|
||||||
|
def call(self, method, params):
|
||||||
|
"""Calls a method on the XO server with the provided parameters."""
|
||||||
|
id = self.pointer
|
||||||
|
self.conn.send(json.dumps({
|
||||||
|
'id': id,
|
||||||
|
'jsonrpc': '2.0',
|
||||||
|
'method': method,
|
||||||
|
'params': params
|
||||||
|
}))
|
||||||
|
|
||||||
|
waited = 0
|
||||||
|
while waited < self.CALL_TIMEOUT:
|
||||||
|
response = json.loads(self.conn.recv())
|
||||||
|
if 'id' in response and response['id'] == id:
|
||||||
|
return response
|
||||||
|
else:
|
||||||
|
sleep(0.1)
|
||||||
|
waited += 1
|
||||||
|
|
||||||
|
raise AnsibleError(
|
||||||
|
'Method call {method} timed out after {timeout} seconds.'.format(method=method, timeout=self.CALL_TIMEOUT / 10))
|
||||||
|
|
||||||
def login(self, user, password):
|
def login(self, user, password):
|
||||||
payload = {'id': self.pointer, 'jsonrpc': '2.0', 'method': 'session.signIn', 'params': {
|
result = self.call('session.signIn', {
|
||||||
'username': user, 'password': password}}
|
'username': user, 'password': password
|
||||||
self.conn.send(json.dumps(payload))
|
})
|
||||||
result = json.loads(self.conn.recv())
|
|
||||||
|
|
||||||
if 'error' in result:
|
if 'error' in result:
|
||||||
raise AnsibleError(
|
raise AnsibleError(
|
||||||
'Could not connect: {0}'.format(result['error']))
|
'Could not connect: {0}'.format(result['error']))
|
||||||
|
|
||||||
def get_object(self, name):
|
def get_object(self, name):
|
||||||
payload = {'id': self.pointer, 'jsonrpc': '2.0',
|
answer = self.call('xo.getAllObjects', {'filter': {'type': name}})
|
||||||
'method': 'xo.getAllObjects', 'params': {'filter': {'type': name}}}
|
|
||||||
self.conn.send(json.dumps(payload))
|
|
||||||
answer = json.loads(self.conn.recv())
|
|
||||||
|
|
||||||
if 'error' in answer:
|
if 'error' in answer:
|
||||||
raise AnsibleError(
|
raise AnsibleError(
|
||||||
|
|
Loading…
Reference in a new issue