kaqing 2.0.82__tar.gz → 2.0.84__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kaqing might be problematic. Click here for more details.

Files changed (196) hide show
  1. {kaqing-2.0.82 → kaqing-2.0.84}/PKG-INFO +1 -1
  2. {kaqing-2.0.82 → kaqing-2.0.84}/adam/batch.py +10 -0
  3. kaqing-2.0.84/adam/commands/audit/audit.py +57 -0
  4. kaqing-2.0.84/adam/commands/audit/audit_repair_tables.py +42 -0
  5. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cd.py +3 -1
  6. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/command.py +7 -4
  7. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/devices.py +29 -0
  8. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/ls.py +6 -0
  9. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/pwd.py +3 -0
  10. kaqing-2.0.84/adam/embedded_params.py +2 -0
  11. {kaqing-2.0.82 → kaqing-2.0.84}/adam/repl.py +17 -5
  12. {kaqing-2.0.82 → kaqing-2.0.84}/adam/repl_commands.py +5 -3
  13. {kaqing-2.0.82 → kaqing-2.0.84}/adam/repl_state.py +4 -1
  14. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sql/state_machine.py +3 -2
  15. kaqing-2.0.84/adam/sso/__init__.py +0 -0
  16. kaqing-2.0.84/adam/utils_athena.py +61 -0
  17. kaqing-2.0.84/adam/version.py +5 -0
  18. {kaqing-2.0.82 → kaqing-2.0.84}/kaqing.egg-info/PKG-INFO +1 -1
  19. {kaqing-2.0.82 → kaqing-2.0.84}/kaqing.egg-info/SOURCES.txt +4 -0
  20. {kaqing-2.0.82 → kaqing-2.0.84}/setup.py +1 -1
  21. kaqing-2.0.82/adam/embedded_params.py +0 -2
  22. kaqing-2.0.82/adam/version.py +0 -5
  23. {kaqing-2.0.82 → kaqing-2.0.84}/README +0 -0
  24. {kaqing-2.0.82 → kaqing-2.0.84}/adam/__init__.py +0 -0
  25. {kaqing-2.0.82 → kaqing-2.0.84}/adam/app_session.py +0 -0
  26. {kaqing-2.0.82 → kaqing-2.0.84}/adam/apps.py +0 -0
  27. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/__init__.py +0 -0
  28. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/check.py +0 -0
  29. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/check_context.py +0 -0
  30. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/check_result.py +0 -0
  31. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/check_utils.py +0 -0
  32. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/compactionstats.py +0 -0
  33. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/cpu.py +0 -0
  34. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/disk.py +0 -0
  35. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/gossip.py +0 -0
  36. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/issue.py +0 -0
  37. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/memory.py +0 -0
  38. {kaqing-2.0.82 → kaqing-2.0.84}/adam/checks/status.py +0 -0
  39. {kaqing-2.0.82 → kaqing-2.0.84}/adam/cli.py +0 -0
  40. {kaqing-2.0.82 → kaqing-2.0.84}/adam/cli_group.py +0 -0
  41. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/__init__.py +0 -0
  42. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/column.py +0 -0
  43. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/columns.py +0 -0
  44. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/compactions.py +0 -0
  45. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/cpu.py +0 -0
  46. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/dir_data.py +0 -0
  47. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/dir_snapshots.py +0 -0
  48. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/gossip.py +0 -0
  49. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/host_id.py +0 -0
  50. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/memory.py +0 -0
  51. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_address.py +0 -0
  52. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_load.py +0 -0
  53. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_owns.py +0 -0
  54. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_status.py +0 -0
  55. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_tokens.py +0 -0
  56. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/node_utils.py +0 -0
  57. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/pod_name.py +0 -0
  58. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/volume_cassandra.py +0 -0
  59. {kaqing-2.0.82 → kaqing-2.0.84}/adam/columns/volume_root.py +0 -0
  60. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/__init__.py +0 -0
  61. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/alter_tables.py +0 -0
  62. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/app.py +0 -0
  63. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/app_ping.py +0 -0
  64. {kaqing-2.0.82/adam/commands/cql → kaqing-2.0.84/adam/commands/audit}/__init__.py +0 -0
  65. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/bash.py +0 -0
  66. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/check.py +0 -0
  67. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cli_commands.py +0 -0
  68. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/command_helpers.py +0 -0
  69. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/commands_utils.py +0 -0
  70. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cp.py +0 -0
  71. {kaqing-2.0.82/adam/commands/deploy → kaqing-2.0.84/adam/commands/cql}/__init__.py +0 -0
  72. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cql/cql_completions.py +0 -0
  73. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cql/cql_table_completer.py +0 -0
  74. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cql/cql_utils.py +0 -0
  75. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/cql/cqlsh.py +0 -0
  76. {kaqing-2.0.82/adam/commands/describe → kaqing-2.0.84/adam/commands/deploy}/__init__.py +0 -0
  77. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/code_start.py +0 -0
  78. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/code_stop.py +0 -0
  79. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/code_utils.py +0 -0
  80. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/deploy.py +0 -0
  81. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/deploy_frontend.py +0 -0
  82. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  83. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/deploy_pod.py +0 -0
  84. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/deploy_utils.py +0 -0
  85. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/undeploy.py +0 -0
  86. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/undeploy_frontend.py +0 -0
  87. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  88. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/deploy/undeploy_pod.py +0 -0
  89. {kaqing-2.0.82/adam/commands/medusa → kaqing-2.0.84/adam/commands/describe}/__init__.py +0 -0
  90. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/describe/describe.py +0 -0
  91. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/describe/describe_keyspace.py +0 -0
  92. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/describe/describe_keyspaces.py +0 -0
  93. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/describe/describe_table.py +0 -0
  94. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/describe/describe_tables.py +0 -0
  95. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/exit.py +0 -0
  96. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/help.py +0 -0
  97. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/issues.py +0 -0
  98. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/login.py +0 -0
  99. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/logs.py +0 -0
  100. {kaqing-2.0.82/adam/commands/postgres → kaqing-2.0.84/adam/commands/medusa}/__init__.py +0 -0
  101. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/medusa/medusa.py +0 -0
  102. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/medusa/medusa_backup.py +0 -0
  103. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/medusa/medusa_restore.py +0 -0
  104. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  105. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  106. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/nodetool.py +0 -0
  107. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/nodetool_commands.py +0 -0
  108. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/param_get.py +0 -0
  109. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/param_set.py +0 -0
  110. {kaqing-2.0.82/adam/commands/reaper → kaqing-2.0.84/adam/commands/postgres}/__init__.py +0 -0
  111. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/postgres.py +0 -0
  112. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/postgres_ls.py +0 -0
  113. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/postgres_preview.py +0 -0
  114. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/postgres_session.py +0 -0
  115. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/postgres_utils.py +0 -0
  116. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/psql_completions.py +0 -0
  117. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/postgres/psql_table_completer.py +0 -0
  118. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/preview_table.py +0 -0
  119. {kaqing-2.0.82/adam/commands/repair → kaqing-2.0.84/adam/commands/reaper}/__init__.py +0 -0
  120. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper.py +0 -0
  121. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_forward.py +0 -0
  122. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  123. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_restart.py +0 -0
  124. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_run_abort.py +0 -0
  125. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_runs.py +0 -0
  126. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  127. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  128. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  129. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  130. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_schedules.py +0 -0
  131. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_session.py +0 -0
  132. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/reaper/reaper_status.py +0 -0
  133. {kaqing-2.0.82/adam/commands/show → kaqing-2.0.84/adam/commands/repair}/__init__.py +0 -0
  134. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/repair/repair.py +0 -0
  135. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/repair/repair_log.py +0 -0
  136. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/repair/repair_run.py +0 -0
  137. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/repair/repair_scan.py +0 -0
  138. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/repair/repair_stop.py +0 -0
  139. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/report.py +0 -0
  140. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/restart.py +0 -0
  141. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/rollout.py +0 -0
  142. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/shell.py +0 -0
  143. {kaqing-2.0.82/adam/k8s_utils → kaqing-2.0.84/adam/commands/show}/__init__.py +0 -0
  144. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show.py +0 -0
  145. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_adam.py +0 -0
  146. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_app_actions.py +0 -0
  147. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_app_id.py +0 -0
  148. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_app_queues.py +0 -0
  149. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_cassandra_status.py +0 -0
  150. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_cassandra_version.py +0 -0
  151. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_commands.py +0 -0
  152. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_host.py +0 -0
  153. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_login.py +0 -0
  154. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_params.py +0 -0
  155. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_processes.py +0 -0
  156. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_repairs.py +0 -0
  157. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/show/show_storage.py +0 -0
  158. {kaqing-2.0.82 → kaqing-2.0.84}/adam/commands/watch.py +0 -0
  159. {kaqing-2.0.82 → kaqing-2.0.84}/adam/config.py +0 -0
  160. {kaqing-2.0.82 → kaqing-2.0.84}/adam/embedded_apps.py +0 -0
  161. {kaqing-2.0.82/adam/sql → kaqing-2.0.84/adam/k8s_utils}/__init__.py +0 -0
  162. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/cassandra_clusters.py +0 -0
  163. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/cassandra_nodes.py +0 -0
  164. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/config_maps.py +0 -0
  165. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/custom_resources.py +0 -0
  166. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/deployment.py +0 -0
  167. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/ingresses.py +0 -0
  168. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/jobs.py +0 -0
  169. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/kube_context.py +0 -0
  170. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/pods.py +0 -0
  171. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/secrets.py +0 -0
  172. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/service_accounts.py +0 -0
  173. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/services.py +0 -0
  174. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/statefulsets.py +0 -0
  175. {kaqing-2.0.82 → kaqing-2.0.84}/adam/k8s_utils/volumes.py +0 -0
  176. {kaqing-2.0.82 → kaqing-2.0.84}/adam/log.py +0 -0
  177. {kaqing-2.0.82 → kaqing-2.0.84}/adam/pod_exec_result.py +0 -0
  178. {kaqing-2.0.82 → kaqing-2.0.84}/adam/repl_session.py +0 -0
  179. {kaqing-2.0.82/adam/sso → kaqing-2.0.84/adam/sql}/__init__.py +0 -0
  180. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sql/sql_completer.py +0 -0
  181. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sql/term_completer.py +0 -0
  182. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/authenticator.py +0 -0
  183. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/authn_ad.py +0 -0
  184. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/authn_okta.py +0 -0
  185. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/cred_cache.py +0 -0
  186. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/id_token.py +0 -0
  187. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/idp.py +0 -0
  188. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/idp_login.py +0 -0
  189. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/idp_session.py +0 -0
  190. {kaqing-2.0.82 → kaqing-2.0.84}/adam/sso/sso_config.py +0 -0
  191. {kaqing-2.0.82 → kaqing-2.0.84}/adam/utils.py +0 -0
  192. {kaqing-2.0.82 → kaqing-2.0.84}/adam/utils_net.py +0 -0
  193. {kaqing-2.0.82 → kaqing-2.0.84}/kaqing.egg-info/dependency_links.txt +0 -0
  194. {kaqing-2.0.82 → kaqing-2.0.84}/kaqing.egg-info/entry_points.txt +0 -0
  195. {kaqing-2.0.82 → kaqing-2.0.84}/kaqing.egg-info/top_level.txt +0 -0
  196. {kaqing-2.0.82 → kaqing-2.0.84}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.82
