Feature: AWS SDK integration for CloudResourceHandler As a CleverAgents user I want the CloudResourceHandler to use real AWS SDK operations So that I can resolve and discover AWS cloud resources # ── boto3 availability ──────────────────────────────────────────────────── Scenario: boto3 availability flag is exposed Given awssdk the cloud handler module is imported Then awssdk the boto3 availability flag should be a boolean # ── _build_aws_session ──────────────────────────────────────────────────── Scenario: _build_aws_session raises ImportError when boto3 is unavailable Given awssdk boto3 is not available When awssdk I try to build an AWS session with valid credentials Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: _build_aws_session builds a session from explicit credentials Given awssdk boto3 is available via mock When awssdk I build an AWS session with explicit credentials Then awssdk the session should be created successfully Scenario: _build_aws_session builds a session from profile name Given awssdk boto3 is available via mock When awssdk I build an AWS session with a profile name "test-profile" Then awssdk the session should be created with profile "test-profile" # ── CloudResourceHandler.resolve for AWS ───────────────────────────────── Scenario: resolve returns BoundResource for AWS account type with mocked STS Given awssdk boto3 is available via mock And awssdk AWS STS returns account id "123456789012" And awssdk a valid AWS cloud resource of type "aws" When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk a BoundResource should be returned And awssdk the BoundResource slot_name should be "cloud-slot" And awssdk the BoundResource resource_type should be "aws" And awssdk the BoundResource sandbox_path should contain "123456789012" Scenario: resolve returns BoundResource for aws-vpc type (no STS check) Given awssdk boto3 is available via mock And awssdk a valid AWS cloud resource of type "aws-vpc" When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk a BoundResource should be returned And awssdk the BoundResource resource_type should be "aws-vpc" Scenario: resolve raises ValueError when STS call fails Given awssdk boto3 is available via mock And awssdk AWS STS raises a ClientError And awssdk a valid AWS cloud resource of type "aws" When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk a ValueError should be raised mentioning "credential verification failed" Scenario: resolve raises ImportError for AWS when boto3 is not installed Given awssdk boto3 is not available And awssdk a valid AWS cloud resource of type "aws-vpc" When awssdk I call resolve on the cloud handler without boto3 Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: resolve raises NotImplementedError for GCP provider Given awssdk boto3 is available via mock And awssdk a valid GCP cloud resource with credentials When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk a NotImplementedError should be raised mentioning "gcp" Scenario: resolve raises NotImplementedError for Azure provider Given awssdk boto3 is available via mock And awssdk a valid Azure cloud resource with credentials When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk a NotImplementedError should be raised mentioning "azure" # ── discover_aws_resources ──────────────────────────────────────────────── Scenario: discover_aws_resources returns empty list for unmapped type Given awssdk boto3 is available via mock And awssdk a mock boto3 session And awssdk a cloud resource of type "aws-unknown-type" When awssdk I call discover_aws_resources Then awssdk the discovery result should be an empty list Scenario: discover_aws_resources discovers VPCs from EC2 Given awssdk boto3 is available via mock And awssdk EC2 describe_vpcs returns 2 VPCs And awssdk a cloud resource of type "aws-vpc" When awssdk I call discover_aws_resources Then awssdk the discovery result should have 2 items And awssdk each discovery item should have an "id" key And awssdk each discovery item should have an "arn" key Scenario: discover_aws_resources discovers EC2 instances via describe_instances Given awssdk boto3 is available via mock And awssdk EC2 describe_instances returns 3 instances And awssdk a cloud resource of type "aws-instance" When awssdk I call discover_aws_resources Then awssdk the discovery result should have 3 items And awssdk each discovery item should have an "id" key And awssdk each discovery item "id" should be non-empty Scenario: discover_aws_resources discovers S3 buckets Given awssdk boto3 is available via mock And awssdk S3 list_buckets returns 3 buckets And awssdk a cloud resource of type "aws-s3-bucket" When awssdk I call discover_aws_resources Then awssdk the discovery result should have 3 items And awssdk each discovery item arn should start with "arn:aws:s3:::" Scenario: discover_aws_resources discovers ECS clusters Given awssdk boto3 is available via mock And awssdk ECS list_clusters returns 2 cluster ARNs And awssdk a cloud resource of type "aws-ecs-cluster" When awssdk I call discover_aws_resources Then awssdk the discovery result should have 2 items Scenario: discover_aws_resources handles API errors gracefully Given awssdk boto3 is available via mock And awssdk a mock boto3 session that raises an exception And awssdk a cloud resource of type "aws-vpc" When awssdk I call discover_aws_resources Then awssdk the discovery result should be an empty list # ── CloudResourceHandler.discover_children ──────────────────────────────── Scenario: discover_children raises NotImplementedError for non-AWS provider Given awssdk a CloudResourceHandler instance And awssdk a cloud resource of type "gcp-project" When awssdk I call discover_children on the cloud handler Then awssdk a NotImplementedError should be raised mentioning "aws" Scenario: discover_children raises ImportError when boto3 is not installed Given awssdk boto3 is not available And awssdk a CloudResourceHandler instance And awssdk a valid AWS cloud resource of type "aws-vpc" When awssdk I call discover_children on the cloud handler without boto3 Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: discover_children returns Resource objects for discovered VPCs Given awssdk boto3 is available via mock And awssdk a CloudResourceHandler instance And awssdk EC2 describe_vpcs returns 2 VPCs And awssdk a valid AWS cloud resource of type "aws-vpc" When awssdk I call discover_children on the cloud handler with mocked boto3 Then awssdk the aws discovery result should be a list of Resource objects And awssdk the aws discovery result should have 2 items # ── CloudSandboxStrategy AWS implementation ─────────────────────────────── Scenario: CloudSandboxStrategy.create succeeds for AWS with boto3 available Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call create on the AWS sandbox strategy with plan "PLAN-001" Then awssdk no exception should be raised Scenario: CloudSandboxStrategy.create raises ImportError without boto3 Given awssdk boto3 is not available And awssdk a cloud sandbox strategy for "aws" When awssdk I call create on the AWS sandbox strategy with plan "PLAN-001" Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: CloudSandboxStrategy.create raises NotImplementedError for GCP Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "gcp" When awssdk I call create on the AWS sandbox strategy with plan "PLAN-001" Then awssdk a NotImplementedError should be raised Scenario: CloudSandboxStrategy.commit succeeds for AWS with boto3 available Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call commit on the AWS sandbox strategy with plan "PLAN-001" Then awssdk no exception should be raised Scenario: CloudSandboxStrategy.commit raises ImportError without boto3 Given awssdk boto3 is not available And awssdk a cloud sandbox strategy for "aws" When awssdk I call commit on the AWS sandbox strategy with plan "PLAN-001" Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: CloudSandboxStrategy.commit raises NotImplementedError for Azure Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "azure" When awssdk I call commit on the AWS sandbox strategy with plan "PLAN-001" Then awssdk a NotImplementedError should be raised Scenario: CloudSandboxStrategy.rollback succeeds for AWS with boto3 available Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call rollback on the AWS sandbox strategy with plan "PLAN-001" Then awssdk no exception should be raised Scenario: CloudSandboxStrategy.rollback raises ImportError without boto3 Given awssdk boto3 is not available And awssdk a cloud sandbox strategy for "aws" When awssdk I call rollback on the AWS sandbox strategy with plan "PLAN-001" Then awssdk an ImportError should be raised mentioning "cleveragents[aws]" Scenario: CloudSandboxStrategy.rollback raises NotImplementedError for GCP Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "gcp" When awssdk I call rollback on the AWS sandbox strategy with plan "PLAN-001" Then awssdk a NotImplementedError should be raised Scenario: CloudSandboxStrategy.create raises ValueError for empty plan_id Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call create on the AWS sandbox strategy with plan "" Then awssdk a ValueError should be raised mentioning "plan_id" Scenario: CloudSandboxStrategy.commit raises ValueError for empty plan_id Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call commit on the AWS sandbox strategy with plan "" Then awssdk a ValueError should be raised mentioning "plan_id" Scenario: CloudSandboxStrategy.rollback raises ValueError for empty plan_id Given awssdk boto3 is available via mock And awssdk a cloud sandbox strategy for "aws" When awssdk I call rollback on the AWS sandbox strategy with plan "" Then awssdk a ValueError should be raised mentioning "plan_id" # ── Credential masking (regression) ────────────────────────────────────── Scenario: AWS credentials are never logged in plain text Given awssdk boto3 is available via mock And awssdk a valid AWS cloud resource of type "aws" When awssdk I call resolve on the cloud handler with mocked boto3 Then awssdk no raw credential values should appear in log output # ── _AWS_RESOURCE_MAP coverage ──────────────────────────────────────────── Scenario: _AWS_RESOURCE_MAP contains expected AWS resource types Given awssdk the cloud handler module is imported Then awssdk the AWS resource map should contain "aws-vpc" And awssdk the AWS resource map should contain "aws-subnet" And awssdk the AWS resource map should contain "aws-instance" And awssdk the AWS resource map should contain "aws-s3-bucket" And awssdk the AWS resource map should contain "aws-iam-role" And awssdk the AWS resource map should contain "aws-rds-instance" And awssdk the AWS resource map should contain "aws-ecs-cluster" And awssdk the AWS resource map should contain "aws-lambda-function" And awssdk the AWS resource map should contain "aws-eks-cluster"