diff mbox

xmlrpc: Add a check_create function

Message ID 1455828422-4925-1-git-send-email-andy.doan@linaro.org
State Superseded
Delegated to: Stephen Finucane
Headers show

Commit Message

Andy Doan Feb. 18, 2016, 8:47 p.m. UTC
This changes adds the ability to create Check objects via the XMLRPC
interface. It includes a corresponding helper to the pwclient script.
The command can be used like:

 pwclient check_create -c context1 -s success -u http://f.com \
    -d "desc of check" PATCH_ID

Signed-off-by: Andy Doan <andy.doan@linaro.org>
---
 patchwork/bin/pwclient    | 28 ++++++++++++++++++++++++++--
 patchwork/views/xmlrpc.py | 31 +++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 2 deletions(-)

Comments

Stephen Finucane Feb. 24, 2016, 8:56 p.m. UTC | #1
On 18 Feb 14:47, Andy Doan wrote:
> This changes adds the ability to create Check objects via the XMLRPC
> interface. It includes a corresponding helper to the pwclient script.
> The command can be used like:
> 
>  pwclient check_create -c context1 -s success -u http://f.com \
>     -d "desc of check" PATCH_ID
> 
> Signed-off-by: Andy Doan <andy.doan@linaro.org>

Looks great. One minor nit below, but I'm otherwise happy to merge.

Stephen

> ---
>  patchwork/bin/pwclient    | 28 ++++++++++++++++++++++++++--
>  patchwork/views/xmlrpc.py | 31 +++++++++++++++++++++++++++++++
>  2 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/patchwork/bin/pwclient b/patchwork/bin/pwclient
> index a271132..be18933 100755
> --- a/patchwork/bin/pwclient
> +++ b/patchwork/bin/pwclient
> @@ -242,6 +242,13 @@ def action_checks(rpc):
>          print("%d (for '%s')" % (check['id'], check['patch']))
>  
>  
> +def action_check_create(rpc, patch_id, context, state, url, description):
> +    try:
> +        rpc.check_create(patch_id, context, state, url, description)
> +    except xmlrpclib.Fault as f:
> +        sys.stderr.write("Error creating check: %s\n" % f.faultString)
> +
> +
>  def action_states(rpc):
>      states = rpc.state_list("", 0)
>      print("%-5s %s" % ("ID", "Name"))
> @@ -366,7 +373,7 @@ def patch_id_from_hash(rpc, project, hash):
>          sys.exit(1)
>      return patch_id
>  
> -auth_actions = ['update']
> +auth_actions = ['check_create', 'update']
>  
>  
>  def main():
> @@ -473,6 +480,18 @@ def main():
>          help='''Show list of patch checks'''
>      )
>      checks_parser.set_defaults(subcmd='checks')
> +    check_create_parser = subparsers.add_parser(
> +        'check_create', parents=[hash_parser], conflict_handler='resolve',
> +        help='Add a check to a patch')

Could you rename this as 'check-create'. This seems a little more natural,
IMO, and would set us up nicely to rename 'checks' to 'check-list' and
perhaps add a 'check-show' function.