3
+ Version: 2.0.84
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -1,5 +1,6 @@
1
1
  import click
2
2
 
3
+ from adam.commands.audit.audit import Audit, AuditCommandHelper
3
4
  from adam.commands.bash import Bash
4
5
  from adam.commands.check import Check, CheckCommandHelper
5
6
  from adam.commands.cp import ClipboardCopy, CopyCommandHelper
@@ -29,6 +30,15 @@ from adam.repl import enter_repl
29
30
  from adam.repl_state import ReplState
30
31
  from adam.cli_group import cli
31
32
 
33
+ @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=AuditCommandHelper, help='Run audit functions.')
34
+ @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
35
+ @click.option('--config', default='params.yaml', metavar='path', help='path to kaqing parameters file')
36
+ @click.option('--param', '-v', multiple=True, metavar='<key>=<value>', help='parameter override')
37
+ @click.argument('extra_args', nargs=-1, metavar='repair', type=click.UNPROCESSED)
38
+ def audit(kubeconfig: str, config: str, param: list[str], extra_args):
39
+ run_command(Audit(), kubeconfig, config, param, None, None, None, extra_args)
40
+
41
+
32
42
  @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=ClusterOrPodCommandHelper, help='Run a single bash command.')
33
43
  @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
34
44
  @click.option('--config', default='params.yaml', metavar='path', help='path to kaqing parameters file')
