awsebcli 3.26__tar.gz → 3.27__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.
Files changed (210) hide show
  1. {awsebcli-3.26 → awsebcli-3.27}/CHANGES.rst +5 -0
  2. {awsebcli-3.26/awsebcli.egg-info → awsebcli-3.27}/PKG-INFO +35 -5
  3. {awsebcli-3.26 → awsebcli-3.27/awsebcli.egg-info}/PKG-INFO +35 -5
  4. {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/SOURCES.txt +3 -1
  5. {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/entry_points.txt +0 -1
  6. {awsebcli-3.26 → awsebcli-3.27}/ebcli/__init__.py +1 -1
  7. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/logs.py +23 -0
  8. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/commonops.py +2 -0
  9. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/logsops.py +37 -4
  10. {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/statics.py +1 -0
  11. {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/strings.py +11 -0
  12. awsebcli-3.27/tests/test_dependencies_mismatch.py +145 -0
  13. awsebcli-3.27/tests/test_help_texts.py +1767 -0
  14. {awsebcli-3.26 → awsebcli-3.27}/LICENSE.txt +0 -0
  15. {awsebcli-3.26 → awsebcli-3.27}/MANIFEST.in +0 -0
  16. {awsebcli-3.26 → awsebcli-3.27}/README.rst +0 -0
  17. {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/dependency_links.txt +0 -0
  18. {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/requires.txt +0 -0
  19. {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/top_level.txt +0 -0
  20. {awsebcli-3.26 → awsebcli-3.27}/bin/__init__.py +0 -0
  21. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/__init__.py +0 -0
  22. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/__init__.py +0 -0
  23. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/event.py +0 -0
  24. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/exceptions.py +0 -0
  25. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/overrides.py +0 -0
  26. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/screen.py +0 -0
  27. {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/utilities.py +0 -0
  28. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/__init__.py +0 -0
  29. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/abstractcontainer.py +0 -0
  30. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/commands.py +0 -0
  31. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/compat.py +0 -0
  32. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/compose.py +0 -0
  33. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/container_viewmodel.py +0 -0
  34. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/container_config.json +0 -0
  35. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-4.0-jdk7 +0 -0
  36. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-4.1-jdk8 +0 -0
  37. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-5.0-al +0 -0
  38. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/golang-runtime-1.3 +0 -0
  39. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/golang-runtime-1.4 +0 -0
  40. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/python3-runtime +0 -0
  41. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerops.py +0 -0
  42. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/dockerrun.py +0 -0
  43. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/envvarcollector.py +0 -0
  44. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/factory.py +0 -0
  45. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/fshandler.py +0 -0
  46. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/generic_container.py +0 -0
  47. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/log.py +0 -0
  48. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/multicontainer.py +0 -0
  49. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/pathconfig.py +0 -0
  50. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/preconfigured_container.py +0 -0
  51. {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/utils.py +0 -0
  52. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/__init__.py +0 -0
  53. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/abort.py +0 -0
  54. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/appversion.py +0 -0
  55. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/clone.py +0 -0
  56. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/codesource.py +0 -0
  57. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/config.py +0 -0
  58. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/console.py +0 -0
  59. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/create.py +0 -0
  60. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/deploy.py +0 -0
  61. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/events.py +0 -0
  62. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/health.py +0 -0
  63. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/initialize.py +0 -0
  64. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/lifecycle.py +0 -0
  65. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/list.py +0 -0
  66. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/local.py +0 -0
  67. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate.py +0 -0
  68. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/add_virtual_dir_read_access.ps1 +0 -0
  69. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/arr_configuration_importer_script.ps1 +0 -0
  70. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/arr_msi_installer.ps1 +0 -0
  71. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/default_web_site_port_reassignment_template.ps1 +0 -0
  72. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/ebdeploy_utils.ps1 +0 -0
  73. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/modify_firewall_config.ps1 +0 -0
  74. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/noop.ps1 +0 -0
  75. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/reinstate_iisstart_htm_default_document.ps1 +0 -0
  76. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_installer_template.ps1 +0 -0
  77. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_removal_template.ps1 +0 -0
  78. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_restart_template.ps1 +0 -0
  79. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/windows_proxy_feature_enabler.ps1 +0 -0
  80. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/open.py +0 -0
  81. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/__init__.py +0 -0
  82. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/create.py +0 -0
  83. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/delete.py +0 -0
  84. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/events.py +0 -0
  85. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/initialize.py +0 -0
  86. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/list.py +0 -0
  87. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/logs.py +0 -0
  88. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/status.py +0 -0
  89. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/use.py +0 -0
  90. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/printenv.py +0 -0
  91. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/restore.py +0 -0
  92. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/scale.py +0 -0
  93. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/setenv.py +0 -0
  94. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/ssh.py +0 -0
  95. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/status.py +0 -0
  96. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/swap.py +0 -0
  97. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/tags.py +0 -0
  98. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/terminate.py +0 -0
  99. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/upgrade.py +0 -0
  100. {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/use.py +0 -0
  101. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/__init__.py +0 -0
  102. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/abstractcontroller.py +0 -0
  103. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/base.py +0 -0
  104. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebcore.py +0 -0
  105. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebglobals.py +0 -0
  106. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebpcore.py +0 -0
  107. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebrun.py +0 -0
  108. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/fileoperations.py +0 -0
  109. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/hooks.py +0 -0
  110. {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/io.py +0 -0
  111. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/__init__.py +0 -0
  112. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/appversion.py +0 -0
  113. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/data_poller.py +0 -0
  114. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/environments.py +0 -0
  115. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/help.py +0 -0
  116. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/screen.py +0 -0
  117. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/specialtables.py +0 -0
  118. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/table.py +0 -0
  119. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/term.py +0 -0
  120. {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/traditional.py +0 -0
  121. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/__init__.py +0 -0
  122. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cleanupversions.py +0 -0
  123. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/cwl-activity-logs-v1.config +0 -0
  124. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/cwl-setup-v1.config +0 -0
  125. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/eb-logs-v1.config +0 -0
  126. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchsetup.py +0 -0
  127. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/controller.py +0 -0
  128. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/convertdockerrun.py +0 -0
  129. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/download.py +0 -0
  130. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/quicklink.py +0 -0
  131. {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/setupssl.py +0 -0
  132. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/__init__.py +0 -0
  133. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/aws.py +0 -0
  134. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botocoredata/elasticbeanstalk/2010-12-01/paginators-1.json +0 -0
  135. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botocoredata/elasticbeanstalk/2010-12-01/service-2.json +0 -0
  136. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botopatch.py +0 -0
  137. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/cloudformation.py +0 -0
  138. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/cloudwatch.py +0 -0
  139. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/codebuild.py +0 -0
  140. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/codecommit.py +0 -0
  141. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/ec2.py +0 -0
  142. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elasticbeanstalk.py +0 -0
  143. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elb.py +0 -0
  144. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elbv2.py +0 -0
  145. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/heuristics.py +0 -0
  146. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/iam.py +0 -0
  147. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/kms.py +0 -0
  148. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/s3.py +0 -0
  149. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/sns.py +0 -0
  150. {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/utils.py +0 -0
  151. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/__init__.py +0 -0
  152. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/api_filters.py +0 -0
  153. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/application.py +0 -0
  154. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/buildconfiguration.py +0 -0
  155. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/cfn_stack.py +0 -0
  156. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/conversionconfiguration.py +0 -0
  157. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/environment.py +0 -0
  158. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/environmentsettings.py +0 -0
  159. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/event.py +0 -0
  160. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/exceptions.py +0 -0
  161. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/lifecycleconfiguration.py +0 -0
  162. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/log_stream.py +0 -0
  163. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/platform.py +0 -0
  164. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/region.py +0 -0
  165. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/requests.py +0 -0
  166. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/solutionstack.py +0 -0
  167. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/sourcecontrol.py +0 -0
  168. {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/tier.py +0 -0
  169. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/__init__.py +0 -0
  170. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/abortops.py +0 -0
  171. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/appversionops.py +0 -0
  172. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/buildspecops.py +0 -0
  173. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/cloneops.py +0 -0
  174. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/composeops.py +0 -0
  175. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/configops.py +0 -0
  176. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/consoleops.py +0 -0
  177. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/createops.py +0 -0
  178. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/deployops.py +0 -0
  179. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/envvarops.py +0 -0
  180. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/eventsops.py +0 -0
  181. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/gitops.py +0 -0
  182. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/healthops.py +0 -0
  183. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/initializeops.py +0 -0
  184. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/lifecycleops.py +0 -0
  185. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/listops.py +0 -0
  186. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/localops.py +0 -0
  187. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/openops.py +0 -0
  188. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platform_branch_ops.py +0 -0
  189. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platform_version_ops.py +0 -0
  190. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platformops.py +0 -0
  191. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/restoreops.py +0 -0
  192. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/saved_configs.py +0 -0
  193. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/scaleops.py +0 -0
  194. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/shared_lb_ops.py +0 -0
  195. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/solution_stack_ops.py +0 -0
  196. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/spotops.py +0 -0
  197. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/sshops.py +0 -0
  198. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/statusops.py +0 -0
  199. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/swapops.py +0 -0
  200. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/__init__.py +0 -0
  201. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/taglist.py +0 -0
  202. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/tagops.py +0 -0
  203. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/terminateops.py +0 -0
  204. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/upgradeops.py +0 -0
  205. {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/useops.py +0 -0
  206. {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/__init__.py +0 -0
  207. {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/regex.py +0 -0
  208. {awsebcli-3.26 → awsebcli-3.27}/requirements.txt +0 -0
  209. {awsebcli-3.26 → awsebcli-3.27}/setup.cfg +0 -0
  210. {awsebcli-3.26 → awsebcli-3.27}/setup.py +0 -0
@@ -1,5 +1,10 @@
1
1
  Changelog
2
2
  =========
3
+ --------------------
4
+ 3.27 (2026-03-16)
5
+ --------------------
6
+ - Added `--analyze` flag to `eb logs` command for AI-powered log analysis
7
+
3
8
  --------------------
4
9
  3.26 (2026-01-07)
5
10
  --------------------
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: awsebcli
3
- Version: 3.26
3
+ Version: 3.27
4
4
  Summary: Command Line Interface for AWS EB.
5
5
  Home-page: http://aws.amazon.com/elasticbeanstalk/
6
6
  Author: AWS Elastic Beanstalk
7
7
  Author-email: aws-eb-cli@amazon.com
8
8
  License: Apache License 2.0
9
- Platform: UNKNOWN
10
9
  Classifier: Development Status :: 5 - Production/Stable
11
10
  Classifier: Intended Audience :: Developers
12
11
  Classifier: Intended Audience :: System Administrators
@@ -20,6 +19,34 @@ Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  License-File: LICENSE.txt
22
+ Requires-Dist: botocore<2,>=1.35.0
23
+ Requires-Dist: cement==2.10.14
24
+ Requires-Dist: colorama<0.5,>=0.4.6
25
+ Requires-Dist: pathspec==0.12.1
26
+ Requires-Dist: python-dateutil<3.0.0,>=2.1
27
+ Requires-Dist: requests<3,>=2.31
28
+ Requires-Dist: setuptools>=20.0
29
+ Requires-Dist: semantic_version<2.11,>=2.10.0
30
+ Requires-Dist: termcolor<3,>=2.4.0
31
+ Requires-Dist: wcwidth<0.3,>=0.2.13
32
+ Requires-Dist: PyYAML<6.1,>=5.3.1
33
+ Requires-Dist: urllib3<2,>=1.26.5
34
+ Requires-Dist: packaging<25.0,>=24.2
35
+ Requires-Dist: blessed>=1.20.0
36
+ Requires-Dist: fabric==3.2.2
37
+ Requires-Dist: pythonnet<4,>=3.0.5; platform_system == "Windows"
38
+ Requires-Dist: pypiwin32==219; sys_platform == "win32" and python_version < "3.6"
39
+ Requires-Dist: pypiwin32==223; sys_platform == "win32" and python_version >= "3.6"
40
+ Dynamic: author
41
+ Dynamic: author-email
42
+ Dynamic: classifier
43
+ Dynamic: description
44
+ Dynamic: home-page
45
+ Dynamic: license
46
+ Dynamic: license-file
47
+ Dynamic: provides-extra
48
+ Dynamic: requires-dist
49
+ Dynamic: summary
23
50
 
24
51
  ======
25
52
  EB CLI
@@ -99,6 +126,11 @@ in the *AWS Elastic Beanstalk Developer Guide*.
99
126
 
100
127
  Changelog
101
128
  =========
129
+ --------------------
130
+ 3.27 (2026-03-16)
131
+ --------------------
132
+ - Added `--analyze` flag to `eb logs` command for AI-powered log analysis
133
+
102
134
  --------------------
103
135
  3.26 (2026-01-07)
104
136
  --------------------
@@ -964,5 +996,3 @@ Changelog
964
996
  - Default database username changed from admin to ebroot
965
997
  - Trim application version description if it is too long
966
998
  - Application version no longer includes git hash
967
-
968
-
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: awsebcli
3
- Version: 3.26
3
+ Version: 3.27
4
4
  Summary: Command Line Interface for AWS EB.
5
5
  Home-page: http://aws.amazon.com/elasticbeanstalk/
6
6
  Author: AWS Elastic Beanstalk
7
7
  Author-email: aws-eb-cli@amazon.com
8
8
  License: Apache License 2.0
9
- Platform: UNKNOWN
10
9
  Classifier: Development Status :: 5 - Production/Stable
11
10
  Classifier: Intended Audience :: Developers
12
11
  Classifier: Intended Audience :: System Administrators
@@ -20,6 +19,34 @@ Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  License-File: LICENSE.txt
22
+ Requires-Dist: botocore<2,>=1.35.0
23
+ Requires-Dist: cement==2.10.14
24
+ Requires-Dist: colorama<0.5,>=0.4.6
25
+ Requires-Dist: pathspec==0.12.1
26
+ Requires-Dist: python-dateutil<3.0.0,>=2.1
27
+ Requires-Dist: requests<3,>=2.31
28
+ Requires-Dist: setuptools>=20.0
29
+ Requires-Dist: semantic_version<2.11,>=2.10.0
30
+ Requires-Dist: termcolor<3,>=2.4.0
31
+ Requires-Dist: wcwidth<0.3,>=0.2.13
32
+ Requires-Dist: PyYAML<6.1,>=5.3.1
33
+ Requires-Dist: urllib3<2,>=1.26.5
34
+ Requires-Dist: packaging<25.0,>=24.2
35
+ Requires-Dist: blessed>=1.20.0
36
+ Requires-Dist: fabric==3.2.2
37
+ Requires-Dist: pythonnet<4,>=3.0.5; platform_system == "Windows"
38
+ Requires-Dist: pypiwin32==219; sys_platform == "win32" and python_version < "3.6"
39
+ Requires-Dist: pypiwin32==223; sys_platform == "win32" and python_version >= "3.6"
40
+ Dynamic: author
41
+ Dynamic: author-email
42
+ Dynamic: classifier
43
+ Dynamic: description
44
+ Dynamic: home-page
45
+ Dynamic: license
46
+ Dynamic: license-file
47
+ Dynamic: provides-extra
48
+ Dynamic: requires-dist
49
+ Dynamic: summary
23
50
 
24
51
  ======
25
52
  EB CLI
@@ -99,6 +126,11 @@ in the *AWS Elastic Beanstalk Developer Guide*.
99
126
 
100
127
  Changelog
101
128
  =========
129
+ --------------------
130
+ 3.27 (2026-03-16)
131
+ --------------------
132
+ - Added `--analyze` flag to `eb logs` command for AI-powered log analysis
133
+
102
134
  --------------------
103
135
  3.26 (2026-01-07)
104
136
  --------------------
@@ -964,5 +996,3 @@ Changelog
964
996
  - Default database username changed from admin to ebroot
965
997
  - Trim application version description if it is too long
966
998
  - Application version no longer includes git hash
967
-
968
-
@@ -203,4 +203,6 @@ ebcli/operations/tagops/tagops.py
203
203
  ebcli/resources/__init__.py
204
204
  ebcli/resources/regex.py
205
205
  ebcli/resources/statics.py
206
- ebcli/resources/strings.py
206
+ ebcli/resources/strings.py
207
+ tests/test_dependencies_mismatch.py
208
+ tests/test_help_texts.py
@@ -1,4 +1,3 @@
1
1
  [console_scripts]
2
2
  eb = ebcli.core.ebcore:main
3
3
  ebp = ebcli.core.ebpcore:main
4
-
@@ -11,4 +11,4 @@
11
11
  # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
12
  # ANY KIND, either express or implied. See the License for the specific
13
13
  # language governing permissions and limitations under the License.
14
- __version__ = '3.26'
14
+ __version__ = '3.27'
@@ -33,6 +33,8 @@ class LogsController(AbstractBaseController):
33
33
  action='store_true', help=flag_text['logs.all'])),
34
34
  (['-z', '--zip'], dict(
35
35
  action='store_true', help=flag_text['logs.zip'])),
36
+ (['-ai', '--analyze'], dict(action='store_true',
37
+ help=flag_text['logs.analyze'])),
36
38
  (['-i', '--instance'], dict(help=flag_text['logs.instance'])),
37
39
  (['-g', '--log-group'], dict(help=flag_text['logs.log-group'])),
38
40
  (['-cw', '--cloudwatch-logs'], dict(help=flag_text['logs.cloudwatch_logs'], nargs='?',
@@ -51,6 +53,7 @@ class LogsController(AbstractBaseController):
51
53
  self.instance = self.app.pargs.instance
52
54
  self.all = self.app.pargs.all
53
55
  self.zip = self.app.pargs.zip
56
+ self.analyze = self.app.pargs.analyze
54
57
  self.cloudwatch_logs = self.app.pargs.cloudwatch_logs
55
58
  self.cloudwatch_log_source = self.app.pargs.cloudwatch_log_source
56
59
  self.stream = self.app.pargs.stream
@@ -61,6 +64,8 @@ class LogsController(AbstractBaseController):
61
64
  self.__modify_log_streaming()
62
65
  elif self.stream:
63
66
  self.__stream_cloudwatch_logs()
67
+ elif self.analyze:
68
+ self.__analyze_logs()
64
69
  else:
65
70
  self.__get_logs()
66
71
 
@@ -144,6 +149,18 @@ class LogsController(AbstractBaseController):
144
149
  if self.cloudwatch_logs and self.zip:
145
150
  raise InvalidOptionsError(strings['logs.cloudwatch_logs_argument_and_zip_argument'])
146
151
 
152
+ if self.analyze and self.instance:
153
+ raise InvalidOptionsError(strings['logs.analyze_argument_and_instance_argument'])
154
+
155
+ if self.analyze and self.all:
156
+ raise InvalidOptionsError(strings['logs.analyze_argument_and_all_argument'])
157
+
158
+ if self.analyze and self.zip:
159
+ raise InvalidOptionsError(strings['logs.analyze_argument_and_zip_argument'])
160
+
161
+ if self.analyze and self.log_group:
162
+ raise InvalidOptionsError(strings['logs.analyze_argument_and_log_group_argument'])
163
+
147
164
  if self.cloudwatch_log_source and self.cloudwatch_log_source not in [
148
165
  logs_operations_constants.LOG_SOURCES.ALL_LOG_SOURCES,
149
166
  logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE,
@@ -184,3 +201,9 @@ class LogsController(AbstractBaseController):
184
201
  raise InvalidOptionsError(strings['logs.environment_health_log_streaming_disabled'].format(self.env_name))
185
202
 
186
203
  logsops.stream_instance_logs_from_cloudwatch(log_group=self.__normalized_log_group_name())
204
+
205
+ def __analyze_logs(self):
206
+ logsops.retrieve_beanstalk_logs(
207
+ self.env_name,
208
+ logs_operations_constants.INFORMATION_FORMAT.ANALYZE,
209
+ )
@@ -303,6 +303,8 @@ def _is_success_event(message, log_events=False):
303
303
  return True
304
304
  if responses['logs.successbundle'] in message:
305
305
  return True
306
+ if responses['logs.successanalyze'] in message:
307
+ return True
306
308
  if responses['tags.tag_update_successful'] in message:
307
309
  return True
308
310
  if message.startswith(responses['event.platformdeletesuccess']):
@@ -330,24 +330,47 @@ def get_instance_log_url_mappings(env_name, info_type):
330
330
  return instance_id_list
331
331
 
332
332
 
333
+ def _get_latest_instance_log_url_mappings(env_name, info_type):
334
+ result = elasticbeanstalk.retrieve_environment_info(env_name, info_type)
335
+
336
+ instance_id_list = dict()
337
+ instance_timestamps = dict()
338
+
339
+ for log in result['EnvironmentInfo']:
340
+ instance_id = log['Ec2InstanceId']
341
+ url = log['Message']
342
+ timestamp = log.get('SampleTimestamp')
343
+
344
+ if instance_id not in instance_id_list or timestamp > instance_timestamps[instance_id]:
345
+ instance_id_list[instance_id] = url
346
+ instance_timestamps[instance_id] = timestamp
347
+
348
+ return instance_id_list
349
+
350
+
333
351
  def get_logs(env_name, info_type, do_zip=False, instance_id=None):
334
352
  """
335
353
  Obtains the set of logs from ElasticBeanstalk for the environment `env_name` from ElasticBeanstalk
336
354
  (and not CloudWatch) for the environment, `env_name` and determines whether to tail it or bundle/zip
337
355
  it.
338
356
  :param env_name: An Elastic Beanstalk environment name
339
- :param info_type: The type of information to request. Possible values: tail, bundle
357
+ :param info_type: The type of information to request. Possible values: tail, bundle, analyze
340
358
  :param do_zip: Whether the information retrieved should be zipped; works only with info_type 'bundle'
341
359
  :param instance_id: The specific EC2 instance associated with `env_name` whose log information to retrieve
342
360
  :return: None
343
361
  """
344
- instance_id_list = get_instance_log_url_mappings(env_name, info_type)
362
+ if info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
363
+ instance_id_list = _get_latest_instance_log_url_mappings(env_name, info_type)
364
+ else:
365
+ instance_id_list = get_instance_log_url_mappings(env_name, info_type)
345
366
 
346
367
  if instance_id:
347
368
  instance_id_list = _updated_instance_id_list(instance_id_list, instance_id)
348
369
 
349
370
  if info_type == logs_operations_constants.INFORMATION_FORMAT.BUNDLE:
350
371
  _handle_bundle_logs(instance_id_list, do_zip)
372
+ elif info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
373
+ _handle_analyze_logs(instance_id_list)
351
374
  else:
352
375
  _handle_tail_logs(instance_id_list)
353
376
 
@@ -473,7 +496,7 @@ def retrieve_beanstalk_logs(env_name, info_type, do_zip=False, instance_id=None)
473
496
  """
474
497
  Obtains the set of logs from ElasticBeanstalk for the environment `env_name`.
475
498
  :param env_name: An Elastic Beanstalk environment name
476
- :param info_type: The type of information to request. Possible values: tail, bundle
499
+ :param info_type: The type of information to request. Possible values: tail, bundle, analyze
477
500
  :param do_zip: Whether the information retrieved should be zipped; works only with info_type 'bundle'
478
501
  :param instance_id: The specific EC2 instance associated with `env_name` whose log information to retrieve
479
502
  :return: None
@@ -481,7 +504,11 @@ def retrieve_beanstalk_logs(env_name, info_type, do_zip=False, instance_id=None)
481
504
  result = elasticbeanstalk.request_environment_info(env_name, info_type)
482
505
 
483
506
  request_id = result['ResponseMetadata']['RequestId']
484
- io.echo(prompts['logs.retrieving'])
507
+
508
+ if info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
509
+ io.echo(prompts['logs.analyzing'])
510
+ else:
511
+ io.echo(prompts['logs.retrieving'])
485
512
 
486
513
  commonops.wait_for_success_events(
487
514
  request_id,
@@ -898,6 +925,12 @@ def _handle_tail_logs(instance_id_list):
898
925
  io.echo_with_pager(os.linesep.join(data))
899
926
 
900
927
 
928
+ def _handle_analyze_logs(instance_id_list):
929
+ for instance_id, url in iteritems(instance_id_list):
930
+ log_result = utils.get_data_from_url(url)
931
+ io.echo(utils.decode_bytes(log_result))
932
+
933
+
901
934
  def _instance_log_streaming_option_setting(disable=False):
902
935
  return elasticbeanstalk.create_option_setting(
903
936
  namespaces.CLOUDWATCH_LOGS,
@@ -22,6 +22,7 @@ class logs_operations_constants(object):
22
22
  class INFORMATION_FORMAT(object):
23
23
  BUNDLE = 'bundle'
24
24
  TAIL = 'tail'
25
+ ANALYZE = 'analyze'
25
26
 
26
27
 
27
28
  class iam_documents(object):
@@ -384,6 +384,14 @@ To get started enter "eb platform init". Then enter "eb platform create".""",
384
384
  'logs.cloudwatch_logs_argument_and_zip_argument':
385
385
  'You can\'t use the "--zip" option when setting log streaming. This is an '
386
386
  'output option for log retrieval commands.',
387
+ 'logs.analyze_argument_and_instance_argument':
388
+ 'You can\'t use the "--instance" option with the "--analyze" option.',
389
+ 'logs.analyze_argument_and_all_argument':
390
+ 'You can\'t use the "--all" option with the "--analyze" option.',
391
+ 'logs.analyze_argument_and_zip_argument':
392
+ 'You can\'t use the "--zip" option with the "--analyze" option.',
393
+ 'logs.analyze_argument_and_log_group_argument':
394
+ 'You can\'t use the "--log-group" option with the "--analyze" option.',
387
395
  'logs.health_and_instance_argument':
388
396
  'You can\'t use the "--instance" option when retrieving environment-health '
389
397
  'logs. The scope for these logs is the entire environment.',
@@ -619,6 +627,7 @@ prompts = {
619
627
  'vpc.elbpublic': 'Do you want the load balancer to be public? (Select no for internal)',
620
628
  'vpc.dbsubnets': 'Enter a comma-separated list of database subnets',
621
629
  'logs.retrieving': 'Retrieving logs...',
630
+ 'logs.analyzing': 'Analyzing environment...',
622
631
  'swap.envprompt': 'Select the environment with which you want to swap CNAMEs.',
623
632
  'abort.envprompt': 'Select the environment you want to stop updating.',
624
633
  'clone.latest': 'There is a newer version of the platform used by the environment '
@@ -853,6 +862,7 @@ flag_text = {
853
862
 
854
863
  'logs.all': 'retrieve all logs',
855
864
  'logs.zip': 'retrieve all logs as .zip',
865
+ 'logs.analyze': 'AI-powered analysis of logs, events, and environment health',
856
866
  'logs.instance': 'retrieve logs only for this instance',
857
867
  'logs.log-group': 'retrieve logs only for this log group',
858
868
  'logs.stream': 'enable/disable log streaming to CloudWatch Logs',
@@ -1052,6 +1062,7 @@ responses = {
1052
1062
  'logs.pulled': 'Pulled logs for environment instances.',
1053
1063
  'logs.successtail': 'Successfully finished tailing',
1054
1064
  'logs.successbundle': 'Successfully finished bundling',
1065
+ 'logs.successanalyze': 'AI analysis request has completed.',
1055
1066
  'logs.fail': 'Failed to pull logs for environment instances.',
1056
1067
  'env.terminated': 'terminateEnvironment completed successfully.',
1057
1068
  'env.invalidstate': 'Environment named {env-name} is in an invalid state for this operation. '
@@ -0,0 +1,145 @@
1
+ # Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+
15
+ try:
16
+ from pip._internal.operations.check import (
17
+ check_package_set,
18
+ create_package_set_from_installed,
19
+ )
20
+ except ImportError:
21
+ raise RuntimeError('You need pip==21.1 to check for dependency incompatibilities.')
22
+
23
+ from ebcli.core import io
24
+
25
+ _indent = ' '
26
+
27
+
28
+ def color_red(message):
29
+ io.echo(io.bold(io.color('red', message)))
30
+
31
+
32
+ def color_green(message):
33
+ io.echo(io.bold(io.color('green', message)))
34
+
35
+
36
+ def collect_package_requirements_by_requirement_name(req_name, package_set):
37
+ required_by = dict()
38
+ for pkg_name, package in package_set.items():
39
+ for req in package.dependencies:
40
+ if req.name.lower() == req_name.lower():
41
+ required_by[pkg_name] = req.specifier
42
+
43
+ return required_by
44
+
45
+
46
+ def collect_package_set():
47
+ package_set = create_package_set_from_installed()[0]
48
+
49
+ return package_set
50
+
51
+
52
+ def check_for_missing_requirements_and_dependency_incompatibilities():
53
+ try:
54
+ package_set = collect_package_set()
55
+ missing, conflicting = check_package_set(package_set)
56
+
57
+ io.echo('- Checking for missing requirements ... ')
58
+ if missing:
59
+ color_red('{}Found unmet dependencies'.format(_indent * 1))
60
+ missing_description = describe_missing_results(missing, package_set)
61
+ color_red(missing_description)
62
+ else:
63
+ color_green('{}OK!'.format(_indent * 2))
64
+
65
+ io.echo('- Checking for dependency incompatibilities ... ')
66
+ if conflicting:
67
+ color_red('{}Found dependency incompatibilities'.format(_indent * 1))
68
+ conflicting_description = describe_conflicting_results(conflicting, package_set)
69
+ color_red(conflicting_description)
70
+ else:
71
+ color_green('{}OK!'.format(_indent * 1))
72
+
73
+ if missing or conflicting:
74
+ exit(1)
75
+ except Exception as e:
76
+ raise RuntimeError(
77
+ ' Something went wrong while attempting to find missing and/or incompatible dependencies. '
78
+ 'The following exception was raised: \n {}'.format(str(e))
79
+ )
80
+
81
+
82
+ def describe_conflicting_results(conflicting, package_set):
83
+ conflicting_reqs = dict()
84
+ description = '{}Confliciting dependencies:\n'.format(_indent * 2)
85
+
86
+ for pkg_name in conflicting:
87
+ for result in conflicting[pkg_name]:
88
+
89
+ req_name = result[0]
90
+ req_version = result[1]
91
+ req = result[2]
92
+
93
+ if not req_name in conflicting_reqs:
94
+ conflicting_reqs[req_name] = {
95
+ 'required_by': collect_package_requirements_by_requirement_name(req_name, package_set),
96
+ 'package_details': package_set[req_name]
97
+ }
98
+
99
+ for req_name, req in conflicting_reqs.items():
100
+ req_version = req['package_details'].version
101
+ description += '{}{}:\n'.format(_indent * 3, req_name)
102
+ description += '{}Installed version: {}\n'.format(_indent * 4, req_version)
103
+ description += '{}Required by:\n'.format(_indent * 4)
104
+ for pkg_name, specifier in req['required_by'].items():
105
+ is_conflict = not specifier.contains(req_version, prereleases=True)
106
+ description += '{}{} {} ({}: {}) {}\n'.format(
107
+ _indent * 5,
108
+ pkg_name,
109
+ package_set[pkg_name].version,
110
+ req_name,
111
+ specifier,
112
+ '[CONFLICT]' if is_conflict else ''
113
+ )
114
+
115
+ return description
116
+
117
+
118
+ def describe_missing_results(missing, package_set):
119
+ missing_reqs = dict()
120
+ description = '{}Missing dependencies:\n'.format(_indent * 2)
121
+
122
+ for pkg_name in missing:
123
+ for result in missing[pkg_name]:
124
+
125
+ req_name = result[0]
126
+
127
+ if not req_name in missing_reqs:
128
+ missing_reqs[req_name] = collect_package_requirements_by_requirement_name(req_name, package_set)
129
+
130
+ for req_name, required_by in missing_reqs.items():
131
+ description += '{}{}:\n'.format(_indent * 3, req_name)
132
+ description += '{}Required by:\n'.format(_indent * 4)
133
+ for pkg_name, specifier in required_by.items():
134
+ description += '{}{} {} ({}: {})\n'.format(
135
+ _indent * 5,
136
+ pkg_name,
137
+ package_set[pkg_name].version,
138
+ req_name,
139
+ specifier,
140
+ )
141
+
142
+ return description
143
+
144
+ io.echo('Checking for dependency mismatches ...')
145
+ check_for_missing_requirements_and_dependency_incompatibilities()