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.
- {ic_code-1.2.7/src/ic_code.egg-info → ic_code-1.2.8}/PKG-INFO +44 -11
- {ic_code-1.2.7 → ic_code-1.2.8}/README.md +42 -10
- {ic_code-1.2.7 → ic_code-1.2.8}/pyproject.toml +11 -2
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/utils.py +1 -1
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/__init__.py +1 -1
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/cli.py +6 -5
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/info.py +118 -57
- ic_code-1.2.8/src/ic/platforms/tencent/__init__.py +1 -0
- ic_code-1.2.8/src/ic/platforms/tencent/clb/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/clb/info.py +376 -0
- ic_code-1.2.8/src/ic/platforms/tencent/client.py +422 -0
- ic_code-1.2.8/src/ic/platforms/tencent/cvm/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/cvm/info.py +318 -0
- ic_code-1.2.8/src/ic/platforms/tencent/lighthouse/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/lighthouse/info.py +288 -0
- ic_code-1.2.8/src/ic/platforms/tencent/nat/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/nat/info.py +223 -0
- ic_code-1.2.8/src/ic/platforms/tencent/profile/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/profile/info.py +213 -0
- ic_code-1.2.8/src/ic/platforms/tencent/sg/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/sg/info.py +308 -0
- ic_code-1.2.8/src/ic/platforms/tencent/tke/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/tke/info.py +236 -0
- ic_code-1.2.8/src/ic/platforms/tencent/vpc/__init__.py +0 -0
- ic_code-1.2.8/src/ic/platforms/tencent/vpc/info.py +214 -0
- {ic_code-1.2.7 → ic_code-1.2.8/src/ic_code.egg-info}/PKG-INFO +44 -11
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/SOURCES.txt +18 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/requires.txt +1 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/LICENSE +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/MANIFEST.in +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/SECURITY.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/config/default.yaml +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/configuration.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/installation.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/troubleshooting.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/_templates/usage.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/aws_cli_prd.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/aws/installation.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/ci-workflow-guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/cloudflare_configuration_example.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/config_migration.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/deployment.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/cleanup_summary.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/development_guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/import_patterns.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/development/migration_guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/gcp/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/general/configuration.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/installation.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/migration.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/migration_guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/oci/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/oci/installation.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/release-guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/security.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/ssh/configuration.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/troubleshooting.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/docs/user_guide.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/requirements.txt +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/analysis_summary.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/bump-version.sh +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/ci-detect-platforms.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/ci-generate-matrix.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/cli_usage_analysis.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/dependency_mapper.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/deploy.sh +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/final_validation_and_documentation.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/fix_consolidated_imports.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/migration_execution_and_validation.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/oracle-policy/user_policy.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/performance_optimization.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/setup_venv.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/test-ci-detection.sh +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/unset_env.sh +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/validate_config.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/scripts/validate_dependencies.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/setup.cfg +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/setup.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gather_env.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_config_validator.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_monitoring.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/gcp_utils.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/log.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/progress_decorator.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/common/slack.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/config.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/commands/security.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/cli.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/compat/common.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/cleanup.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/docs_organizer.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/external.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/installer.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/manager.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/migration.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/migration_utils.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/path_manager.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/schema.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/secrets.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/config/security.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/dependency_validator.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/logging.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/platform_discovery.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/session.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/core/silence_logging.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/cloudfront/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/build.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/service.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/ecs/task.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/addons.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/fargate.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/nodes.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/pods.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/eks/update_config.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/fargate/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/fargate/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/lb/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/broker.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/msk/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/nat/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/profile/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/profile/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/rds/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/s3/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/sg/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/sg/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/list_tags.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpn/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/aws/vpn/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/account/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/account/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/client.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/rules/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/rules/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/traffic/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/traffic/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/waf/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/waf/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/zone/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/cloudflare/zone/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/billing/mock_data.json +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/compute/mock_data.json +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/firewall/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/functions/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/functions/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/gke/mock_data.json +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/lb/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/lb/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/run/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/run/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/sql/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/sql/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/storage/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/storage/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/gcp/vpc/mock_data.json +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/common/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/common/utils.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/compartment/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/compartment/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/credit.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/cost/usage.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/info/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/info/oci_info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/lb/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/lb/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/nsg/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/nsg/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/obj/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/obj/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/policy/search.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vcn/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vcn/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vm/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/vm/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/volume/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/oci/volume/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto/scan.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/auto_ssh.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server/info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/platforms/ssh/server_info.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/README.md +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/__init__.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/config.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/detector.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/guidance.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/hooks.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/patterns.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic/security/scanner.py +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/dependency_links.txt +0 -0
- {ic_code-1.2.7 → ic_code-1.2.8}/src/ic_code.egg-info/entry_points.txt +0 -0
- {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.
|
|
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
|
[](https://www.python.org/downloads/)
|
|
81
82
|
[](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/`)
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
###
|
|
127
|
+
### 5. 🟧 CloudFlare (Production Ready)
|
|
121
128
|
- **DNS & Zones**: Zone listings, DNS record management, and account filtering
|
|
122
129
|
|
|
123
|
-
###
|
|
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.
|
|
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
|
[](https://www.python.org/downloads/)
|
|
5
5
|
[](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/`)
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
###
|
|
50
|
+
### 5. 🟧 CloudFlare (Production Ready)
|
|
45
51
|
- **DNS & Zones**: Zone listings, DNS record management, and account filtering
|
|
46
52
|
|
|
47
|
-
###
|
|
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.
|
|
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
|
+
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. 프로필 이름 부분 매칭 (예:
|
|
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
|
+
__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
|
|
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 목록 조회
|
|
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
|
|
42
|
-
|
|
43
|
-
|
|
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'
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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":
|
|
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", "
|
|
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
|
|
153
|
-
display_values.append(row["type"] if
|
|
154
|
-
display_values.append(row["scheme"] if
|
|
155
|
-
display_values.append(row["listener"] if
|
|
156
|
-
display_values.append(row["target_group"] if
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|