> +    check_create_parser.set_defaults(subcmd='check_create')
> +    check_create_parser.add_argument(
> +        '-c', metavar='CONTEXT')
> +    check_create_parser.add_argument(
> +        '-s', choices=('pending', 'success', 'warning', 'fail'))
> +    check_create_parser.add_argument(
> +        '-u', metavar='TARGET_URL', default="")
> +    check_create_parser.add_argument(
> +        '-d', metavar='DESCRIPTION', default="")
>      states_parser = subparsers.add_parser(
>          'states',
>          help='''Show list of potential patch states'''
> @@ -689,7 +708,7 @@ def main():
>      elif action.startswith('project'):
>          action_projects(rpc)
>  
> -    elif action.startswith('check'):
> +    elif action.startswith('checks'):
>          action_checks(rpc)
>  
>      elif action.startswith('state'):
> @@ -747,6 +766,11 @@ def main():
>                                  archived=archived_str, commit=commit_str
>                                  )
>  
> +    elif action == 'check_create':
> +        for patch_id in non_empty(h, patch_ids):
> +            action_check_create(
> +                rpc, patch_id, args['c'], args['s'], args['u'], args['d'])
> +
>      else:
>          sys.stderr.write("Unknown action '%s'\n" % action)
>          action_parser.print_help()
> diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py
> index 2881afb..7ad34d8 100644
> --- a/patchwork/views/xmlrpc.py
> +++ b/patchwork/views/xmlrpc.py
> @@ -959,6 +959,37 @@ def check_get(check_id):
>          return {}
>  
>  
> +@xmlrpc_method(login_required=True)
> +def check_create(user, patch_id, context, state, target_url="",
> +                 description=""):
> +    """Add a Check to a patch.
> +
> +    **NOTE:** Authentication is required for this method.
> +
> +    Args:
> +        patch_id (id): The ID of the patch to create the check against.
> +        context: Type of test or system that generated this check.
> +        state: "pending", "success", "warning", or "fail"
> +        target_url: Link to artifact(s) relating to this check.
> +        description: A brief description of the check.
> +
> +    Returns:
> +        True, if successful else raise exception.
> +    """
> +    patch = Patch.objects.get(id=patch_id)
> +    if not patch.is_editable(user):
> +        raise Exception('No permissions to edit this patch')
> +    for state_val, state_str in Check.STATE_CHOICES:
> +        if state == state_str:
> +            state = state_val
> +            break
> +    else:
> +        raise Exception("Invalid check state: %s" % state)
> +    Check.objects.create(patch=patch, context=context, state=state, user=user,
> +                         target_url=target_url, description=description)
> +    return True
> +
> +
>  @xmlrpc_method()
>  def patch_check_get(patch_id):
>      """Get a patch's combined checks by its ID.
> -- 
> 2.5.0
> 
> _______________________________________________
> Patchwork mailing list
> Patchwork@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork
diff mbox

Patch

diff --git a/patchwork/bin/pwclient b/patchwork/bin/pwclient
index a271132..be18933 100755
--- a/patchwork/bin/pwclient
+++ b/patchwork/bin/pwclient
@@ -242,6 +242,13 @@  def action_checks(rpc):
         print("%d (for '%s')" % (check['id'], check['patch']))
 
 
+def action_check_create(rpc, patch_id, context, state, url, description):
+    try:
+        rpc.check_create(patch_id, context, state, url, description)
+    except xmlrpclib.Fault as f:
+        sys.stderr.write("Error creating check: %s\n" % f.faultString)
+
+
 def action_states(rpc):
     states = rpc.state_list("", 0)
     print("%-5s %s" % ("ID", "Name"))
@@ -366,7 +373,7 @@  def patch_id_from_hash(rpc, project, hash):
         sys.exit(1)
     return patch_id
 
-auth_actions = ['update']
+auth_actions = ['check_create', 'update']
 
 
 def main():
@@ -473,6 +480,18 @@  def main():
         help='''Show list of patch checks'''
     )
     checks_parser.set_defaults(subcmd='checks')
+    check_create_parser = subparsers.add_parser(
+        'check_create', parents=[hash_parser], conflict_handler='resolve',
+        help='Add a check to a patch')
+    check_create_parser.set_defaults(subcmd='check_create')
+    check_create_parser.add_argument(
+        '-c', metavar='CONTEXT')
+    check_create_parser.add_argument(
+        '-s', choices=('pending', 'success', 'warning', 'fail'))
+    check_create_parser.add_argument(
+        '-u', metavar='TARGET_URL', default="")
+    check_create_parser.add_argument(
+        '-d', metavar='DESCRIPTION', default="")
     states_parser = subparsers.add_parser(
         'states',
         help='''Show list of potential patch states'''
@@ -689,7 +708,7 @@  def main():
     elif action.startswith('project'):
         action_projects(rpc)
 
-    elif action.startswith('check'):
+    elif action.startswith('checks'):
         action_checks(rpc)
 
     elif action.startswith('state'):
@@ -747,6 +766,11 @@  def main():
                                 archived=archived_str, commit=commit_str
                                 )
 
+    elif action == 'check_create':
+        for patch_id in non_empty(h, patch_ids):
+            action_check_create(
+                rpc, patch_id, args['c'], args['s'], args['u'], args['d'])
+
     else:
         sys.stderr.write("Unknown action '%s'\n" % action)
         action_parser.print_help()
diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py
index 2881afb..7ad34d8 100644
--- a/patchwork/views/xmlrpc.py
+++ b/patchwork/views/xmlrpc.py
@@ -959,6 +959,37 @@  def check_get(check_id):
         return {}
 
 
+@xmlrpc_method(login_required=True)
+def check_create(user, patch_id, context, state, target_url="",
+                 description=""):
+    """Add a Check to a patch.
+
+    **NOTE:** Authentication is required for this method.
+
+    Args:
+        patch_id (id): The ID of the patch to create the check against.
+        context: Type of test or system that generated this check.
+        state: "pending", "success", "warning", or "fail"
+        target_url: Link to artifact(s) relating to this check.
+        description: A brief description of the check.
+
+    Returns:
+        True, if successful else raise exception.
+    """
+    patch = Patch.objects.get(id=patch_id)
+    if not patch.is_editable(user):
+        raise Exception('No permissions to edit this patch')
+    for state_val, state_str in Check.STATE_CHOICES:
+        if state == state_str:
+            state = state_val
+            break
+    else:
+        raise Exception("Invalid check state: %s" % state)
+    Check.objects.create(patch=patch, context=context, state=state, user=user,
+                         target_url=target_url, description=description)
+    return True
+
+
 @xmlrpc_method()
 def patch_check_get(patch_id):
     """Get a patch's combined checks by its ID.