@@ -0,0 +1,57 @@
1
+ import click
2
+
3
+ from adam.commands.audit.audit_repair_tables import AuditRepairTables
4
+ from adam.commands.command import Command
5
+ from adam.repl_state import ReplState
6
+ from adam.sql.sql_completer import SqlCompleter
7
+ from adam.utils import log2
8
+ from adam.utils_athena import audit_table_names, run_audit_query
9
+
10
+ class Audit(Command):
11
+ COMMAND = 'audit'
12
+
13
+ # the singleton pattern
14
+ def __new__(cls, *args, **kwargs):
15
+ if not hasattr(cls, 'instance'): cls.instance = super(Audit, cls).__new__(cls)
16
+
17
+ return cls.instance
18
+
19
+ def __init__(self, successor: Command=None):
20
+ super().__init__(successor)
21
+
22
+ def command(self):
23
+ return Audit.COMMAND
24
+
25
+ def run(self, cmd: str, state: ReplState):
26
+ if not(args := self.args(cmd)):
27
+ return super().run(cmd, state)
28
+
29
+ state, args = self.apply_state(args, state)
30
+
31
+ r = super().intermediate_run(cmd, state, args, Audit.cmd_list(), display_help=False)
32
+ if isinstance(r, str) and r == 'command-missing':
33
+ sql = 'select * from audit order by ts desc limit 10'
34
+ if args:
35
+ sql = ' '.join(args)
36
+ else:
37
+ log2(sql)
38
+
39
+ run_audit_query(sql)
40
+
41
+ return state
42
+
43
+ def completion(self, state: ReplState):
44
+ if state.device == ReplState.L:
45
+ return super().completion(state) | SqlCompleter.completions(lambda: audit_table_names())
46
+
47
+ return {}
48
+
49
+ def cmd_list():
50
+ return [AuditRepairTables()]
51
+
52
+ def help(self, _: ReplState):
53
+ return f"{Audit.COMMAND} \t run AWS Athena query on audit database"
54
+
55
+ class AuditCommandHelper(click.Command):
56
+ def get_help(self, ctx: click.Context):
57
+ Command.intermediate_help(super().get_help(ctx), Audit.COMMAND, Audit.cmd_list(), show_cluster_help=False)
@@ -0,0 +1,42 @@
1
+ from adam.commands.command import Command
2
+ from adam.repl_state import ReplState
3
+ from adam.utils_athena import run_audit_query
4
+
5
+ class AuditRepairTables(Command):
6
+ COMMAND = 'audit repair'
7
+
8
+ # the singleton pattern
9
+ def __new__(cls, *args, **kwargs):
10
+ if not hasattr(cls, 'instance'): cls.instance = super(AuditRepairTables, cls).__new__(cls)
11
+
12
+ return cls.instance
13
+
14
+ def __init__(self, successor: Command=None):
15
+ super().__init__(successor)
16
+
17
+ def command(self):
18
+ return AuditRepairTables.COMMAND
19
+
20
+ def run(self, cmd: str, state: ReplState):
21
+ if not(args := self.args(cmd)):
22
+ return super().run(cmd, state)
23
+
24
+ state, args = self.apply_state(args, state)
25
+
26
+ tables = ['audit']
27
+ if args:
28
+ tables = args
29
+
30
+ for table in tables:
31
+ run_audit_query(f'MSCK REPAIR TABLE {table}')
32
+
33
+ return state
34
+
35
+ def completion(self, state: ReplState):
36
+ if state.device == ReplState.L:
37
+ return super().completion(state)
38
+
39
+ return {}
40
+
41
+ def help(self, _: ReplState):
42
+ return f"{AuditRepairTables.COMMAND} \t run MSCK REPAIR command for new partition discovery"
@@ -59,6 +59,8 @@ class Cd(Command):
59
59
  state.app_env = dir.split('@')[0]
60
60
  else:
61
61
  state.app_app = dir
62
+ elif state.device == ReplState.L:
63
+ pass
62
64
  else:
