diff --git a/compass/api/api.py b/compass/api/api.py index c90437eb..7d30dd05 100644 --- a/compass/api/api.py +++ b/compass/api/api.py @@ -57,6 +57,20 @@ def log_user_action(func): return decorated_api +def update_user_token(func): + @functools.wraps(func) + def decorated_api(*args, **kwargs): + response = func(*args, **kwargs) + expire_timestamp = ( + datetime.datetime.now() + app.config['REMEMBER_COOKIE_DURATION'] + ) + user_api.record_user_token( + current_user, current_user.token, expire_timestamp + ) + return response + return decorated_api + + def _clean_data(data, keys): for key in keys: if key in data: @@ -212,15 +226,9 @@ def _login(use_cookie): raise exception_handler.BadRequest( 'missing email or password in data' ) - if 'expire_timestamp' not in data: - expire_timestamp = ( - datetime.datetime.now() + app.config['REMEMBER_COOKIE_DURATION'] - ) - else: - expire_timestamp = util.parse_datetime( - data['expire_timestamp'], exception_handler.BadRequest - ) - + expire_timestamp = ( + datetime.datetime.now() + app.config['REMEMBER_COOKIE_DURATION'] + ) data['expire_timestamp'] = expire_timestamp user = auth_handler.authenticate_user(**data) if not login_user(user, remember=data.get('remember', False)): @@ -260,6 +268,7 @@ def logout(): @app.route("/users", methods=['GET']) @log_user_action @login_required +@update_user_token def list_users(): """list users.""" data = _get_request_args( @@ -274,6 +283,7 @@ def list_users(): @app.route("/users", methods=['POST']) @log_user_action @login_required +@update_user_token def add_user(): """add user.""" data = _get_request_data() @@ -286,6 +296,7 @@ def add_user(): @app.route("/users/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_user(user_id): """Get user.""" data = _get_request_args() @@ -297,6 +308,7 @@ def show_user(user_id): @app.route("/current-user", methods=['GET']) @log_user_action @login_required +@update_user_token def show_current_user(): """Get user.""" data = _get_request_args() @@ -308,6 +320,7 @@ def show_current_user(): @app.route("/users/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_user(user_id): """Update user.""" data = _get_request_data() @@ -324,6 +337,7 @@ def update_user(user_id): @app.route("/users/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_user(user_id): """Delete user.""" data = _get_request_data() @@ -338,6 +352,7 @@ def delete_user(user_id): @app.route("/users//permissions", methods=['GET']) @log_user_action @login_required +@update_user_token def list_user_permissions(user_id): """Get user permissions.""" data = _get_request_args() @@ -349,6 +364,7 @@ def list_user_permissions(user_id): @app.route("/users//action", methods=['POST']) @log_user_action @login_required +@update_user_token def take_user_action(user_id): """Take user action.""" data = _get_request_data() @@ -394,6 +410,7 @@ def take_user_action(user_id): ) @log_user_action @login_required +@update_user_token def show_user_permission(user_id, permission_id): """Get a specific user permission.""" data = _get_request_args() @@ -409,6 +426,7 @@ def show_user_permission(user_id, permission_id): @app.route("/users//permissions", methods=['POST']) @log_user_action @login_required +@update_user_token def add_user_permission(user_id): """Add permission to a specific user.""" data = _get_request_data() @@ -427,6 +445,7 @@ def add_user_permission(user_id): ) @log_user_action @login_required +@update_user_token def delete_user_permission(user_id, permission_id): """Delete a specific user permission.""" data = _get_request_data() @@ -442,6 +461,7 @@ def delete_user_permission(user_id, permission_id): @app.route("/permissions", methods=['GET']) @log_user_action @login_required +@update_user_token def list_permissions(): """List permissions.""" data = _get_request_args() @@ -454,6 +474,7 @@ def list_permissions(): @app.route("/permissions/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_permission(permission_id): """Get permission.""" data = _get_request_args() @@ -496,6 +517,7 @@ def _filter_timestamp(data): @app.route("/users/logs", methods=['GET']) @log_user_action @login_required +@update_user_token def list_all_user_actions(): """List all users actions.""" data = _get_request_args() @@ -511,6 +533,7 @@ def list_all_user_actions(): @app.route("/users//logs", methods=['GET']) @log_user_action @login_required +@update_user_token def list_user_actions(user_id): """List user actions.""" data = _get_request_args() @@ -526,6 +549,7 @@ def list_user_actions(user_id): @app.route("/users/logs", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_all_user_actions(): """Delete all user actions.""" data = _get_request_data() @@ -540,6 +564,7 @@ def delete_all_user_actions(): @app.route("/users//logs", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_user_actions(user_id): """Delete user actions.""" data = _get_request_data() @@ -593,6 +618,7 @@ def _filter_ip(data): @app.route("/switches", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switches(): """List switches.""" data = _get_request_args() @@ -608,6 +634,7 @@ def list_switches(): @app.route("/switches/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_switch(switch_id): """Get switch.""" data = _get_request_args() @@ -619,6 +646,7 @@ def show_switch(switch_id): @app.route("/switches", methods=['POST']) @log_user_action @login_required +@update_user_token def add_switch(): """add switch.""" data = _get_request_data() @@ -631,6 +659,7 @@ def add_switch(): @app.route("/switches/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_switch(switch_id): """update switch.""" data = _get_request_data() @@ -643,6 +672,7 @@ def update_switch(switch_id): @app.route("/switches/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_switch(switch_id): """patch switch.""" data = _get_request_data() @@ -655,6 +685,7 @@ def patch_switch(switch_id): @app.route("/switches/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_switch(switch_id): """delete switch.""" data = _get_request_data() @@ -667,6 +698,7 @@ def delete_switch(switch_id): @app.route("/switch-filters", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switch_filters(): """List switch filters.""" data = _get_request_args() @@ -682,6 +714,7 @@ def list_switch_filters(): @app.route("/switch-filters/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_switch_filters(switch_id): """Get switch filters.""" data = _get_request_args() @@ -693,6 +726,7 @@ def show_switch_filters(switch_id): @app.route("/switch-filters/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_switch_filters(switch_id): """update switch filters.""" data = _get_request_data() @@ -705,6 +739,7 @@ def update_switch_filters(switch_id): @app.route("/switch-filters/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_switch_filters(switch_id): """patch switch filters.""" data = _get_request_data() @@ -785,6 +820,7 @@ def _filter_location(data): @app.route("/switches//machines", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switch_machines(switch_id): """Get switch machines.""" data = _get_request_args(vlans=_int_converter) @@ -803,6 +839,7 @@ def list_switch_machines(switch_id): @app.route("/switches//machines-hosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switch_machines_hosts(switch_id): """Get switch machines or hosts.""" data = _get_request_args(vlans=_int_converter, os_id=_int_converter) @@ -823,6 +860,7 @@ def list_switch_machines_hosts(switch_id): @app.route("/switches//machines", methods=['POST']) @log_user_action @login_required +@update_user_token def add_switch_machine(switch_id): """add switch machine.""" data = _get_request_data() @@ -838,6 +876,7 @@ def add_switch_machine(switch_id): ) @log_user_action @login_required +@update_user_token def show_switch_machine(switch_id, machine_id): """get switch machine.""" data = _get_request_args() @@ -855,6 +894,7 @@ def show_switch_machine(switch_id, machine_id): ) @log_user_action @login_required +@update_user_token def update_switch_machine(switch_id, machine_id): """update switch machine.""" data = _get_request_data() @@ -872,6 +912,7 @@ def update_switch_machine(switch_id, machine_id): ) @log_user_action @login_required +@update_user_token def patch_switch_machine(switch_id, machine_id): """patch switch machine.""" data = _get_request_data() @@ -889,6 +930,7 @@ def patch_switch_machine(switch_id, machine_id): ) @log_user_action @login_required +@update_user_token def delete_switch_machine(switch_id, machine_id): """Delete switch machine.""" data = _get_request_data() @@ -903,6 +945,7 @@ def delete_switch_machine(switch_id, machine_id): @app.route("/switches//action", methods=['POST']) @log_user_action @login_required +@update_user_token def take_switch_action(switch_id): """update switch.""" data = _get_request_data() @@ -930,6 +973,7 @@ def take_switch_action(switch_id): @app.route("/machines//action", methods=['POST']) @log_user_action @login_required +@update_user_token def take_machine_action(machine_id): """update machine.""" data = _get_request_data() @@ -969,6 +1013,7 @@ def take_machine_action(machine_id): @app.route("/switch-machines", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switchmachines(): """List switch machines.""" data = _get_request_args(vlans=_int_converter) @@ -988,6 +1033,7 @@ def list_switchmachines(): @app.route("/switches-machines-hosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_switchmachines_hosts(): """List switch machines or hosts.""" data = _get_request_args(vlans=_int_converter, os_id=_int_converter) @@ -1012,6 +1058,7 @@ def list_switchmachines_hosts(): ) @log_user_action @login_required +@update_user_token def show_switchmachine(switch_machine_id): """get switch machine.""" data = _get_request_args() @@ -1029,6 +1076,7 @@ def show_switchmachine(switch_machine_id): ) @log_user_action @login_required +@update_user_token def update_switchmachine(switch_machine_id): """update switch machine.""" data = _get_request_data() @@ -1043,6 +1091,7 @@ def update_switchmachine(switch_machine_id): @app.route('/switch-machines/', methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_switchmachine(switch_machine_id): """patch switch machine.""" data = _get_request_data() @@ -1057,6 +1106,7 @@ def patch_switchmachine(switch_machine_id): @app.route("/switch-machines/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_switchmachine(switch_machine_id): """Delete switch machine.""" data = _get_request_data() @@ -1071,6 +1121,7 @@ def delete_switchmachine(switch_machine_id): @app.route("/machines", methods=['GET']) @log_user_action @login_required +@update_user_token def list_machines(): """List machines.""" data = _get_request_args() @@ -1087,6 +1138,7 @@ def list_machines(): @app.route("/machines/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_machine(machine_id): """Get machine.""" data = _get_request_args() @@ -1101,6 +1153,7 @@ def show_machine(machine_id): @app.route("/machines/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_machine(machine_id): """update machine.""" data = _get_request_data() @@ -1115,6 +1168,7 @@ def update_machine(machine_id): @app.route("/machines/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_machine(machine_id): """patch machine.""" data = _get_request_data() @@ -1129,6 +1183,7 @@ def patch_machine(machine_id): @app.route("/machines/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_machine(machine_id): """Delete machine.""" data = _get_request_data() @@ -1143,6 +1198,7 @@ def delete_machine(machine_id): @app.route("/subnets", methods=['GET']) @log_user_action @login_required +@update_user_token def list_subnets(): """List subnets.""" data = _get_request_args() @@ -1157,6 +1213,7 @@ def list_subnets(): @app.route("/subnets/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_subnet(subnet_id): """Get subnet.""" data = _get_request_args() @@ -1171,6 +1228,7 @@ def show_subnet(subnet_id): @app.route("/subnets", methods=['POST']) @log_user_action @login_required +@update_user_token def add_subnet(): """add subnet.""" data = _get_request_data() @@ -1183,6 +1241,7 @@ def add_subnet(): @app.route("/subnets/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_subnet(subnet_id): """update subnet.""" data = _get_request_data() @@ -1197,6 +1256,7 @@ def update_subnet(subnet_id): @app.route("/subnets/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_subnet(subnet_id): """Delete subnet.""" data = _get_request_data() @@ -1211,6 +1271,7 @@ def delete_subnet(subnet_id): @app.route("/adapters", methods=['GET']) @log_user_action @login_required +@update_user_token def list_adapters(): """List adapters.""" data = _get_request_args() @@ -1229,6 +1290,7 @@ def list_adapters(): @app.route("/adapters/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_adapter(adapter_id): """Get adapter.""" data = _get_request_args() @@ -1243,6 +1305,7 @@ def show_adapter(adapter_id): @app.route("/adapters//metadata", methods=['GET']) @log_user_action @login_required +@update_user_token def show_adapter_metadata(adapter_id): """Get adapter metadata.""" data = _get_request_args() @@ -1257,6 +1320,7 @@ def show_adapter_metadata(adapter_id): @app.route("/oses//metadata", methods=['GET']) @log_user_action @login_required +@update_user_token def show_os_metadata(os_id): """Get os metadata.""" data = _get_request_args() @@ -1274,6 +1338,7 @@ def show_os_metadata(os_id): ) @log_user_action @login_required +@update_user_token def show_adapter_os_metadata(adapter_id, os_id): """Get adapter metadata.""" data = _get_request_args() @@ -1288,6 +1353,7 @@ def show_adapter_os_metadata(adapter_id, os_id): @app.route("/clusters", methods=['GET']) @log_user_action @login_required +@update_user_token def list_clusters(): """List clusters.""" data = _get_request_args() @@ -1302,6 +1368,7 @@ def list_clusters(): @app.route("/clusters/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_cluster(cluster_id): """Get cluster.""" data = _get_request_args(adapter_id=_int_converter) @@ -1316,6 +1383,7 @@ def show_cluster(cluster_id): @app.route("/clusters", methods=['POST']) @log_user_action @login_required +@update_user_token def add_cluster(): """add cluster.""" data = _get_request_data() @@ -1328,6 +1396,7 @@ def add_cluster(): @app.route("/clusters/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_cluster(cluster_id): """update cluster.""" data = _get_request_data() @@ -1342,6 +1411,7 @@ def update_cluster(cluster_id): @app.route("/clusters/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_cluster(cluster_id): """Delete cluster.""" data = _get_request_data() @@ -1361,6 +1431,7 @@ def delete_cluster(cluster_id): @app.route("/clusters//config", methods=['GET']) @log_user_action @login_required +@update_user_token def show_cluster_config(cluster_id): """Get cluster config.""" data = _get_request_args() @@ -1375,6 +1446,7 @@ def show_cluster_config(cluster_id): @app.route("/clusters//metadata", methods=['GET']) @log_user_action @login_required +@update_user_token def show_cluster_metadata(cluster_id): """Get cluster config.""" data = _get_request_args() @@ -1389,6 +1461,7 @@ def show_cluster_metadata(cluster_id): @app.route("/clusters//config", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_cluster_config(cluster_id): """update cluster config.""" data = _get_request_data() @@ -1401,6 +1474,7 @@ def update_cluster_config(cluster_id): @app.route("/clusters//config", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_cluster_config(cluster_id): """patch cluster config.""" data = _get_request_data() @@ -1413,6 +1487,7 @@ def patch_cluster_config(cluster_id): @app.route("/clusters//config", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_cluster_config(cluster_id): """Delete cluster config.""" data = _get_request_data() @@ -1427,6 +1502,7 @@ def delete_cluster_config(cluster_id): @app.route("/clusters//action", methods=['POST']) @log_user_action @login_required +@update_user_token def take_cluster_action(cluster_id): """take cluster action.""" data = _get_request_data() @@ -1461,6 +1537,7 @@ def take_cluster_action(cluster_id): @app.route("/clusters//state", methods=['GET']) @log_user_action @login_required +@update_user_token def get_cluster_state(cluster_id): """Get cluster state.""" data = _get_request_args() @@ -1475,6 +1552,7 @@ def get_cluster_state(cluster_id): @app.route("/clusters//hosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_cluster_hosts(cluster_id): """Get cluster hosts.""" data = _get_request_args() @@ -1489,6 +1567,7 @@ def list_cluster_hosts(cluster_id): @app.route("/clusterhosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_clusterhosts(): """Get cluster hosts.""" data = _get_request_args() @@ -1503,6 +1582,7 @@ def list_clusterhosts(): @app.route("/clusters//hosts/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_cluster_host(cluster_id, host_id): """Get clusterhost.""" data = _get_request_args() @@ -1517,6 +1597,7 @@ def show_cluster_host(cluster_id, host_id): @app.route("/clusterhosts/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_clusterhost(clusterhost_id): """Get clusterhost.""" data = _get_request_args() @@ -1531,6 +1612,7 @@ def show_clusterhost(clusterhost_id): @app.route("/clusters//hosts", methods=['POST']) @log_user_action @login_required +@update_user_token def add_cluster_host(cluster_id): """update cluster hosts.""" data = _get_request_data() @@ -1546,6 +1628,7 @@ def add_cluster_host(cluster_id): ) @log_user_action @login_required +@update_user_token def update_cluster_host(cluster_id, host_id): """Update cluster host.""" data = _get_request_data() @@ -1563,6 +1646,7 @@ def update_cluster_host(cluster_id, host_id): ) @log_user_action @login_required +@update_user_token def update_clusterhost(clusterhost_id): """Update cluster host.""" data = _get_request_data() @@ -1580,6 +1664,7 @@ def update_clusterhost(clusterhost_id): ) @log_user_action @login_required +@update_user_token def patch_cluster_host(cluster_id, host_id): """Update cluster host.""" data = _get_request_data() @@ -1597,6 +1682,7 @@ def patch_cluster_host(cluster_id, host_id): ) @log_user_action @login_required +@update_user_token def patch_clusterhost(clusterhost_id): """Update cluster host.""" data = _get_request_data() @@ -1614,6 +1700,7 @@ def patch_clusterhost(clusterhost_id): ) @log_user_action @login_required +@update_user_token def delete_cluster_host(cluster_id, host_id): """Delete cluster host.""" data = _get_request_data() @@ -1636,6 +1723,7 @@ def delete_cluster_host(cluster_id, host_id): ) @log_user_action @login_required +@update_user_token def delete_clusterhost(clusterhost_id): """Delete cluster host.""" data = _get_request_data() @@ -1658,6 +1746,7 @@ def delete_clusterhost(clusterhost_id): ) @log_user_action @login_required +@update_user_token def show_cluster_host_config(cluster_id, host_id): """Get clusterhost config.""" data = _get_request_args() @@ -1672,6 +1761,7 @@ def show_cluster_host_config(cluster_id, host_id): @app.route("/clusterhosts//config", methods=['GET']) @log_user_action @login_required +@update_user_token def show_clusterhost_config(clusterhost_id): """Get clusterhost config.""" data = _get_request_args() @@ -1689,6 +1779,7 @@ def show_clusterhost_config(clusterhost_id): ) @log_user_action @login_required +@update_user_token def update_cluster_host_config(cluster_id, host_id): """update clusterhost config.""" data = _get_request_data() @@ -1703,6 +1794,7 @@ def update_cluster_host_config(cluster_id, host_id): @app.route("/clusterhosts//config", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_clusterhost_config(clusterhost_id): """update clusterhost config.""" data = _get_request_data() @@ -1720,6 +1812,7 @@ def update_clusterhost_config(clusterhost_id): ) @log_user_action @login_required +@update_user_token def patch_cluster_host_config(cluster_id, host_id): """patch clusterhost config.""" data = _get_request_data() @@ -1734,6 +1827,7 @@ def patch_cluster_host_config(cluster_id, host_id): @app.route("/clusterhosts/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_clusterhost_config(clusterhost_id): """patch clusterhost config.""" data = _get_request_data() @@ -1751,6 +1845,7 @@ def patch_clusterhost_config(clusterhost_id): ) @log_user_action @login_required +@update_user_token def delete_cluster_host_config(cluster_id, host_id): """Delete clusterhost config.""" data = _get_request_data() @@ -1765,6 +1860,7 @@ def delete_cluster_host_config(cluster_id, host_id): @app.route("/clusterhosts//config", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_clusterhost_config(clusterhost_id): """Delete clusterhost config.""" data = _get_request_data() @@ -1782,6 +1878,7 @@ def delete_clusterhost_config(clusterhost_id): ) @log_user_action @login_required +@update_user_token def show_cluster_host_state(cluster_id, host_id): """Get clusterhost state.""" data = _get_request_args() @@ -1796,6 +1893,7 @@ def show_cluster_host_state(cluster_id, host_id): @app.route("/clusterhosts//state", methods=['GET']) @log_user_action @login_required +@update_user_token def show_clusterhost_state(clusterhost_id): """Get clusterhost state.""" data = _get_request_args() @@ -1813,6 +1911,7 @@ def show_clusterhost_state(clusterhost_id): ) @log_user_action @login_required +@update_user_token def update_cluster_host_state(cluster_id, host_id): """update clusterhost state.""" data = _get_request_data() @@ -1827,6 +1926,7 @@ def update_cluster_host_state(cluster_id, host_id): @app.route("/clusterhosts//state", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_clusterhost_state(clusterhost_id): """update clusterhost state.""" data = _get_request_data() @@ -1841,6 +1941,7 @@ def update_clusterhost_state(clusterhost_id): @app.route("/hosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_hosts(): """List hosts.""" data = _get_request_args() @@ -1855,6 +1956,7 @@ def list_hosts(): @app.route("/hosts/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_host(host_id): """Get host.""" data = _get_request_args() @@ -1869,6 +1971,7 @@ def show_host(host_id): @app.route("/machines-hosts", methods=['GET']) @log_user_action @login_required +@update_user_token def list_machines_or_hosts(): """Get host.""" data = _get_request_args(os_id=_int_converter) @@ -1887,6 +1990,7 @@ def list_machines_or_hosts(): @app.route("/machines-hosts/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_machine_or_host(host_id): """Get host.""" data = _get_request_args() @@ -1901,6 +2005,7 @@ def show_machine_or_host(host_id): @app.route("/hosts/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_host(host_id): """update host.""" data = _get_request_data() @@ -1915,6 +2020,7 @@ def update_host(host_id): @app.route("/hosts", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_hosts(): """update hosts.""" data = _get_request_data_as_list() @@ -1929,6 +2035,7 @@ def update_hosts(): @app.route("/hosts/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_host(host_id): """Delete host.""" data = _get_request_data() @@ -1948,6 +2055,7 @@ def delete_host(host_id): @app.route("/hosts//clusters", methods=['GET']) @log_user_action @login_required +@update_user_token def get_host_clusters(host_id): """Get host clusters.""" data = _get_request_args() @@ -1962,6 +2070,7 @@ def get_host_clusters(host_id): @app.route("/hosts//config", methods=['GET']) @log_user_action @login_required +@update_user_token def show_host_config(host_id): """Get host config.""" data = _get_request_args() @@ -1976,6 +2085,7 @@ def show_host_config(host_id): @app.route("/hosts//config", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_host_config(host_id): """update host config.""" data = _get_request_data() @@ -1988,6 +2098,7 @@ def update_host_config(host_id): @app.route("/hosts/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def patch_host_config(host_id): """patch host config.""" data = _get_request_data() @@ -2000,6 +2111,7 @@ def patch_host_config(host_id): @app.route("/hosts//config", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_host_config(host_id): """Delete host config.""" data = _get_request_data() @@ -2014,6 +2126,7 @@ def delete_host_config(host_id): @app.route("/hosts//networks", methods=['GET']) @log_user_action @login_required +@update_user_token def list_host_networks(host_id): """list host networks.""" data = _get_request_args() @@ -2030,6 +2143,7 @@ def list_host_networks(host_id): @app.route("/host/networks", methods=['GET']) @log_user_action @login_required +@update_user_token def list_hostnetworks(): """list host networks.""" data = _get_request_args( @@ -2050,6 +2164,7 @@ def list_hostnetworks(): ) @log_user_action @login_required +@update_user_token def show_host_network(host_id, host_network_id): """Get host network.""" data = _get_request_args() @@ -2064,6 +2179,7 @@ def show_host_network(host_id, host_network_id): @app.route("/host/networks/", methods=['GET']) @log_user_action @login_required +@update_user_token def show_hostnetwork(host_network_id): """Get host network.""" data = _get_request_args() @@ -2078,6 +2194,7 @@ def show_hostnetwork(host_network_id): @app.route("/hosts//networks", methods=['POST']) @log_user_action @login_required +@update_user_token def add_host_network(host_id): """add host network.""" data = _get_request_data() @@ -2089,6 +2206,7 @@ def add_host_network(host_id): @app.route("/hosts/networks", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_host_networks(): """add host networks.""" data = _get_request_data_as_list() @@ -2104,6 +2222,7 @@ def update_host_networks(): ) @log_user_action @login_required +@update_user_token def update_host_network(host_id, host_network_id): """update host network.""" data = _get_request_data() @@ -2118,6 +2237,7 @@ def update_host_network(host_id, host_network_id): @app.route("/host-networks/", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_hostnetwork(host_network_id): """update host network.""" data = _get_request_data() @@ -2135,6 +2255,7 @@ def update_hostnetwork(host_network_id): ) @log_user_action @login_required +@update_user_token def delete_host_network(host_id, host_network_id): """Delete host network.""" data = _get_request_data() @@ -2149,6 +2270,7 @@ def delete_host_network(host_id, host_network_id): @app.route("/host-networks/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def delete_hostnetwork(host_network_id): """Delete host network.""" data = _get_request_data() @@ -2163,6 +2285,7 @@ def delete_hostnetwork(host_network_id): @app.route("/hosts//state", methods=['GET']) @log_user_action @login_required +@update_user_token def show_host_state(host_id): """Get host state.""" data = _get_request_args() @@ -2177,6 +2300,7 @@ def show_host_state(host_id): @app.route("/hosts//state", methods=['PUT']) @log_user_action @login_required +@update_user_token def update_host_state(host_id): """update host state.""" data = _get_request_data() @@ -2218,6 +2342,7 @@ def _reset_host(*args, **kwargs): @app.route("/hosts//action", methods=['POST']) @log_user_action @login_required +@update_user_token def take_host_action(host_id): """take host action.""" data = _get_request_data() @@ -2264,6 +2389,7 @@ def _get_response_json(response): @app.route("/proxy/", methods=['GET']) @log_user_action @login_required +@update_user_token def proxy_get(url): """proxy url.""" headers = _get_headers( @@ -2290,6 +2416,7 @@ def proxy_get(url): @app.route("/proxy/", methods=['POST']) @log_user_action @login_required +@update_user_token def proxy_post(url): """proxy url.""" headers = _get_headers( @@ -2315,6 +2442,7 @@ def proxy_post(url): @app.route("/proxy/", methods=['PUT']) @log_user_action @login_required +@update_user_token def proxy_put(url): """proxy url.""" headers = _get_headers( @@ -2340,6 +2468,7 @@ def proxy_put(url): @app.route("/proxy/", methods=['PATCH']) @log_user_action @login_required +@update_user_token def proxy_patch(url): """proxy url.""" headers = _get_headers( @@ -2365,6 +2494,7 @@ def proxy_patch(url): @app.route("/proxy/", methods=['DELETE']) @log_user_action @login_required +@update_user_token def proxy_delete(url): """proxy url.""" headers = _get_headers( diff --git a/compass/db/api/user.py b/compass/db/api/user.py index 96ae96da..148d277b 100644 --- a/compass/db/api/user.py +++ b/compass/db/api/user.py @@ -190,10 +190,7 @@ class UserWrapper(UserMixin): self.password = crypted_password self.active = active self.is_admin = is_admin - if expire_timestamp: - self.expire_timestamp = expire_timestamp - else: - self.expire_timestamp = datetime.datetime.now() + self.expire_timestamp = expire_timestamp if not token: self.token = self.get_auth_token() else: @@ -215,7 +212,10 @@ class UserWrapper(UserMixin): def is_authenticated(self): current_time = datetime.datetime.now() - return current_time < self.expire_timestamp + return ( + not self.expire_timestamp or + current_time < self.expire_timestamp + ) def __str__(self): return '%s[email:%s,password:%s]' % ( @@ -253,20 +253,33 @@ def get_user_object_from_token(session, token): session, models.User, id=user_token.user_id ).to_dict() user_dict['token'] = token - user_dict['expire_timestamp'] = user_token.expire_timestamp + expire_timestamp = user_token.expire_timestamp + user_dict['expire_timestamp'] = expire_timestamp return UserWrapper(**user_dict) @utils.supported_filters() @database.run_in_session() @utils.wrap_to_dict(RESP_TOKEN_FIELDS) -def record_user_token(session, user, token, expire_timestamp): +def record_user_token( + session, user, token, expire_timestamp +): """record user token in database.""" - return utils.add_db_object( - session, models.UserToken, True, - token, user_id=user.id, - expire_timestamp=expire_timestamp + user_token = utils.get_db_object( + session, models.UserToken, False, + user_id=user.id, token=token ) + if not user_token: + return utils.add_db_object( + session, models.UserToken, True, + token, user_id=user.id, + expire_timestamp=expire_timestamp + ) + elif expire_timestamp > user_token.expire_timestamp: + return utils.update_db_object( + session, user_token, expire_timestamp=expire_timestamp + ) + return user_token @utils.supported_filters() diff --git a/compass/db/api/utils.py b/compass/db/api/utils.py index a0304261..988b64ad 100644 --- a/compass/db/api/utils.py +++ b/compass/db/api/utils.py @@ -20,10 +20,12 @@ import logging import netaddr import re +from sqlalchemy import and_ from sqlalchemy import or_ from compass.db import exception from compass.db import models +from compass.utils import util def model_query(session, model): @@ -53,18 +55,21 @@ def _one_item_list_condition_func(col_attr, value, condition_func): return None -def _model_filter_by_condition( - query, col_attr, value, condition_func, - list_condition_func=_default_list_condition_func): +def _model_condition_func( + col_attr, value, + item_condition_func, + list_condition_func=_default_list_condition_func +): if isinstance(value, list): - condition = list_condition_func( - col_attr, value, condition_func + if not value: + return None + if len(value) == 1: + return item_condition_func(col_attr, value) + return list_condition_func( + col_attr, value, item_condition_func ) else: - condition = condition_func(col_attr, value) - if condition is not None: - query = query.filter(condition) - return query + return item_condition_func(col_attr, value) def _between_condition(col_attr, value): @@ -100,6 +105,108 @@ def model_order_by(query, model, order_by): return query.order_by(*order_by_cols) +def _model_condition(col_attr, value): + if isinstance(value, list): + basetype_values = [] + composite_values = [] + for item in value: + if util.is_instance(item, [list, dict]): + composite_values.append(item) + else: + basetype_values.append(item) + conditions = [] + if basetype_values: + if len(basetype_values) == 1: + condition = (col_attr == basetype_values[0]) + else: + condition = col_attr.in_(basetype_values) + conditions.append(condition) + for composite_value in composite_values: + condition = _model_condition(col_attr, composite_value) + if condition is not None: + conditions.append(condition) + if not conditions: + return None + if len(conditions) == 1: + return conditions[0] + return or_(*conditions) + elif isinstance(value, dict): + conditions = [] + if 'eq' in value: + conditions.append(_model_condition_func( + col_attr, value['eq'], + lambda attr, data: attr == data, + lambda attr, data, item_condition_func: attr.in_(data) + )) + if 'lt' in value: + conditions.append(_model_condition_func( + col_attr, value['lt'], + lambda attr, data: attr < data, + _one_item_list_condition_func + )) + if 'gt' in value: + conditions.append(_model_condition_func( + col_attr, value['gt'], + lambda attr, data: attr > data, + _one_item_list_condition_func + )) + if 'le' in value: + conditions.append(_model_condition_func( + col_attr, value['le'], + lambda attr, data: attr <= data, + _one_item_list_condition_func + )) + if 'ge' in value: + conditions.append(_model_condition_func( + col_attr, value['ge'], + lambda attr, data: attr >= data, + _one_item_list_condition_func + )) + if 'ne' in value: + conditions.append(_model_condition_func( + col_attr, value['ne'], + lambda attr, data: attr != data, + lambda attr, data, item_condition_func: attr.notin_(data) + )) + if 'in' in value: + conditions.append(col_attr.in_(value['in'])) + if 'notin' in value: + conditions.append(col_attr.notin_(value['notin'])) + if 'startswith' in value: + conditions.append(_model_condition_func( + col_attr, value['startswith'], + lambda attr, data: attr.like('%s%%' % data) + )) + if 'endswith' in value: + conditions.append(_model_condition_func( + col_attr, value['endswith'], + lambda attr, data: attr.like('%%%s' % data) + )) + if 'like' in value: + conditions.append(_model_condition_func( + col_attr, value['like'], + lambda attr, data: attr.like('%%%s%%' % data) + )) + if 'between' in value: + conditions.append(_model_condition_func( + col_attr, value['between'], + _between_condition + )) + conditions = [ + condition + for condition in conditions + if condition is not None + ] + if not conditions: + return None + if len(conditions) == 1: + return conditions[0] + return and_(conditions) + else: + condition = (col_attr == value) + return condition + + def model_filter(query, model, **filters): for key, value in filters.items(): if isinstance(key, basestring): @@ -109,69 +216,9 @@ def model_filter(query, model, **filters): continue else: col_attr = key - if isinstance(value, list): - query = query.filter(col_attr.in_(value)) - elif isinstance(value, dict): - if 'eq' in value: - query = _model_filter_by_condition( - query, col_attr, value['eq'], - lambda attr, data: attr == data, - lambda attr, data, condition_func: attr.in_(data) - ) - if 'lt' in value: - query = _model_filter_by_condition( - query, col_attr, value['lt'], - lambda attr, data: attr < data, - _one_item_list_condition_func - ) - if 'gt' in value: - query = _model_filter_by_condition( - query, col_attr, value['gt'], - lambda attr, data: attr > data, - _one_item_list_condition_func - ) - if 'le' in value: - query = _model_filter_by_condition( - query, col_attr, value['le'], - lambda attr, data: attr <= data, - _one_item_list_condition_func - ) - if 'ge' in value: - query = _model_filter_by_condition( - query, col_attr, value['ge'], - lambda attr, data: attr >= data, - _one_item_list_condition_func - ) - if 'ne' in value: - query = _model_filter_by_condition( - query, col_attr, value['ne'], None, - lambda attr, data, condition_func: ~attr.in_(data) - ) - if 'in' in value: - query = query.filter(col_attr.in_(value['in'])) - if 'startswith' in value: - query = _model_filter_by_condition( - query, col_attr, value['startswith'], - lambda attr, data: attr.like('%s%%' % data) - ) - if 'endswith' in value: - query = _model_filter_by_condition( - query, col_attr, value['endswith'], - lambda attr, data: attr.like('%%%s' % data) - ) - if 'like' in value: - query = _model_filter_by_condition( - query, col_attr, value['like'], - lambda attr, data: attr.like('%%%s%%' % data) - ) - if 'between' in value: - query = _model_filter_by_condition( - query, col_attr, value['between'], - _between_condition - ) - else: - query = query.filter(col_attr == value) - + condition = _model_condition(col_attr, value) + if condition is not None: + query = query.filter(condition) return query @@ -221,6 +268,10 @@ def wrap_to_dict(support_keys=[], **filters): def _wrapper_dict(data, support_keys, **filters): """Helper for warpping db object into dictionary.""" + logging.info( + 'wrap dict %s by support_keys=%s filters=%s', + data, support_keys, filters + ) if isinstance(data, list): return [ _wrapper_dict(item, support_keys, **filters) @@ -509,6 +560,9 @@ def add_db_object(session, table, exception_when_existing=True, new_object = False if db_object: + logging.debug( + 'got db object %s: %s', db_keys, db_object + ) if exception_when_existing: raise exception.DuplicatedRecord( '%s exists in table %s' % (db_keys, table.__name__) diff --git a/compass/db/models.py b/compass/db/models.py index a539729e..1783345c 100644 --- a/compass/db/models.py +++ b/compass/db/models.py @@ -1456,9 +1456,7 @@ class UserToken(BASE, HelperMixin): ForeignKey('user.id', onupdate='CASCADE', ondelete='CASCADE') ) token = Column(String(256), unique=True, nullable=False) - expire_timestamp = Column( - DateTime, default=lambda: datetime.datetime.now() - ) + expire_timestamp = Column(DateTime, nullable=True) def __init__(self, token, **kwargs): self.token = token @@ -2200,6 +2198,9 @@ class AdapterFlavorRole(BASE, HelperMixin): self.role_id = role_id super(AdapterFlavorRole, self).__init__() + def __str__(self): + return 'AdapterFlavorRole[%s:%s]' % (self.flavor_id, self.role_id) + def validate(self): super(AdapterFlavorRole, self).validate() flavor_adapter_id = self.flavor.adapter_id @@ -2508,6 +2509,9 @@ class Adapter(BASE, HelperMixin): self.name = name super(Adapter, self).__init__(**kwargs) + def __str__(self): + return 'Adapter[%s:%s]' % (self.id, self.name) + def initialize(self): if not self.display_name: self.display_name = self.name diff --git a/install/compass.sh b/install/compass.sh index e03f867d..66986008 100755 --- a/install/compass.sh +++ b/install/compass.sh @@ -84,6 +84,7 @@ deactivate sudo mkdir -p /var/log/redis sudo chown -R redis:root /var/log/redis sudo mkdir -p /var/lib/redis/ +sudo rm -rf /var/lib/redis/* sudo chown -R redis:root /var/lib/redis sudo mkdir -p /var/run/redis sudo chown -R redis:root /var/run/redis