"""CLI entrypoint for CloudSSO access configuration creator.""" from __future__ import annotations import argparse from pathlib import Path from typing import Sequence from .client import AuthError, create_cloudsso_client from .config import ConfigError, load_config from .creator import ApiError, process_roles from .logger import setup_logger def build_parser() -> argparse.ArgumentParser: default_config = Path(__file__).resolve().parents[1] / "roles_config.json" parser = argparse.ArgumentParser( description="Create Alibaba Cloud SSO access configurations from JSON config." ) parser.add_argument( "-c", "--config", default=str(default_config), help="Path to roles config JSON file", ) parser.add_argument("--access-key-id", help="Alibaba Cloud Access Key ID") parser.add_argument("--access-key-secret", help="Alibaba Cloud Access Key Secret") parser.add_argument("-r", "--region", help="Override region from config") parser.add_argument( "-v", "--verbose", action="store_true", help="Enable verbose debug logging", ) return parser def main(argv: Sequence[str] = None) -> int: """Run CLI flow and return process exit code.""" parser = build_parser() args = parser.parse_args(argv) logger = setup_logger(verbose=args.verbose) try: config = load_config(args.config, args.region) client = create_cloudsso_client( region=args.region or config.region, access_key_id=args.access_key_id, access_key_secret=args.access_key_secret, ) summary = process_roles(client, config, logger) except ConfigError as exc: logger.error("Configuration error: %s", exc) return 1 except ApiError as exc: logger.error("API error: %s", exc) if exc.role_name: logger.error("Role: %s", exc.role_name) if exc.policy_name: logger.error("Policy: %s", exc.policy_name) return 2 except AuthError as exc: logger.error("Authentication error: %s", exc) return 3 logger.info("Execution summary") logger.info(" total=%s", summary.get("total")) logger.info(" created=%s", summary.get("created")) logger.info(" skipped=%s", summary.get("skipped")) logger.info(" policies_attached=%s", summary.get("policies_attached")) logger.info(" elapsed=%ss", summary.get("elapsed")) return 0 if __name__ == "__main__": raise SystemExit(main())