File: //proc/self/root/usr/lib/python2.7/site-packages/salt/modules/rallydev.py
# -*- coding: utf-8 -*-
'''
Support for RallyDev
.. versionadded:: 2015.8.0
Requires a ``username`` and a ``password`` in ``/etc/salt/minion``:
.. code-block:: yaml
rallydev:
username: myuser@example.com
password: 123pass
'''
# Import python libs
from __future__ import absolute_import, print_function, unicode_literals
import logging
# Import salt libs
from salt.exceptions import SaltInvocationError
import salt.utils.http
import salt.utils.json
log = logging.getLogger(__name__)
def __virtual__():
'''
Only load the module if apache is installed
'''
if not __opts__.get('rallydev', {}).get('username', None):
return (False, 'The rallydev execution module failed to load: rallydev:username not defined in config.')
if not __opts__.get('rallydev', {}).get('password', None):
return (False, 'The rallydev execution module failed to load: rallydev:password not defined in config.')
return True
def _get_token():
'''
Get an auth token
'''
username = __opts__.get('rallydev', {}).get('username', None)
password = __opts__.get('rallydev', {}).get('password', None)
path = 'https://rally1.rallydev.com/slm/webservice/v2.0/security/authorize'
result = salt.utils.http.query(
path,
decode=True,
decode_type='json',
text=True,
status=True,
username=username,
password=password,
cookies=True,
persist_session=True,
opts=__opts__,
)
if 'dict' not in result:
return None
return result['dict']['OperationResult']['SecurityToken']
def _query(action=None,
command=None,
args=None,
method='GET',
header_dict=None,
data=None):
'''
Make a web call to RallyDev.
'''
token = _get_token()
username = __opts__.get('rallydev', {}).get('username', None)
password = __opts__.get('rallydev', {}).get('password', None)
path = 'https://rally1.rallydev.com/slm/webservice/v2.0/'
if action:
path += action
if command:
path += '/{0}'.format(command)
log.debug('RallyDev URL: %s', path)
if not isinstance(args, dict):
args = {}
args['key'] = token
if header_dict is None:
header_dict = {'Content-type': 'application/json'}
if method != 'POST':
header_dict['Accept'] = 'application/json'
decode = True
if method == 'DELETE':
decode = False
return_content = None
result = salt.utils.http.query(
path,
method,
params=args,
data=data,
header_dict=header_dict,
decode=decode,
decode_type='json',
text=True,
status=True,
username=username,
password=password,
cookies=True,
persist_session=True,
opts=__opts__,
)
log.debug('RallyDev Response Status Code: %s', result['status'])
if 'error' in result:
log.error(result['error'])
return [result['status'], result['error']]
return [result['status'], result.get('dict', {})]
def list_items(name):
'''
List items of a particular type
CLI Examples:
.. code-block:: bash
salt myminion rallydev.list_<item name>s
salt myminion rallydev.list_users
salt myminion rallydev.list_artifacts
'''
status, result = _query(action=name)
return result
def query_item(name, query_string, order='Rank'):
'''
Query a type of record for one or more items. Requires a valid query string.
See https://rally1.rallydev.com/slm/doc/webservice/introduction.jsp for
information on query syntax.
CLI Example:
.. code-block:: bash
salt myminion rallydev.query_<item name> <query string> [<order>]
salt myminion rallydev.query_task '(Name contains github)'
salt myminion rallydev.query_task '(Name contains reactor)' Rank
'''
status, result = _query(
action=name,
args={'query': query_string,
'order': order}
)
return result
def show_item(name, id_):
'''
Show an item
CLI Example:
.. code-block:: bash
salt myminion rallydev.show_<item name> <item id>
'''
status, result = _query(action=name, command=id_)
return result
def update_item(name, id_, field=None, value=None, postdata=None):
'''
Update an item. Either a field and a value, or a chunk of POST data, may be
used, but not both.
CLI Example:
.. code-block:: bash
salt myminion rallydev.update_<item name> <item id> field=<field> value=<value>
salt myminion rallydev.update_<item name> <item id> postdata=<post data>
'''
if field and value:
if postdata:
raise SaltInvocationError('Either a field and a value, or a chunk '
'of POST data, may be specified, but not both.')
postdata = {name.title(): {field: value}}
if postdata is None:
raise SaltInvocationError('Either a field and a value, or a chunk of '
'POST data must be specified.')
status, result = _query(
action=name,
command=id_,
method='POST',
data=salt.utils.json.dumps(postdata),
)
return result
def show_artifact(id_):
'''
Show an artifact
CLI Example:
.. code-block:: bash
salt myminion rallydev.show_artifact <artifact id>
'''
return show_item('artifact', id_)
def list_users():
'''
List the users
CLI Example:
.. code-block:: bash
salt myminion rallydev.list_users
'''
return list_items('user')
def show_user(id_):
'''
Show a user
CLI Example:
.. code-block:: bash
salt myminion rallydev.show_user <user id>
'''
return show_item('user', id_)
def update_user(id_, field, value):
'''
Update a user
CLI Example:
.. code-block:: bash
salt myminion rallydev.update_user <user id> <field> <new value>
'''
return update_item('user', id_, field, value)
def query_user(query_string, order='UserName'):
'''
Update a user
CLI Example:
.. code-block:: bash
salt myminion rallydev.query_user '(Name contains Jo)'
'''
return query_item('user', query_string, order)