63
65
  if dir == '':
64
66
  state.sts = None
@@ -103,7 +105,7 @@ class Cd(Command):
103
105
  return {Cd.COMMAND: {'..': None} | {app[0].split('-')[1]: None for app in Apps.apps(state.app_env)}}
104
106
  else:
105
107
  return {Cd.COMMAND: {'..': None} | {env[0]: None for env in Apps.envs()}}
106
- else:
108
+ elif state.device == ReplState.C:
107
109
  if state.pod:
108
110
  return {Cd.COMMAND: {'..': None}}
109
111
  elif state.sts:
@@ -104,19 +104,22 @@ class Command:
104
104
  cmd = s
105
105
  print()
106
106
 
107
- def intermediate_run(self, cmd: str, state: ReplState, args: list[str], cmds: list['Command'], separator='\t'):
107
+ def intermediate_run(self, cmd: str, state: ReplState, args: list[str], cmds: list['Command'], separator='\t', display_help=True):
108
108
  state, _ = self.apply_state(args, state)
109
109
 
110
110
  if state.in_repl:
111
- log(lines_to_tabular([c.help(state) for c in cmds], separator=separator))
111
+ if display_help:
112
+ log(lines_to_tabular([c.help(state) for c in cmds], separator=separator))
112
113
 
113
114
  return 'command-missing'
114
115
  else:
115
116
  # head with the Chain of Responsibility pattern
116
117
  cmds = Command.chain(cmds)
117
118
  if not cmds.run(cmd, state):
118
- log2('* Command is missing.')
119
- Command.display_help()
119
+ if display_help:
120
+ log2('* Command is missing.')
121
+ Command.display_help()
122
+ return 'command-missing'
120
123
 
121
124
  return state
122
125
 
@@ -1,6 +1,35 @@
1
1
  from adam.commands.command import Command
2
2
  from adam.repl_state import ReplState
3
3
 
4
+ class DeviceAuditLog(Command):
5
+ COMMAND = f'{ReplState.L}:'
6
+
7
+ # the singleton pattern
8
+ def __new__(cls, *args, **kwargs):
9
+ if not hasattr(cls, 'instance'): cls.instance = super(DeviceAuditLog, cls).__new__(cls)
10
+
11
+ return cls.instance
12
+
13
+ def __init__(self, successor: Command=None):
14
+ super().__init__(successor)
15
+
16
+ def command(self):
17
+ return DeviceAuditLog.COMMAND
18
+
19
+ def run(self, cmd: str, state: ReplState):
20
+ if not self.args(cmd):
21
+ return super().run(cmd, state)
22
+
23
+ state.device = ReplState.L
24
+
25
+ return state
26
+
27
+ def completion(self, state: ReplState):
28
+ return super().completion(state)
29
+
30
+ def help(self, _: ReplState):
31
+ return f'{DeviceAuditLog.COMMAND}\t move to Audit Log Operations device'
32
+
4
33
  class DeviceCass(Command):
5
34
  COMMAND = f'{ReplState.C}:'
6
35
 
@@ -14,6 +14,7 @@ from adam.pod_exec_result import PodExecResult
14
14
  from adam.repl_state import ReplState
15
15
  from adam.utils import lines_to_tabular, log, log2
16
16
  from adam.apps import Apps
17
+ from adam.utils_athena import audit_table_names
17
18
 
18
19
  class Ls(Command):
19
20
  COMMAND = 'ls'
@@ -71,6 +72,8 @@ class Ls(Command):
71
72
  svcs = [n for n, ns in Apps.envs()]
72
73
 
73
74
  log(lines_to_tabular(svcs, 'ENV', separator=','))
75
+ elif state.device == ReplState.L:
76
+ self.show_audit_log_tables()
74
77
  else:
75
78
  if state.pod:
76
79
  r: PodExecResult = Cqlsh().run(f'cql describe tables', state)
@@ -127,6 +130,9 @@ class Ls(Command):
127
130
  def show_pg_tables(self, pg: PostgresSession):
128
131
  log(lines_to_tabular(pg_table_names(pg.namespace, pg.directory()), 'NAME', separator=','))
129
132
 
133
+ def show_audit_log_tables(self):
134
+ log(lines_to_tabular(audit_table_names(), 'NAME', separator=','))
135
+
130
136
  def completion(self, state: ReplState):
131
137
  if state.pod:
132
138
  return {}
@@ -40,6 +40,8 @@ class Pwd(Command):
40
40
  words.append(f'env/{state.app_env}')
41
41
  if state.app_app:
42
42
  words.append(f'app/{state.app_app}')
43
+ elif device == ReplState.L:
44
+ pass
43
45
  else:
44
46
  if state.sts:
45
47
  words.append(f'sts/{state.sts}')
