Fix pip requirements to update pyangbind version to 0.8.3.post1
[osm/osmclient.git] / osmclient / cli_commands / rbac.py
index 57809bf..4e1680d 100755 (executable)
@@ -19,6 +19,7 @@ from osmclient.cli_commands import utils
 from prettytable import PrettyTable
 import json
 import logging
+import time
 
 logger = logging.getLogger("osmclient")
 
@@ -332,13 +333,6 @@ def user_create(ctx, username, password, projects, project_role_mappings, domain
 
 @click.command(name="user-update", short_help="updates user information")
 @click.argument("username")
-@click.option(
-    "--password",
-    # prompt=True,
-    # hide_input=True,
-    # confirmation_prompt=True,
-    help="user password",
-)
 @click.option("--set-username", "set_username", default=None, help="change username")
 @click.option(
     "--set-project",
@@ -368,54 +362,71 @@ def user_create(ctx, username, password, projects, project_role_mappings, domain
     multiple=True,
     help="remove role(s) in a project. Can be used several times: 'project,role1[,role2,...]'",
 )
-@click.option("--change_password", "change_password", help="user's current password")
+@click.option("--current-password", "current_password", help="user's current password")
 @click.option(
-    "--new_password",
+    "--new-password",
     "new_password",
-    help="user's new password to update in expiry condition",
+    # prompt=True,
+    # hide_input=True,
+    # confirmation_prompt=True,
+    help="new user password",
+)
+@click.option(
+    "--unlock",
+    is_flag=True,
+    help="unlock user",
+)
+@click.option(
+    "--renew",
+    is_flag=True,
+    help="renew user",
 )
 @click.pass_context
 def user_update(
     ctx,
     username,
-    password,
     set_username,
     set_project,
     remove_project,
     add_project_role,
     remove_project_role,
-    change_password,
+    current_password,
     new_password,
+    unlock,
+    renew,
 ):
     """Update a user information
 
     \b
     USERNAME: name of the user
-    PASSWORD: new password
     SET_USERNAME: new username
     SET_PROJECT: creating mappings for project/role(s)
     REMOVE_PROJECT: deleting mappings for project/role(s)
     ADD_PROJECT_ROLE: adding mappings for project/role(s)
     REMOVE_PROJECT_ROLE: removing mappings for project/role(s)
-    CHANGE_PASSWORD: user's current password to change
-    NEW_PASSWORD: user's new password to update in expiry condition
+    CURRENT_PASSWORD: user's current password to change
+    NEW_PASSWORD: user's new password to be updated
+    UNLOCK: unlock user
+    RENEW: renew user
     """
     logger.debug("")
     user = {}
-    user["password"] = password
     user["username"] = set_username
     user["set-project"] = set_project
     user["remove-project"] = remove_project
     user["add-project-role"] = add_project_role
     user["remove-project-role"] = remove_project_role
-    user["change_password"] = change_password
+    user["current_password"] = current_password
     user["new_password"] = new_password
+    user["unlock"] = unlock
+    user["renew"] = renew
 
     utils.check_client_version(ctx.obj, ctx.command.name)
-    ctx.obj.user.update(username, user)
-    if not user.get("change_password"):
+    if not user.get("current_password"):
+        # In case the password is valid but the end user wants to update it
         ctx.obj.user.update(username, user)
     else:
+        # In case the password has expired (also applies in first login)
         ctx.obj.user.update(username, user, pwd_change=True)
 
 
@@ -447,10 +458,30 @@ def user_list(ctx, filter):
     utils.check_client_version(ctx.obj, ctx.command.name)
     if filter:
         filter = "&".join(filter)
-    resp = ctx.obj.user.list(filter)
-    table = PrettyTable(["name", "id"])
+    resp, admin_show = ctx.obj.user.list(filter)
     for user in resp:
-        table.add_row([user["username"], user["_id"]])
+        if user["username"] == "admin":
+            user["_admin"]["account_expire_time"] = "N/A"
+    if admin_show:
+        table = PrettyTable(["name", "id", "user_status", "expires_in"])
+        for user in resp:
+            table.add_row(
+                [
+                    user["username"],
+                    user["_id"],
+                    user["_admin"]["user_status"].upper(),
+                    time.strftime(
+                        "%b-%d-%Y %X",
+                        time.gmtime(user["_admin"]["account_expire_time"]),
+                    )
+                    if not user["username"] == "admin"
+                    else user["_admin"]["account_expire_time"],
+                ]
+            )
+    else:
+        table = PrettyTable(["name", "id"])
+        for user in resp:
+            table.add_row([user["username"], user["_id"]])
     table.align = "l"
     print(table)