ic-code 1.2.7__tar.gz → 1.2.8__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 (254) hide show
  1. {ic_code-1.2.7/src/ic_code.egg-info → ic_code-1.2.8}/PKG-INFO +44 -11
  2. {ic_code-1.2.7 → ic_code-1.2.8}/README.md +42 -10
  3. {ic_code-1.2.7 → ic_code-1.2.8}/pyproject.toml +11 -2
  4. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/utils.py +1 -1
  5. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/__init__.py +1 -1
  6. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/cli.py +6 -5
  7. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/info.py +118 -57
  8. ic_code-1.2.8/src/ic/platforms/tencent/__init__.py +1 -0
  9. ic_code-1.2.8/src/ic/platforms/tencent/clb/__init__.py +0 -0
  10. ic_code-1.2.8/src/ic/platforms/tencent/clb/info.py +376 -0
  11. ic_code-1.2.8/src/ic/platforms/tencent/client.py +422 -0
  12. ic_code-1.2.8/src/ic/platforms/tencent/cvm/__init__.py +0 -0
  13. ic_code-1.2.8/src/ic/platforms/tencent/cvm/info.py +318 -0
  14. ic_code-1.2.8/src/ic/platforms/tencent/lighthouse/__init__.py +0 -0
  15. ic_code-1.2.8/src/ic/platforms/tencent/lighthouse/info.py +288 -0
  16. ic_code-1.2.8/src/ic/platforms/tencent/nat/__init__.py +0 -0
  17. ic_code-1.2.8/src/ic/platforms/tencent/nat/info.py +223 -0
  18. ic_code-1.2.8/src/ic/platforms/tencent/profile/__init__.py +0 -0
  19. ic_code-1.2.8/src/ic/platforms/tencent/profile/info.py +213 -0
  20. ic_code-1.2.8/src/ic/platforms/tencent/sg/__init__.py +0 -0
  21. ic_code-1.2.8/src/ic/platforms/tencent/sg/info.py +308 -0
  22. ic_code-1.2.8/src/ic/platforms/tencent/tke/__init__.py +0 -0
  23. ic_code-1.2.8/src/ic/platforms/tencent/tke/info.py +236 -0
  24. ic_code-1.2.8/src/ic/platforms/tencent/vpc/__init__.py +0 -0
  25. ic_code-1.2.8/src/ic/platforms/tencent/vpc/info.py +214 -0
  26. {ic_code-1.2.7 → ic_code-1.2.8/src/ic_code.egg-info}/PKG-INFO +44 -11
  27. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/SOURCES.txt +18 -0
  28. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/requires.txt +1 -0
  29. {ic_code-1.2.7 → ic_code-1.2.8}/LICENSE +0 -0
  30. {ic_code-1.2.7 → ic_code-1.2.8}/MANIFEST.in +0 -0
  31. {ic_code-1.2.7 → ic_code-1.2.8}/SECURITY.md +0 -0
  32. {ic_code-1.2.7 → ic_code-1.2.8}/config/default.yaml +0 -0
  33. {ic_code-1.2.7 → ic_code-1.2.8}/docs/README.md +0 -0
  34. {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/configuration.md +0 -0
  35. {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/installation.md +0 -0
  36. {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/troubleshooting.md +0 -0
  37. {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/usage.md +0 -0
  38. {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/README.md +0 -0
  39. {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/aws_cli_prd.md +0 -0
  40. {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/installation.md +0 -0
  41. {ic_code-1.2.7 → ic_code-1.2.8}/docs/ci-workflow-guide.md +0 -0
  42. {ic_code-1.2.7 → ic_code-1.2.8}/docs/cloudflare_configuration_example.md +0 -0
  43. {ic_code-1.2.7 → ic_code-1.2.8}/docs/config_migration.md +0 -0
  44. {ic_code-1.2.7 → ic_code-1.2.8}/docs/deployment.md +0 -0
  45. {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/README.md +0 -0
  46. {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/cleanup_summary.md +0 -0
  47. {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/development_guide.md +0 -0
  48. {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/import_patterns.md +0 -0
  49. {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/migration_guide.md +0 -0
  50. {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
  51. {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
  52. {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/README.md +0 -0
  53. {ic_code-1.2.7 → ic_code-1.2.8}/docs/general/configuration.md +0 -0
  54. {ic_code-1.2.7 → ic_code-1.2.8}/docs/installation.md +0 -0
  55. {ic_code-1.2.7 → ic_code-1.2.8}/docs/migration.md +0 -0
  56. {ic_code-1.2.7 → ic_code-1.2.8}/docs/migration_guide.md +0 -0
  57. {ic_code-1.2.7 → ic_code-1.2.8}/docs/oci/README.md +0 -0
  58. {ic_code-1.2.7 → ic_code-1.2.8}/docs/oci/installation.md +0 -0
  59. {ic_code-1.2.7 → ic_code-1.2.8}/docs/release-guide.md +0 -0
  60. {ic_code-1.2.7 → ic_code-1.2.8}/docs/security.md +0 -0
  61. {ic_code-1.2.7 → ic_code-1.2.8}/docs/ssh/configuration.md +0 -0
  62. {ic_code-1.2.7 → ic_code-1.2.8}/docs/troubleshooting.md +0 -0
  63. {ic_code-1.2.7 → ic_code-1.2.8}/docs/user_guide.md +0 -0
  64. {ic_code-1.2.7 → ic_code-1.2.8}/requirements.txt +0 -0
  65. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/analysis_summary.py +0 -0
  66. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/bump-version.sh +0 -0
  67. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
  68. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/ci-detect-platforms.py +0 -0
  69. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/ci-generate-matrix.py +0 -0
  70. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/cli_usage_analysis.py +0 -0
  71. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/dependency_mapper.py +0 -0
  72. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/deploy.sh +0 -0
  73. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/final_validation_and_documentation.py +0 -0
  74. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/fix_consolidated_imports.py +0 -0
  75. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/migration_execution_and_validation.py +0 -0
  76. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/oracle-policy/user_policy.py +0 -0
  77. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/performance_optimization.py +0 -0
  78. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/setup_venv.py +0 -0
  79. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/test-ci-detection.sh +0 -0
  80. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/unset_env.sh +0 -0
  81. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/validate_config.py +0 -0
  82. {ic_code-1.2.7 → ic_code-1.2.8}/scripts/validate_dependencies.py +0 -0
  83. {ic_code-1.2.7 → ic_code-1.2.8}/setup.cfg +0 -0
  84. {ic_code-1.2.7 → ic_code-1.2.8}/setup.py +0 -0
  85. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/__init__.py +0 -0
  86. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gather_env.py +0 -0
  87. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_config_validator.py +0 -0
  88. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_monitoring.py +0 -0
  89. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_utils.py +0 -0
  90. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/log.py +0 -0
  91. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/progress_decorator.py +0 -0
  92. {ic_code-1.2.7 → ic_code-1.2.8}/src/common/slack.py +0 -0
  93. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/__init__.py +0 -0
  94. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/config.py +0 -0
  95. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/security.py +0 -0
  96. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/__init__.py +0 -0
  97. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/cli.py +0 -0
  98. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/common.py +0 -0
  99. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/__init__.py +0 -0
  100. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/cleanup.py +0 -0
  101. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/docs_organizer.py +0 -0
  102. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/external.py +0 -0
  103. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/installer.py +0 -0
  104. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/manager.py +0 -0
  105. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/migration.py +0 -0
  106. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/migration_utils.py +0 -0
  107. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/path_manager.py +0 -0
  108. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/schema.py +0 -0
  109. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/secrets.py +0 -0
  110. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/security.py +0 -0
  111. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/__init__.py +0 -0
  112. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/dependency_validator.py +0 -0
  113. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/logging.py +0 -0
  114. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/platform_discovery.py +0 -0
  115. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/session.py +0 -0
  116. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/silence_logging.py +0 -0
  117. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/__init__.py +0 -0
  118. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/__init__.py +0 -0
  119. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
  120. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/cloudfront/info.py +0 -0
  121. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
  122. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/build.py +0 -0
  123. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
  124. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/__init__.py +0 -0
  125. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/info.py +0 -0
  126. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/list_tags.py +0 -0
  127. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
  128. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/__init__.py +0 -0
  129. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/info.py +0 -0
  130. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/service.py +0 -0
  131. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/task.py +0 -0
  132. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/__init__.py +0 -0
  133. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/addons.py +0 -0
  134. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/fargate.py +0 -0
  135. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/info.py +0 -0
  136. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/nodes.py +0 -0
  137. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/pods.py +0 -0
  138. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/update_config.py +0 -0
  139. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/fargate/__init__.py +0 -0
  140. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/fargate/info.py +0 -0
  141. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/__init__.py +0 -0
  142. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/list_tags.py +0 -0
  143. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/tag_check.py +0 -0
  144. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/__init__.py +0 -0
  145. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/broker.py +0 -0
  146. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/info.py +0 -0
  147. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/__init__.py +0 -0
  148. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/list_tags.py +0 -0
  149. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/tag_check.py +0 -0
  150. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/profile/__init__.py +0 -0
  151. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/profile/info.py +0 -0
  152. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/__init__.py +0 -0
  153. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/info.py +0 -0
  154. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/list_tags.py +0 -0
  155. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/tag_check.py +0 -0
  156. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/__init__.py +0 -0
  157. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/info.py +0 -0
  158. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/list_tags.py +0 -0
  159. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/tag_check.py +0 -0
  160. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/sg/__init__.py +0 -0
  161. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/sg/info.py +0 -0
  162. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/__init__.py +0 -0
  163. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/info.py +0 -0
  164. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/list_tags.py +0 -0
  165. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
  166. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpn/__init__.py +0 -0
  167. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpn/info.py +0 -0
  168. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/README.md +0 -0
  169. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/__init__.py +0 -0
  170. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/account/__init__.py +0 -0
  171. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/account/info.py +0 -0
  172. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/client.py +0 -0
  173. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
  174. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/info.py +0 -0
  175. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
  176. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/rules/__init__.py +0 -0
  177. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/rules/info.py +0 -0
  178. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/traffic/__init__.py +0 -0
  179. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/traffic/info.py +0 -0
  180. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/waf/__init__.py +0 -0
  181. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/waf/info.py +0 -0
  182. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/zone/__init__.py +0 -0
  183. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/zone/info.py +0 -0
  184. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/README.md +0 -0
  185. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/__init__.py +0 -0
  186. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/__init__.py +0 -0
  187. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/info.py +0 -0
  188. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/mock_data.json +0 -0
  189. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/__init__.py +0 -0
  190. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/info.py +0 -0
  191. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/mock_data.json +0 -0
  192. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
  193. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/firewall/info.py +0 -0
  194. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/functions/__init__.py +0 -0
  195. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/functions/info.py +0 -0
  196. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/__init__.py +0 -0
  197. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/info.py +0 -0
  198. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/mock_data.json +0 -0
  199. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/lb/__init__.py +0 -0
  200. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/lb/info.py +0 -0
  201. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/run/__init__.py +0 -0
  202. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/run/info.py +0 -0
  203. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/sql/__init__.py +0 -0
  204. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/sql/info.py +0 -0
  205. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/storage/__init__.py +0 -0
  206. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/storage/info.py +0 -0
  207. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
  208. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/info.py +0 -0
  209. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/mock_data.json +0 -0
  210. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/README.md +0 -0
  211. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/__init__.py +0 -0
  212. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/common/__init__.py +0 -0
  213. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/common/utils.py +0 -0
  214. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/compartment/__init__.py +0 -0
  215. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/compartment/info.py +0 -0
  216. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/__init__.py +0 -0
  217. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/credit.py +0 -0
  218. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/usage.py +0 -0
  219. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/info/__init__.py +0 -0
  220. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/info/oci_info.py +0 -0
  221. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/lb/__init__.py +0 -0
  222. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/lb/info.py +0 -0
  223. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/nsg/__init__.py +0 -0
  224. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/nsg/info.py +0 -0
  225. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/obj/__init__.py +0 -0
  226. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/obj/info.py +0 -0
  227. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/__init__.py +0 -0
  228. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/info.py +0 -0
  229. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/search.py +0 -0
  230. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vcn/__init__.py +0 -0
  231. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vcn/info.py +0 -0
  232. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vm/__init__.py +0 -0
  233. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vm/info.py +0 -0
  234. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/volume/__init__.py +0 -0
  235. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/volume/info.py +0 -0
  236. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/README.md +0 -0
  237. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/__init__.py +0 -0
  238. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto/__init__.py +0 -0
  239. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto/scan.py +0 -0
  240. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto_ssh.py +0 -0
  241. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server/__init__.py +0 -0
  242. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server/info.py +0 -0
  243. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server_info.py +0 -0
  244. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/README.md +0 -0
  245. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/__init__.py +0 -0
  246. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/config.py +0 -0
  247. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/detector.py +0 -0
  248. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/guidance.py +0 -0
  249. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/hooks.py +0 -0
  250. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/patterns.py +0 -0
  251. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/scanner.py +0 -0
  252. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/dependency_links.txt +0 -0
  253. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/entry_points.txt +0 -0
  254. {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ic-code
3
- Version: 1.2.7
3
+ Version: 1.2.8
4
4
  Summary: Infrastructure CLI tool for managing AWS, GCP, OCI, CloudFlare, SSH, and more
5
5
  Home-page: https://github.com/dgr009/ic
6
6
  Author: SangYun Kim
@@ -62,6 +62,7 @@ Requires-Dist: cerberus<2.0.0,>=1.3.5
62
62
  Requires-Dist: pydantic<3.0.0,>=2.7.0
63
63
  Requires-Dist: packaging<25.0,>=24.0
64
64
  Requires-Dist: setuptools<76.0.0,>=69.0.0
65
+ Requires-Dist: tencentcloud-sdk-python<4.0.0,>=3.0.0
65
66
  Provides-Extra: dev
66
67
  Requires-Dist: pytest<9.0.0,>=8.0.0; extra == "dev"
67
68
  Requires-Dist: pytest-cov<7.0.0,>=5.0.0; extra == "dev"
@@ -80,16 +81,16 @@ Dynamic: requires-python
80
81
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
81
82
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
82
83
 
83
- A comprehensive, production-grade Infrastructure Command Line Interface tool for managing multi-cloud infrastructure and server components across multiple platforms. IC CLI provides unified access to **AWS**, **GCP**, **Oracle Cloud Infrastructure (OCI)**, **CloudFlare**, and **SSH** server management with rich progress indicators and secure configuration management.
84
+ A comprehensive, production-grade Infrastructure Command Line Interface tool for managing multi-cloud infrastructure and server components across multiple platforms. IC CLI provides unified access to **AWS**, **Tencent Cloud**, **GCP**, **Oracle Cloud Infrastructure (OCI)**, **CloudFlare**, and **SSH** server management with rich progress indicators and secure configuration management.
84
85
 
85
86
  ---
86
87
 
87
88
  ## ✨ Key Features
88
89
 
89
- - **🚀 Multi-Cloud Support**: AWS, GCP, OCI, CloudFlare, and SSH server management
90
+ - **🚀 Multi-Cloud Support**: AWS, Tencent Cloud, GCP, OCI, CloudFlare, and SSH server management
90
91
  - **📊 Rich Progress Bars**: Real-time progress indicators for all long-running operations across accounts and regions
91
- - **🔒 Secure Configuration**: Modern YAML-based configuration (`~/.ic/config/`) with separate secrets management
92
- - **🌍 Multi-Account / Multi-Region**: Concurrent querying across multiple cloud accounts and regions
92
+ - **🔒 Secure Configuration**: Modern YAML-based configuration (`~/.ic/config/`) and native credential files (`~/.aws/config`, `~/.tencent/credentials`)
93
+ - **🌍 Multi-Account / Multi-Region**: Concurrent querying across multiple cloud accounts and regions with STS / CAM AssumeRole support
93
94
  - **🎨 Beautiful Terminal UI**: Rich terminal output with tables, colors, JSON formatting, and tree diagrams
94
95
  - **⚡ High Performance**: Optimized async and concurrent execution for fast resource discovery
95
96
  - **🛡️ Security First**: Built-in credential masking, secret scanning, and pre-commit hook support
@@ -101,26 +102,32 @@ A comprehensive, production-grade Infrastructure Command Line Interface tool for
101
102
  ### 1. 🟧 AWS Services (Production Ready)
102
103
  - **Compute**: EC2 instances, ECS services/tasks, EKS clusters/nodes/pods, Fargate profiles
103
104
  - **Storage & DB**: S3 buckets (with tagging compliance checks), RDS instances & clusters
104
- - **Networking**: VPC, Subnets, Gateways, Load Balancers (ALB/NLB), Security Groups (with Ingress & Egress rule analysis & tree view), VPN connections
105
+ - **Networking**: VPC, Subnets, Gateways, Load Balancers (ALB/NLB with listener rules, health check path & target health analysis), Security Groups (with Ingress & Egress rule analysis & tree view), VPN connections
105
106
  - **Integrations**: CloudFront distributions, MSK Kafka brokers, CodePipeline build/deploy status, Profile management
106
107
 
107
- ### 2. 🟩 GCP Services (Production Ready)
108
+ ### 2. 🟦 Tencent Cloud Services (Production Ready)
109
+ - **Compute**: CVM instances (with CPU, Mem, Disk, IP, SGs), Lighthouse lightweight application servers
110
+ - **Containers**: TKE (Tencent Kubernetes Engine) clusters & node details
111
+ - **Networking**: VPC, Subnets, NAT Gateways, CLB (Load Balancers - with listener rules, health check path & target health analysis), Security Groups (with Ingress/Egress rules & tree view)
112
+ - **Authentication**: Multi-account STS AssumeRole support, Profile management (`ic tencent profile info` via `~/.tencent/credentials`)
113
+
114
+ ### 3. 🟩 GCP Services (Production Ready)
108
115
  - **Compute Engine**: VM instances with status, zone, and network interface details
109
116
  - **Cloud Storage**: Bucket lists, location, and storage class information
110
117
  - **VPC Network**: Subnets, routes, and firewall rule visibility
111
118
  - **GKE**: Kubernetes Engine clusters and node pool configurations
112
119
  - **Cloud SQL**: Database instances, engines, and status
113
120
 
114
- ### 3. 🟥 Oracle Cloud Infrastructure (OCI) (Production Ready)
121
+ ### 4. 🟥 Oracle Cloud Infrastructure (OCI) (Production Ready)
115
122
  - **Compute & Containers**: VM instances, Container instances (ACI)
116
123
  - **Networking**: VCN, Subnets, Load Balancers, Network Security Groups (NSG)
117
124
  - **Storage**: Block Volumes, Object Storage buckets
118
125
  - **IAM & Cost**: Compartment hierarchy, IAM Policy search/validation, Cost usage & billing credits
119
126
 
120
- ### 4. 🟧 CloudFlare (Production Ready)
127
+ ### 5. 🟧 CloudFlare (Production Ready)
121
128
  - **DNS & Zones**: Zone listings, DNS record management, and account filtering
122
129
 
123
- ### 5. 🟦 SSH Server Management (Production Ready)
130
+ ### 6. 🟦 SSH Server Management (Production Ready)
124
131
  - **Discovery**: Automatic server registration, connection verification, and security filtering
125
132
 
126
133
  ---
@@ -130,7 +137,7 @@ A comprehensive, production-grade Infrastructure Command Line Interface tool for
130
137
  ### From PyPI (Recommended)
131
138
 
132
139
  ```bash
133
- # Install the latest stable version (v1.2.6+)
140
+ # Install the latest stable version (v1.2.8+)
134
141
  pip install ic-code
135
142
 
136
143
  # Verify installation
@@ -258,6 +265,32 @@ ic aws eks info
258
265
  ic aws ecs info
259
266
  ```
260
267
 
268
+ ### Tencent Cloud Commands
269
+
270
+ ```bash
271
+ # List CVM instances across accounts and regions
272
+ ic tencent cvm info
273
+ ic tencent cvm info -a my-account
274
+
275
+ # List Lighthouse lightweight instances
276
+ ic tencent lighthouse info
277
+
278
+ # Security Group Info (Tables and Tree view)
279
+ ic tencent sg info
280
+ ic tencent sg info -o tree
281
+
282
+ # Load Balancer (CLB) with listeners, health check path & target health
283
+ ic tencent clb info
284
+
285
+ # VPC, Subnets, NAT Gateways & TKE Clusters
286
+ ic tencent vpc info
287
+ ic tencent nat info
288
+ ic tencent tke info
289
+
290
+ # Check credentials and profiles (~/.tencent/credentials)
291
+ ic tencent profile info
292
+ ```
293
+
261
294
  ### GCP Commands
262
295
 
263
296
  ```bash
@@ -4,16 +4,16 @@
4
4
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
 
7
- A comprehensive, production-grade Infrastructure Command Line Interface tool for managing multi-cloud infrastructure and server components across multiple platforms. IC CLI provides unified access to **AWS**, **GCP**, **Oracle Cloud Infrastructure (OCI)**, **CloudFlare**, and **SSH** server management with rich progress indicators and secure configuration management.
7
+ A comprehensive, production-grade Infrastructure Command Line Interface tool for managing multi-cloud infrastructure and server components across multiple platforms. IC CLI provides unified access to **AWS**, **Tencent Cloud**, **GCP**, **Oracle Cloud Infrastructure (OCI)**, **CloudFlare**, and **SSH** server management with rich progress indicators and secure configuration management.
8
8
 
9
9
  ---
10
10
 
11
11
  ## ✨ Key Features
12
12
 
13
- - **🚀 Multi-Cloud Support**: AWS, GCP, OCI, CloudFlare, and SSH server management
13
+ - **🚀 Multi-Cloud Support**: AWS, Tencent Cloud, GCP, OCI, CloudFlare, and SSH server management
14
14
  - **📊 Rich Progress Bars**: Real-time progress indicators for all long-running operations across accounts and regions
15
- - **🔒 Secure Configuration**: Modern YAML-based configuration (`~/.ic/config/`) with separate secrets management
16
- - **🌍 Multi-Account / Multi-Region**: Concurrent querying across multiple cloud accounts and regions
15
+ - **🔒 Secure Configuration**: Modern YAML-based configuration (`~/.ic/config/`) and native credential files (`~/.aws/config`, `~/.tencent/credentials`)
16
+ - **🌍 Multi-Account / Multi-Region**: Concurrent querying across multiple cloud accounts and regions with STS / CAM AssumeRole support
17
17
  - **🎨 Beautiful Terminal UI**: Rich terminal output with tables, colors, JSON formatting, and tree diagrams
18
18
  - **⚡ High Performance**: Optimized async and concurrent execution for fast resource discovery
19
19
  - **🛡️ Security First**: Built-in credential masking, secret scanning, and pre-commit hook support
@@ -25,26 +25,32 @@ A comprehensive, production-grade Infrastructure Command Line Interface tool for
25
25
  ### 1. 🟧 AWS Services (Production Ready)
26
26
  - **Compute**: EC2 instances, ECS services/tasks, EKS clusters/nodes/pods, Fargate profiles
27
27
  - **Storage & DB**: S3 buckets (with tagging compliance checks), RDS instances & clusters
28
- - **Networking**: VPC, Subnets, Gateways, Load Balancers (ALB/NLB), Security Groups (with Ingress & Egress rule analysis & tree view), VPN connections
28
+ - **Networking**: VPC, Subnets, Gateways, Load Balancers (ALB/NLB with listener rules, health check path & target health analysis), Security Groups (with Ingress & Egress rule analysis & tree view), VPN connections
29
29
  - **Integrations**: CloudFront distributions, MSK Kafka brokers, CodePipeline build/deploy status, Profile management
30
30
 
31
- ### 2. 🟩 GCP Services (Production Ready)
31
+ ### 2. 🟦 Tencent Cloud Services (Production Ready)
32
+ - **Compute**: CVM instances (with CPU, Mem, Disk, IP, SGs), Lighthouse lightweight application servers
33
+ - **Containers**: TKE (Tencent Kubernetes Engine) clusters & node details
34
+ - **Networking**: VPC, Subnets, NAT Gateways, CLB (Load Balancers - with listener rules, health check path & target health analysis), Security Groups (with Ingress/Egress rules & tree view)
35
+ - **Authentication**: Multi-account STS AssumeRole support, Profile management (`ic tencent profile info` via `~/.tencent/credentials`)
36
+
37
+ ### 3. 🟩 GCP Services (Production Ready)
32
38
  - **Compute Engine**: VM instances with status, zone, and network interface details
33
39
  - **Cloud Storage**: Bucket lists, location, and storage class information
34
40
  - **VPC Network**: Subnets, routes, and firewall rule visibility
35
41
  - **GKE**: Kubernetes Engine clusters and node pool configurations
36
42
  - **Cloud SQL**: Database instances, engines, and status
37
43
 
38
- ### 3. 🟥 Oracle Cloud Infrastructure (OCI) (Production Ready)
44
+ ### 4. 🟥 Oracle Cloud Infrastructure (OCI) (Production Ready)
39
45
  - **Compute & Containers**: VM instances, Container instances (ACI)
40
46
  - **Networking**: VCN, Subnets, Load Balancers, Network Security Groups (NSG)
41
47
  - **Storage**: Block Volumes, Object Storage buckets
42
48
  - **IAM & Cost**: Compartment hierarchy, IAM Policy search/validation, Cost usage & billing credits
43
49
 
44
- ### 4. 🟧 CloudFlare (Production Ready)
50
+ ### 5. 🟧 CloudFlare (Production Ready)
45
51
  - **DNS & Zones**: Zone listings, DNS record management, and account filtering
46
52
 
47
- ### 5. 🟦 SSH Server Management (Production Ready)
53
+ ### 6. 🟦 SSH Server Management (Production Ready)
48
54
  - **Discovery**: Automatic server registration, connection verification, and security filtering
49
55
 
50
56
  ---
@@ -54,7 +60,7 @@ A comprehensive, production-grade Infrastructure Command Line Interface tool for
54
60
  ### From PyPI (Recommended)
55
61
 
56
62
  ```bash
57
- # Install the latest stable version (v1.2.6+)
63
+ # Install the latest stable version (v1.2.8+)
58
64
  pip install ic-code
59
65
 
60
66
  # Verify installation
@@ -182,6 +188,32 @@ ic aws eks info
182
188
  ic aws ecs info
183
189
  ```
184
190
 
191
+ ### Tencent Cloud Commands
192
+
193
+ ```bash
194
+ # List CVM instances across accounts and regions
195
+ ic tencent cvm info
196
+ ic tencent cvm info -a my-account
197
+
198
+ # List Lighthouse lightweight instances
199
+ ic tencent lighthouse info
200
+
201
+ # Security Group Info (Tables and Tree view)
202
+ ic tencent sg info
203
+ ic tencent sg info -o tree
204
+
205
+ # Load Balancer (CLB) with listeners, health check path & target health
206
+ ic tencent clb info
207
+
208
+ # VPC, Subnets, NAT Gateways & TKE Clusters
209
+ ic tencent vpc info
210
+ ic tencent nat info
211
+ ic tencent tke info
212
+
213
+ # Check credentials and profiles (~/.tencent/credentials)
214
+ ic tencent profile info
215
+ ```
216
+
185
217
  ### GCP Commands
186
218
 
187
219
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ic-code"
7
- version = "1.2.7"
7
+ version = "1.2.8"
8
8
  authors = [
9
9
  {name = "sykim", email = "cruiser594@gmail.com"},
10
10
  ]
@@ -79,6 +79,9 @@ dependencies = [
79
79
  # Package management and compatibility
80
80
  "packaging>=24.0,<25.0", # Version parsing and comparison
81
81
  "setuptools>=69.0.0,<76.0.0", # Package building tools
82
+
83
+ # Tencent Cloud SDK
84
+ "tencentcloud-sdk-python>=3.0.0,<4.0.0", # Tencent Cloud SDK (CVM, CLB, VPC, TKE, Lighthouse, STS)
82
85
  ]
83
86
 
84
87
  [project.optional-dependencies]
@@ -147,4 +150,10 @@ markers = [
147
150
  "ci_safe: Tests safe to run in CI environment",
148
151
  "requires_config: Tests that require configuration files",
149
152
  "requires_credentials: Tests that require live credentials"
150
- ]
153
+ ]
154
+
155
+ [tool.pyright]
156
+ pythonVersion = "3.13"
157
+ venvPath = "."
158
+ venv = ".venv"
159
+ extraPaths = ["."]
@@ -89,7 +89,7 @@ def resolve_accounts(account_input=None) -> list:
89
89
  resolved.append(name_to_account[item_lower])
90
90
  continue
91
91
 
92
- # 3. 프로필 이름 부분 매칭 (예: iep-rnd -> iep-rnd-aws)
92
+ # 3. 프로필 이름 부분 매칭 (예: dev-rnd -> dev-rnd-aws)
93
93
  matched = False
94
94
  for prof_name, acct_id in name_to_account.items():
95
95
  if item_lower in prof_name:
@@ -4,7 +4,7 @@ IC (Infra Resource Management CLI) - A comprehensive tool for managing cloud inf
4
4
  This package provides CLI tools and libraries for managing AWS, GCP, OCI, CloudFlare, and SSH resources.
5
5
  """
6
6
 
7
- __version__ = "1.2.7"
7
+ __version__ = "1.2.8"
8
8
  __author__ = "SangYun"
9
9
  __email__ = "cruiser594@gmail.com"
10
10
 
@@ -263,7 +263,7 @@ def execute_multi_service_command(platform_name, services, command, args):
263
263
  result = execute_service(service)
264
264
  if result['success']:
265
265
  print(f"\n✓ {platform_name.upper()} {service.upper()} Results:")
266
- if result['output'].strip():
266
+ if str(result.get('output', '')).strip():
267
267
  print(result['output'])
268
268
  else:
269
269
  print(f"\n✗ {platform_name.upper()} {service.upper()} Failed: {result['error']}")
@@ -313,7 +313,7 @@ def execute_single_command(args):
313
313
  # Execute the command
314
314
  try:
315
315
  config_manager = get_config_manager()
316
- config = config_manager.load_all_configs() if config_manager else None
316
+ config = config_manager.load_all_configs() if config_manager is not None else None
317
317
 
318
318
  # Check function signature to determine how to call it
319
319
  import inspect
@@ -349,7 +349,7 @@ def setup_platform_parsers(platform_subparsers):
349
349
  platforms = discovery.discover_platforms()
350
350
 
351
351
  # Development status platforms
352
- dev_platforms = {'gcp'}
352
+ dev_platforms = {'gcp', 'tencent'}
353
353
 
354
354
  for platform_name, platform_info in platforms.items():
355
355
  if not platform_info.available:
@@ -431,6 +431,7 @@ def main():
431
431
  description="Infra CLI: Platform Resource CLI Tool\n\n"
432
432
  "⚠️ Development Status:\n"
433
433
  " • GCP: In development - usable but may contain bugs\n"
434
+ " • Tencent: In development - usable but may contain bugs\n"
434
435
  " • AWS, OCI, Cloudflare, SSH: Production ready",
435
436
  usage="ic <platform|config> <service> <command> [options]",
436
437
  formatter_class=argparse.RawDescriptionHelpFormatter
@@ -443,7 +444,7 @@ def main():
443
444
  platform_subparsers = parser.add_subparsers(
444
445
  dest="platform",
445
446
  required=False,
446
- help="클라우드 플랫폼 (aws, oci, cf, ssh, gcp) 또는 config 관리"
447
+ help="클라우드 플랫폼 (aws, oci, cf, ssh, gcp, tencent) 또는 config 관리"
447
448
  )
448
449
 
449
450
  # Add version command
@@ -453,7 +454,7 @@ def main():
453
454
  # Add config commands
454
455
  from .commands.config import ConfigCommands
455
456
  config_commands = ConfigCommands()
456
- config_commands.add_subparsers(platform_subparsers)
457
+ config_commands.add_subparsers(platform_subparsers) # type: ignore[arg-type]
457
458
 
458
459
  # Add security commands
459
460
  from .commands.security import SecurityCommands
@@ -1,4 +1,16 @@
1
1
  #!/usr/bin/env python3
2
+ """
3
+ AWS Load Balancer (ALB/NLB) 상세 정보 조회
4
+
5
+ Tencent CLB info와 동일한 스타일로 Listener, Target Group, Target Instance, Health Check Path, Health Status 정보 제공.
6
+
7
+ Usage:
8
+ ic aws lb info
9
+ ic aws lb info -a 123456789012
10
+ ic aws lb info -r ap-northeast-2
11
+ ic aws lb info -n "my-alb"
12
+ """
13
+
2
14
  import os
3
15
  import argparse
4
16
  from concurrent.futures import ThreadPoolExecutor, as_completed
@@ -17,17 +29,19 @@ from common.utils import get_env_accounts, get_profiles, DEFINED_REGIONS
17
29
  load_dotenv()
18
30
  console = Console()
19
31
 
32
+
20
33
  def fetch_lb_one_account_region(account_id, profile_name, region_name, name_filter):
21
34
  log_info_non_console(f"LB 정보 수집 시작: Account={account_id}, Region={region_name}")
22
35
  session = boto3.Session(profile_name=profile_name, region_name=region_name)
23
36
  elbv2_client = session.client("elbv2", region_name=region_name)
24
-
37
+ ec2_client = session.client("ec2", region_name=region_name)
38
+
25
39
  rows = []
26
-
40
+
27
41
  try:
28
42
  lbs = elbv2_client.describe_load_balancers().get("LoadBalancers", [])
29
43
  except Exception as e:
30
- log_info_non_console(f"LB 목록 조회 실패: {e}")
44
+ log_info_non_console(f"LB 목록 조회 실패 ({account_id}/{region_name}): {e}")
31
45
  return []
32
46
 
33
47
  for lb in lbs:
@@ -38,90 +52,134 @@ def fetch_lb_one_account_region(account_id, profile_name, region_name, name_filt
38
52
  lb_name = lb['LoadBalancerName']
39
53
  lb_type = lb['Type']
40
54
  lb_scheme = lb['Scheme']
41
- lb_dns = lb['DNSName']
42
-
43
- listeners = elbv2_client.describe_listeners(LoadBalancerArn=lb_arn).get('Listeners', [])
44
-
55
+ lb_dns = lb.get('DNSName', '-')
56
+
57
+ try:
58
+ listeners = elbv2_client.describe_listeners(LoadBalancerArn=lb_arn).get('Listeners', [])
59
+ except Exception as e:
60
+ log_info_non_console(f"Listeners 조회 실패 ({lb_name}): {e}")
61
+ listeners = []
62
+
45
63
  if not listeners:
46
64
  rows.append({
47
65
  "account": account_id, "region": region_name, "lb_name": lb_name, "type": lb_type,
48
66
  "scheme": lb_scheme, "dns": lb_dns, "listener": "(No Listeners)", "target_group": "-",
49
- "targets": "-", "health": "-"
67
+ "hc_path": "-", "targets": "-", "health": "-"
50
68
  })
51
69
  continue
52
70
 
53
71
  for listener in listeners:
54
72
  listener_str = f"{listener['Protocol']}:{listener['Port']}"
55
-
73
+
56
74
  default_actions = listener.get('DefaultActions', [])
57
75
  target_groups = []
58
76
  for action in default_actions:
59
- if action['Type'] == 'forward' and 'TargetGroupArn' in action:
60
- target_groups.append(action['TargetGroupArn'])
77
+ if action['Type'] == 'forward':
78
+ if 'TargetGroupArn' in action:
79
+ target_groups.append(action['TargetGroupArn'])
80
+ if 'ForwardConfig' in action and 'TargetGroups' in action['ForwardConfig']:
81
+ for tg_elem in action['ForwardConfig']['TargetGroups']:
82
+ if 'TargetGroupArn' in tg_elem:
83
+ target_groups.append(tg_elem['TargetGroupArn'])
61
84
 
62
85
  if not target_groups:
63
86
  rows.append({
64
87
  "account": account_id, "region": region_name, "lb_name": lb_name, "type": lb_type,
65
88
  "scheme": lb_scheme, "dns": lb_dns, "listener": listener_str, "target_group": "(No Target Groups)",
66
- "targets": "-", "health": "-"
89
+ "hc_path": "-", "targets": "-", "health": "-"
67
90
  })
68
91
  continue
69
-
92
+
70
93
  tg_arns = list(set(target_groups))
71
- tg_details = elbv2_client.describe_target_groups(TargetGroupArns=tg_arns).get('TargetGroups', [])
72
-
94
+ try:
95
+ tg_details = elbv2_client.describe_target_groups(TargetGroupArns=tg_arns).get('TargetGroups', [])
96
+ except Exception as e:
97
+ log_info_non_console(f"TargetGroups 조회 실패 ({lb_name}): {e}")
98
+ tg_details = []
99
+
100
+ if not tg_details:
101
+ rows.append({
102
+ "account": account_id, "region": region_name, "lb_name": lb_name, "type": lb_type,
103
+ "scheme": lb_scheme, "dns": lb_dns, "listener": listener_str, "target_group": "(Target Group Error)",
104
+ "hc_path": "-", "targets": "-", "health": "-"
105
+ })
106
+ continue
107
+
73
108
  for tg in tg_details:
74
109
  tg_name = tg['TargetGroupName']
75
- health_checks = elbv2_client.describe_target_health(TargetGroupArn=tg['TargetGroupArn']).get('TargetHealthDescriptions', [])
76
-
110
+ hc_path = tg.get('HealthCheckPath', '-')
111
+
112
+ try:
113
+ health_checks = elbv2_client.describe_target_health(TargetGroupArn=tg['TargetGroupArn']).get('TargetHealthDescriptions', [])
114
+ except Exception as e:
115
+ log_info_non_console(f"TargetHealth 조회 실패 ({tg_name}): {e}")
116
+ health_checks = []
117
+
77
118
  if not health_checks:
78
119
  rows.append({
79
120
  "account": account_id, "region": region_name, "lb_name": lb_name, "type": lb_type,
80
121
  "scheme": lb_scheme, "dns": lb_dns, "listener": listener_str, "target_group": tg_name,
81
- "targets": "(No Targets)", "health": "-"
122
+ "hc_path": hc_path, "targets": "(No Targets)", "health": "-"
82
123
  })
83
124
  continue
84
-
125
+
85
126
  for health in health_checks:
86
127
  target_id = health['Target'].get('Id', '-')
87
- try:
88
- ec2_client = session.client("ec2", region_name=region_name)
89
- resp = ec2_client.describe_instances(InstanceIds=[target_id])
90
- reservations = resp.get("Reservations", [])
91
- if reservations and reservations[0]["Instances"]:
92
- tags = reservations[0]["Instances"][0].get("Tags", [])
93
- target_name = next((t["Value"] for t in tags if t["Key"] == "Name"), target_id)
94
- else:
95
- target_name = target_id
96
- except Exception as e:
97
- target_name = target_id
98
-
99
128
  target_port = health['Target'].get('Port', '-')
129
+
130
+ target_name = target_id
131
+ if target_id.startswith("i-"):
132
+ try:
133
+ resp = ec2_client.describe_instances(InstanceIds=[target_id])
134
+ reservations = resp.get("Reservations", [])
135
+ if reservations and reservations[0]["Instances"]:
136
+ tags = reservations[0]["Instances"][0].get("Tags", [])
137
+ inst_name_tag = next((t["Value"] for t in tags if t["Key"] == "Name"), None)
138
+ private_ip = reservations[0]["Instances"][0].get("PrivateIpAddress", "")
139
+ if inst_name_tag:
140
+ target_name = f"{inst_name_tag} ({private_ip or target_id}:{target_port})"
141
+ else:
142
+ target_name = f"{target_id}:{target_port}"
143
+ else:
144
+ target_name = f"{target_id}:{target_port}"
145
+ except Exception:
146
+ target_name = f"{target_id}:{target_port}"
147
+ else:
148
+ target_name = f"{target_id}:{target_port}"
149
+
100
150
  health_status = health['TargetHealth']['State']
101
-
102
- color = "green" if health_status == "healthy" else "red" if health_status == "unhealthy" else "yellow"
103
- health_colored = f"[{color}]{health_status}[/{color}]"
151
+ reason = health['TargetHealth'].get('Reason', '')
152
+
153
+ if health_status == "healthy":
154
+ health_colored = "[bold green]Healthy[/bold green]"
155
+ elif health_status == "unhealthy":
156
+ reason_str = f" ({reason})" if reason else ""
157
+ health_colored = f"[bold red]Unhealthy{reason_str}[/bold red]"
158
+ else:
159
+ health_colored = f"[bold yellow]{health_status.capitalize()}[/bold yellow]"
104
160
 
105
161
  rows.append({
106
162
  "account": account_id, "region": region_name, "lb_name": lb_name, "type": lb_type,
107
163
  "scheme": lb_scheme, "dns": lb_dns, "listener": listener_str, "target_group": tg_name,
108
- "targets": f"{target_name}:{target_port}", "health": health_colored
164
+ "hc_path": hc_path, "targets": target_name, "health": health_colored
109
165
  })
166
+
110
167
  return rows
111
168
 
169
+
112
170
  def print_lb_table(all_rows):
113
171
  if not all_rows:
114
172
  console.print("[yellow]표시할 로드 밸런서 정보가 없습니다.[/yellow]")
115
173
  return
116
-
174
+
117
175
  all_rows.sort(key=lambda x: (x["account"], x["region"], x["lb_name"], x["listener"], x["target_group"]))
118
176
 
119
177
  table = Table(box=box.HORIZONTALS, expand=False, show_header=True, header_style="bold")
120
178
  table.show_edge = False
121
-
122
- headers = ["Account", "Region", "LB Name", "Type", "Scheme", "Listener", "Target Group", "Targets", "Health"]
123
- keys = ["account", "region", "lb_name", "type", "scheme", "listener", "target_group", "targets", "health"]
124
-
179
+
180
+ headers = ["Account", "Region", "LB Name", "Type", "Scheme", "Listener", "Target Group", "Health Path", "Target (Instance / IP:Port)", "Health"]
181
+ keys = ["account", "region", "lb_name", "type", "scheme", "listener", "target_group", "hc_path", "targets", "health"]
182
+
125
183
  for h in headers:
126
184
  style = {}
127
185
  if h == "Account": style = {"style": "bold magenta"}
@@ -133,8 +191,8 @@ def print_lb_table(all_rows):
133
191
  for i, row in enumerate(all_rows):
134
192
  account_changed = row["account"] != last_account
135
193
  region_changed = row["region"] != last_region
136
- lb_changed = row["lb_name"] != last_lb
137
- tg_changed = row["target_group"] != last_tg
194
+ lb_changed = row["lb_name"] != last_lb or account_changed or region_changed
195
+ tg_changed = row["target_group"] != last_tg or lb_changed
138
196
 
139
197
  if i > 0:
140
198
  if account_changed:
@@ -149,42 +207,43 @@ def print_lb_table(all_rows):
149
207
  display_values = []
150
208
  display_values.append(row["account"] if account_changed else "")
151
209
  display_values.append(row["region"] if account_changed or region_changed else "")
152
- display_values.append(row["lb_name"] if account_changed or region_changed or lb_changed else "")
153
- display_values.append(row["type"] if account_changed or region_changed or lb_changed else "")
154
- display_values.append(row["scheme"] if account_changed or region_changed or lb_changed else "")
155
- display_values.append(row["listener"] if account_changed or region_changed or lb_changed else "")
156
- display_values.append(row["target_group"] if account_changed or region_changed or lb_changed or tg_changed else "")
157
-
158
- for k in keys[7:]:
159
- display_values.append(str(row.get(k, "-")))
160
-
210
+ display_values.append(row["lb_name"] if lb_changed else "")
211
+ display_values.append(row["type"] if lb_changed else "")
212
+ display_values.append(row["scheme"] if lb_changed else "")
213
+ display_values.append(row["listener"] if lb_changed else "")
214
+ display_values.append(row["target_group"] if tg_changed else "")
215
+ display_values.append(row["hc_path"] if tg_changed else "")
216
+ display_values.append(row["targets"])
217
+ display_values.append(row["health"])
218
+
161
219
  table.add_row(*display_values)
162
-
220
+
163
221
  last_account, last_region, last_lb, last_tg = row["account"], row["region"], row["lb_name"], row["target_group"]
164
222
 
165
223
  console.print(table)
166
224
 
225
+
167
226
  def main(args):
168
227
  accounts = get_env_accounts(args.account)
169
228
  regions = args.regions.split(",") if args.regions else DEFINED_REGIONS
170
229
  profiles_map = get_profiles()
171
230
  name_filter = args.name if hasattr(args, 'name') and args.name else None
172
-
231
+
173
232
  # Filter out accounts without valid profiles
174
233
  valid_accounts = []
175
234
  for acct in accounts:
176
235
  profile_name = profiles_map.get(acct)
177
236
  if profile_name:
178
237
  valid_accounts.append((acct, profile_name))
179
-
238
+
180
239
  total_operations = len(valid_accounts) * len(regions)
181
-
240
+
182
241
  all_rows = []
183
242
  with ManualProgress("Collecting Load Balancer information across accounts and regions", total=total_operations) as progress:
184
243
  with ThreadPoolExecutor() as executor:
185
244
  futures = []
186
245
  future_to_info = {}
187
-
246
+
188
247
  for acct, profile_name in valid_accounts:
189
248
  for reg in regions:
190
249
  future = executor.submit(fetch_lb_one_account_region, acct, profile_name, reg, name_filter)
@@ -204,14 +263,16 @@ def main(args):
204
263
  completed += 1
205
264
  log_info_non_console(f"Failed to collect LB data for {acct}/{reg}: {e}")
206
265
  progress.update(f"Failed {acct}/{reg} - {str(e)[:50]}...", advance=1)
207
-
266
+
208
267
  print_lb_table(all_rows)
209
268
 
269
+
210
270
  def add_arguments(parser):
211
271
  parser.add_argument('-a', '--account', help='특정 AWS 계정 ID 목록(,) (없으면 .env 사용)')
212
272
  parser.add_argument('-r', '--regions', help='리전 목록(,) (없으면 .env/DEFINED_REGIONS)')
213
273
  parser.add_argument('-n', '--name', help='LB 이름 필터 (부분 일치)')
214
274
 
275
+
215
276
  if __name__ == "__main__":
216
277
  parser = argparse.ArgumentParser(description="AWS LB 정보 (병렬 수집)")
217
278
  add_arguments(parser)
@@ -0,0 +1 @@
1
+ # Tencent Cloud Platform
File without changes