@@ -58,6 +60,7 @@ class Pwd(Command):
58
60
  log(lines_to_tabular([
59
61
  device_line(state, ReplState.A),
60
62
  device_line(state, ReplState.C),
63
+ device_line(state, ReplState.L),
61
64
  device_line(state, ReplState.P),
62
65
  f'',
63
66
  f'HOST\t{host}',
@@ -0,0 +1,2 @@
1
+ def config():
2
+ return {'app': {'console-endpoint': 'https://{host}/{env}/{app}/static/console/index.html', 'cr': {'cluster-regex': '(.*?-.*?)-.*', 'group': 'ops.c3.ai', 'v': 'v2', 'plural': 'c3cassandras'}, 'label': 'c3__app_id-0', 'login': {'admin-group': '{host}/C3.ClusterAdmin', 'ingress': '{app_id}-k8singr-appleader-001', 'timeout': 5, 'session-check-url': 'https://{host}/{env}/{app}/api/8/C3/userSessionToken', 'cache-creds': True, 'cache-username': True, 'url': 'https://{host}/{env}/{app}', 'another': "You're logged in to {has}. However, for this app, you need to log in to {need}.", 'token-server-url': 'http://localhost:{port}', 'password-max-length': 128}, 'strip': '0'}, 'audit': {'endpoint': 'https://4psvtaxlcb.execute-api.us-west-2.amazonaws.com/prod/', 'workers': 3, 'timeout': 10, 'athena': {'region': 'us-west-2', 'catalog': 'AwsDataCatalog', 'database': 'audit', 'output': 's3://s3.ops--audit/ddl/results'}}, 'bash': {'workers': 32}, 'cassandra': {'service-name': 'all-pods-service'}, 'cql': {'workers': 32, 'samples': 3, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-superuser', 'password-item': 'password'}, 'alter-tables': {'excludes': 'system_auth,system_traces,reaper_db,system_distributed,system_views,system,system_schema,system_virtual_schema', 'gc-grace-periods': '3600,86400,864000,7776000', 'batching': True}}, 'checks': {'compactions-threshold': 250, 'cpu-busy-threshold': 98.0, 'cpu-threshold': 0.0, 'cassandra-data-path': '/c3/cassandra', 'root-disk-threshold': 50, 'cassandra-disk-threshold': 50, 'snapshot-size-cmd': "ls /c3/cassandra/data/data/*/*/snapshots | grep snapshots | sed 's/:$//g' | xargs -I {} du -sk {} | awk '{print $1}' | awk '{s+=$1} END {print s}'", 'snapshot-size-threshold': '40G', 'table-sizes-cmd': "ls -Al /c3/cassandra/data/data/ | awk '{print $9}' | sed 's/\\^r//g' | xargs -I {} du -sk /c3/cassandra/data/data/{}"}, 'get-host-id': {'workers': 32}, 'idps': {'ad': {'email-pattern': '.*@c3.ai', 'uri': 'https://login.microsoftonline.com/53ad779a-93e7-485c-ba20-ac8290d7252b/oauth2/v2.0/authorize?response_type=id_token&response_mode=form_post&client_id=00ff94a8-6b0a-4715-98e0-95490012d818&scope=openid+email+profile&redirect_uri=https%3A%2F%2Fplat.c3ci.cloud%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://login.microsoftonline.com/common/discovery/keys', 'contact': 'Please contact ted.tran@c3.ai.', 'whitelist-file': '/kaqing/members'}, 'okta': {'default': True, 'email-pattern': '.*@c3iot.com', 'uri': 'https://c3energy.okta.com/oauth2/v1/authorize?response_type=id_token&response_mode=form_post&client_id={client_id}&scope=openid+email+profile+groups&redirect_uri=https%3A%2F%2F{host}%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://c3energy.okta.com/oauth2/v1/keys'}}, 'issues': {'workers': 32}, 'logs': {'path': '/c3/cassandra/logs/system.log'}, 'medusa': {'restore-auto-complete': False}, 'nodetool': {'workers': 32, 'samples': 3, 'commands_in_line': 40}, 'pg': {'name-pattern': '^{namespace}.*-k8spg-.*', 'excludes': '.helm., -admin-secret', 'agent': {'name': 'ops-pg-agent', 'just-in-time': False, 'timeout': 86400, 'image': 'seanahnsf/kaqing'}, 'default-db': 'postgres', 'default-schema': 'postgres', 'secret': {'endpoint-key': 'postgres-db-endpoint', 'port-key': 'postgres-db-port', 'username-key': 'postgres-admin-username', 'password-key': 'postgres-admin-password'}}, 'pod': {'name': 'ops', 'image': 'seanahnsf/kaqing-cloud', 'sa': {'name': 'ops', 'proto': 'c3', 'additional-cluster-roles': 'c3aiops-k8ssandra-operator'}, 'label-selector': 'run=ops'}, 'preview': {'rows': 10}, 'processes': {'columns': 'pod,cpu,mem', 'header': 'POD_NAME,CPU,MEM/LIMIT'}, 'reaper': {'service-name': 'reaper-service', 'port-forward': {'timeout': 86400, 'local-port': 9001}, 'abort-runs-batch': 10, 'show-runs-batch': 100, 'pod': {'cluster-regex': '(.*?-.*?-.*?-.*?)-.*', 'label-selector': 'k8ssandra.io/reaper={cluster}-reaper'}, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-reaper-ui', 'password-item': 'password'}}, 'repair': {'log-path': '/home/cassrepair/logs/', 'image': 'ci-registry.c3iot.io/cloudops/cassrepair:2.0.14', 'secret': 'ciregistryc3iotio', 'env': {'interval': 24, 'timeout': 60, 'pr': False, 'runs': 1}}, 'repl': {'start-drive': 'a', 'auto-enter-app': 'c3/c3', 'auto-enter-only-cluster': True}, 'status': {'columns': 'status,address,load,tokens,owns,host_id,gossip,compactions', 'header': '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS'}, 'storage': {'columns': 'pod,volume_root,volume_cassandra,snapshots,data,compactions', 'header': 'POD_NAME,VOLUME /,VOLUME CASS,SNAPSHOTS,DATA,COMPACTIONS'}, 'watch': {'auto': 'rollout', 'timeout': 3600, 'interval': 10}, 'debug': False, 'debugs': {'timings': False, 'exit-on-error': False, 'show-parallelism': False}}
@@ -51,6 +51,8 @@ def enter_repl(state: ReplState):
51
51
  msg += state.app_env
52
52
  if state.app_app:
53
53
  msg += f'/{state.app_app}'
54
+ elif state.device == ReplState.L:
55
+ msg = f'{ReplState.L}:'
54
56
  else:
55
57
  msg = f'{ReplState.C}:'
56
58
  if state.pod:
@@ -97,6 +99,9 @@ def enter_repl(state: ReplState):
97
99
  event.app.current_buffer.text = ''
98
100
 
99
101
  with concurrent.futures.ThreadPoolExecutor(max_workers=Config().get('audit.workers', 3)) as executor:
102
+ # warm up AWS lambda - this log line may timeout and get lost, which is fine
103
+ executor.submit(audit_log, 'entering kaqing repl', state)
104
+
100
105
  # use sorted command list only for auto-completion
101
106
  sorted_cmds = sorted(cmd_list, key=lambda cmd: cmd.command())
102
107
  while True:
@@ -142,6 +147,10 @@ def enter_repl(state: ReplState):
142
147
  c_sql_tried = True
143
148
  cmd = f'app {cmd}'
144
149
  cmds.run(cmd, state)
150
+ elif state.device == ReplState.L:
151
+ c_sql_tried = True
152
+ cmd = f'audit {cmd}'
153
+ cmds.run(cmd, state)
145
154
  elif state.sts:
146
155
  c_sql_tried = True
147
156
  cmd = f'cql {cmd}'
@@ -178,11 +187,14 @@ def audit_log(cmd: str, state: ReplState):
178
187
  'line': cmd.replace('"', '""').replace('\n', ' '),
179
188
  }
180
189
  audit_endpoint = Config().get("audit.endpoint", "https://4psvtaxlcb.execute-api.us-west-2.amazonaws.com/prod/")
181
- response = requests.post(audit_endpoint, json=payload, timeout=Config().get("audit.timeout", 10))
182
- if response.status_code in [200, 201]:
183
- Config().debug(response.text)
184
- else:
185
- log2(f"Error: {response.status_code} {response.text}")
190
+ try:
191
+ response = requests.post(audit_endpoint, json=payload, timeout=Config().get("audit.timeout", 10))
192
+ if response.status_code in [200, 201]:
193
+ Config().debug(response.text)
194
+ else:
195
+ log2(f"Error: {response.status_code} {response.text}")
196
+ except requests.exceptions.Timeout as e:
197
+ log2(f"Timeout occurred: {e}")
186
198
 
187
199
  @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=ClusterCommandHelper, help="Enter interactive shell.")
188
200
  @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
@@ -1,6 +1,8 @@
1
1
  from adam.commands.alter_tables import AlterTables
2
2
  from adam.commands.app import App
3
3
  from adam.commands.app_ping import AppPing
4
+ from adam.commands.audit.audit import Audit
5
+ from adam.commands.audit.audit_repair_tables import AuditRepairTables
4
6
  from adam.commands.deploy.code_start import CodeStart
5
7
  from adam.commands.deploy.code_stop import CodeStop
6
8
  from adam.commands.deploy.deploy import Deploy
@@ -24,7 +26,7 @@ from adam.commands.cd import Cd
24
26
  from adam.commands.check import Check
25
27
  from adam.commands.command import Command
26
28
  from adam.commands.cql.cqlsh import Cqlsh
27
- from adam.commands.devices import DeviceApp, DeviceCass, DevicePostgres
29
+ from adam.commands.devices import DeviceApp, DeviceAuditLog, DeviceCass, DevicePostgres
28
30
  from adam.commands.exit import Exit
29
31
  from adam.commands.medusa.medusa import Medusa
30
32
  from adam.commands.param_get import GetParam
@@ -77,7 +79,7 @@ class ReplCommands:
77
79
  return deduped
78
80
 
79
81
  def navigation() -> list[Command]:
80
- return [Ls(), PreviewTable(), DeviceApp(), DevicePostgres(), DeviceCass(), Cd(), Pwd(), ClipboardCopy(),
82
+ return [Ls(), PreviewTable(), DeviceApp(), DevicePostgres(), DeviceCass(), DeviceAuditLog(), Cd(), Pwd(), ClipboardCopy(),
81
83
  GetParam(), SetParam(), ShowParams(), ShowKubectlCommands(), ShowLogin(), ShowAdam(), ShowHost()]
82
84
 
83
85
  def cassandra_check() -> list[Command]:
@@ -89,7 +91,7 @@ class ReplCommands:
89
91
 
90
92
  def tools() -> list[Command]:
91
93
  return [Cqlsh(), Postgres(), Bash(), Shell(), CodeStart(), CodeStop(), DeployFrontend(), UndeployFrontend(),
92
- DeployPod(), UndeployPod(), DeployPgAgent(), UndeployPgAgent()]
94
+ DeployPod(), UndeployPod(), DeployPgAgent(), UndeployPgAgent(), AuditRepairTables(), Audit()]
93
95
 
94
96
  def app() -> list[Command]:
95
97
  return [ShowAppActions(), ShowAppId(), ShowAppQueues(), AppPing(), App()]
@@ -48,6 +48,7 @@ class RequiredState(Enum):
48
48
  class ReplState:
49
49
  A = 'a'
50
50
  C = 'c'
51
+ L = 'l'
51
52
  P = 'p'
52
53
 
53
54
  def __init__(self, device: str = None,
@@ -129,7 +130,7 @@ class ReplState:
129
130
  if index < 6:
130
131
  state = copy.copy(state)
131
132
 
132
- groups = re.match(r'^([a|c|p]):(.*)$', arg)
133
+ groups = re.match(r'^([a|c|l|p]):(.*)$', arg)
133
134
  if groups:
134
135
  if groups[1] == 'p':
135
136
  state.device = 'p'
@@ -146,6 +147,8 @@ class ReplState:
146
147
  state.namespace = p_and_ns[1]
147
148
  elif ns := KubeContext.in_cluster_namespace():
148
149
  state.namespace = ns
150
+ elif groups[1] == 'l':
151
+ state.device = 'l'
149
152
  else:
150
153
  state.device = 'a'
151
154
  if path := groups[2]:
@@ -134,7 +134,7 @@ SPEC = [
134
134
  'select_a > , > select_a_comma_',
135
135
  'select_a_comma_ > name|* > select_a ^ *',
136
136
  'select_a_ > from > select_from ^ from',
137
- 'select_from_ > name > select_from_x ^ (select,tables',
137
+ 'select_from_ > name|audit > select_from_x ^ (select,tables',
138
138
  '- > ( > select_from_lp_',
139
139
  '- < ) > select_from_sq',
140
140
  'select_from_lp_ > select > select',
@@ -269,7 +269,8 @@ KEYWORDS = [
269
269
  'left join', 'right outer join', 'right join', 'full join', 'full outer join',
270
270
  'insert', 'into', 'values',
271
271
  'update', 'where', 'set',
272
- 'delete'
272
+ 'delete',
273
+ 'audit'
273
274
  ]
274
275
 
275
276
  class StateTo:
File without changes
@@ -0,0 +1,61 @@
1
+ import functools
2
+ import time
3
+ import boto3
4
+
5
+ from adam.config import Config
6
+ from adam.utils import lines_to_tabular, log, log2
7
+
8
+ @functools.lru_cache()
9
+ def audit_table_names():
10
+ region_name = Config().get('audit.athena.region', 'us-west-2')
11
+ database_name = Config().get('audit.athena.database', 'audit')
12
+ catalog_name = Config().get('audit.athena.catalog', 'AwsDataCatalog')
13
+
14
+ athena_client = boto3.client('athena', region_name=region_name)
15
+ paginator = athena_client.get_paginator('list_table_metadata')
16
+
17
+ table_names = []
18
+ for page in paginator.paginate(CatalogName=catalog_name, DatabaseName=database_name):
19
+ for table_metadata in page.get('TableMetadataList', []):
20
+ table_names.append(table_metadata['Name'])
21
+
22
+ return table_names
23
+
24
+ def run_audit_query(sql: str):
25
+ athena_client = boto3.client('athena')
26
+
27
+ database_name = Config().get('audit.athena.database', 'audit')
28
+ s3_output_location = Config().get('audit.athena.output', 's3://s3.ops--audit/ddl/results')
29
+
30
+ response = athena_client.start_query_execution(
31
+ QueryString=sql,
32
+ QueryExecutionContext={
33
+ 'Database': database_name
34
+ },
35
+ ResultConfiguration={
36
+ 'OutputLocation': s3_output_location
37
+ }
38
+ )
39
+
40
+ query_execution_id = response['QueryExecutionId']
41
+
42
+ while True:
43
+ query_status = athena_client.get_query_execution(QueryExecutionId=query_execution_id)
44
+ state = query_status['QueryExecution']['Status']['State']
45
+ if state in ['SUCCEEDED', 'FAILED', 'CANCELLED']:
46
+ break
47
+ time.sleep(1)
48
+
49
+ if state == 'SUCCEEDED':
50
+ results_response = athena_client.get_query_results(QueryExecutionId=query_execution_id)
51
+ column_info = results_response['ResultSet']['Rows'][0]['Data']
52
+ columns = [col.get('VarCharValue') for col in column_info]
53
+ lines = []
54
+ for row in results_response['ResultSet']['Rows'][1:]:
55
+ row_data = [col.get('VarCharValue') for col in row['Data']]
56
+ lines.append('\t'.join(row_data))
57
+
58
+ log(lines_to_tabular(lines, header='\t'.join(columns), separator='\t'))
59
+ else:
60
+ log2(f"Query failed or was cancelled. State: {state}")
61
+ log2(f"Reason: {query_status['QueryExecution']['Status'].get('StateChangeReason')}")
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.84" #: the working version
5
+ __release__ = "1.0.0" #: the release version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.82
3
+ Version: 2.0.84
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -16,6 +16,7 @@ adam/repl_commands.py
16
16
  adam/repl_session.py
17
17
  adam/repl_state.py
18
18
  adam/utils.py
19
+ adam/utils_athena.py
19
20
  adam/utils_net.py
20
21
  adam/version.py
21
22
  adam/checks/__init__.py
@@ -79,6 +80,9 @@ adam/commands/restart.py
79
80
  adam/commands/rollout.py
80
81
  adam/commands/shell.py
81
82
  adam/commands/watch.py
83
+ adam/commands/audit/__init__.py
84
+ adam/commands/audit/audit.py
85
+ adam/commands/audit/audit_repair_tables.py
82
86
  adam/commands/cql/__init__.py
83
87
  adam/commands/cql/cql_completions.py
84
88
  adam/commands/cql/cql_table_completer.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='kaqing',
5
- version='2.0.82',
5
+ version='2.0.84',
6
6
  packages=find_packages(),
7
7
  entry_points={
8
8
  'console_scripts': [
@@ -1,2 +0,0 @@
1
- def config():
2
- return {'app': {'console-endpoint': 'https://{host}/{env}/{app}/static/console/index.html', 'cr': {'cluster-regex': '(.*?-.*?)-.*', 'group': 'ops.c3.ai', 'v': 'v2', 'plural': 'c3cassandras'}, 'label': 'c3__app_id-0', 'login': {'admin-group': '{host}/C3.ClusterAdmin', 'ingress': '{app_id}-k8singr-appleader-001', 'timeout': 5, 'session-check-url': 'https://{host}/{env}/{app}/api/8/C3/userSessionToken', 'cache-creds': True, 'cache-username': True, 'url': 'https://{host}/{env}/{app}', 'another': "You're logged in to {has}. However, for this app, you need to log in to {need}.", 'token-server-url': 'http://localhost:{port}', 'password-max-length': 128}, 'strip': '0'}, 'audit': {'endpoint': 'https://4psvtaxlcb.execute-api.us-west-2.amazonaws.com/prod/', 'workers': 3, 'timeout': 10}, 'bash': {'workers': 32}, 'cassandra': {'service-name': 'all-pods-service'}, 'cql': {'workers': 32, 'samples': 3, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-superuser', 'password-item': 'password'}, 'alter-tables': {'excludes': 'system_auth,system_traces,reaper_db,system_distributed,system_views,system,system_schema,system_virtual_schema', 'gc-grace-periods': '3600,86400,864000,7776000', 'batching': True}}, 'checks': {'compactions-threshold': 250, 'cpu-busy-threshold': 98.0, 'cpu-threshold': 0.0, 'cassandra-data-path': '/c3/cassandra', 'root-disk-threshold': 50, 'cassandra-disk-threshold': 50, 'snapshot-size-cmd': "ls /c3/cassandra/data/data/*/*/snapshots | grep snapshots | sed 's/:$//g' | xargs -I {} du -sk {} | awk '{print $1}' | awk '{s+=$1} END {print s}'", 'snapshot-size-threshold': '40G', 'table-sizes-cmd': "ls -Al /c3/cassandra/data/data/ | awk '{print $9}' | sed 's/\\^r//g' | xargs -I {} du -sk /c3/cassandra/data/data/{}"}, 'get-host-id': {'workers': 32}, 'idps': {'ad': {'email-pattern': '.*@c3.ai', 'uri': 'https://login.microsoftonline.com/53ad779a-93e7-485c-ba20-ac8290d7252b/oauth2/v2.0/authorize?response_type=id_token&response_mode=form_post&client_id=00ff94a8-6b0a-4715-98e0-95490012d818&scope=openid+email+profile&redirect_uri=https%3A%2F%2Fplat.c3ci.cloud%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://login.microsoftonline.com/common/discovery/keys', 'contact': 'Please contact ted.tran@c3.ai.', 'whitelist-file': '/kaqing/members'}, 'okta': {'default': True, 'email-pattern': '.*@c3iot.com', 'uri': 'https://c3energy.okta.com/oauth2/v1/authorize?response_type=id_token&response_mode=form_post&client_id={client_id}&scope=openid+email+profile+groups&redirect_uri=https%3A%2F%2F{host}%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://c3energy.okta.com/oauth2/v1/keys'}}, 'issues': {'workers': 32}, 'logs': {'path': '/c3/cassandra/logs/system.log'}, 'medusa': {'restore-auto-complete': False}, 'nodetool': {'workers': 32, 'samples': 3, 'commands_in_line': 40}, 'pg': {'name-pattern': '^{namespace}.*-k8spg-.*', 'excludes': '.helm., -admin-secret', 'agent': {'name': 'ops-pg-agent', 'just-in-time': False, 'timeout': 86400, 'image': 'seanahnsf/kaqing'}, 'default-db': 'postgres', 'default-schema': 'postgres', 'secret': {'endpoint-key': 'postgres-db-endpoint', 'port-key': 'postgres-db-port', 'username-key': 'postgres-admin-username', 'password-key': 'postgres-admin-password'}}, 'pod': {'name': 'ops', 'image': 'seanahnsf/kaqing-cloud', 'sa': {'name': 'ops', 'proto': 'c3', 'additional-cluster-roles': 'c3aiops-k8ssandra-operator'}, 'label-selector': 'run=ops'}, 'preview': {'rows': 10}, 'processes': {'columns': 'pod,cpu,mem', 'header': 'POD_NAME,CPU,MEM/LIMIT'}, 'reaper': {'service-name': 'reaper-service', 'port-forward': {'timeout': 86400, 'local-port': 9001}, 'abort-runs-batch': 10, 'show-runs-batch': 100, 'pod': {'cluster-regex': '(.*?-.*?-.*?-.*?)-.*', 'label-selector': 'k8ssandra.io/reaper={cluster}-reaper'}, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-reaper-ui', 'password-item': 'password'}}, 'repair': {'log-path': '/home/cassrepair/logs/', 'image': 'ci-registry.c3iot.io/cloudops/cassrepair:2.0.14', 'secret': 'ciregistryc3iotio', 'env': {'interval': 24, 'timeout': 60, 'pr': False, 'runs': 1}}, 'repl': {'start-drive': 'a', 'auto-enter-app': 'c3/c3', 'auto-enter-only-cluster': True}, 'status': {'columns': 'status,address,load,tokens,owns,host_id,gossip,compactions', 'header': '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS'}, 'storage': {'columns': 'pod,volume_root,volume_cassandra,snapshots,data,compactions', 'header': 'POD_NAME,VOLUME /,VOLUME CASS,SNAPSHOTS,DATA,COMPACTIONS'}, 'watch': {'auto': 'rollout', 'timeout': 3600, 'interval': 10}, 'debug': False, 'debugs': {'timings': False, 'exit-on-error': False, 'show-parallelism': False}}
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
-
4
- __version__ = "2.0.82" #: the working version
5
- __release__ = "1.0.0" #: the release version
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes