Copy disabled (too large)
Download .txt
Showing preview only (13,476K chars total). Download the full file to get everything.
Repository: overmindtech/cli
Branch: main
Commit: c4fae77e40c8
Files: 1937
Total size: 12.5 MB
Directory structure:
gitextract_qkwcrphn/
├── .github/
│ ├── e2eapply.tape
│ ├── e2eplan.tape
│ └── workflows/
│ ├── docker-release.yml
│ ├── finalize-copybara-sync.yml
│ ├── release.yml
│ ├── tag-on-merge.yml
│ └── tests.yml
├── .gitignore
├── .goreleaser.yaml
├── .terraform.lock.hcl
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── aws-source/
│ ├── .deadcode-ignore
│ ├── acceptance/
│ │ └── nats-server.conf
│ ├── adapters/
│ │ ├── adapterhelpers_always_get_source.go
│ │ ├── adapterhelpers_always_get_source_test.go
│ │ ├── adapterhelpers_describe_source.go
│ │ ├── adapterhelpers_describe_source_test.go
│ │ ├── adapterhelpers_get_list_adapter_v2.go
│ │ ├── adapterhelpers_get_list_adapter_v2_test.go
│ │ ├── adapterhelpers_get_list_source.go
│ │ ├── adapterhelpers_get_list_source_test.go
│ │ ├── adapterhelpers_notfound_cache_test.go
│ │ ├── adapterhelpers_shared_tests.go
│ │ ├── adapterhelpers_sources.go
│ │ ├── adapterhelpers_util.go
│ │ ├── adapterhelpers_util_test.go
│ │ ├── apigateway-api-key.go
│ │ ├── apigateway-api-key_test.go
│ │ ├── apigateway-authorizer.go
│ │ ├── apigateway-authorizer_test.go
│ │ ├── apigateway-deployment.go
│ │ ├── apigateway-deployment_test.go
│ │ ├── apigateway-domain-name.go
│ │ ├── apigateway-domain-name_test.go
│ │ ├── apigateway-integration.go
│ │ ├── apigateway-integration_test.go
│ │ ├── apigateway-method-response.go
│ │ ├── apigateway-method-response_test.go
│ │ ├── apigateway-method.go
│ │ ├── apigateway-method_test.go
│ │ ├── apigateway-model.go
│ │ ├── apigateway-model_test.go
│ │ ├── apigateway-resource.go
│ │ ├── apigateway-resource_test.go
│ │ ├── apigateway-rest-api.go
│ │ ├── apigateway-rest-api_test.go
│ │ ├── apigateway-stage.go
│ │ ├── apigateway-stage_test.go
│ │ ├── autoscaling-auto-scaling-group.go
│ │ ├── autoscaling-auto-scaling-group_test.go
│ │ ├── autoscaling-auto-scaling-policy.go
│ │ ├── autoscaling-auto-scaling-policy_test.go
│ │ ├── cloudfront-cache-policy.go
│ │ ├── cloudfront-cache-policy_test.go
│ │ ├── cloudfront-continuous-deployment-policy.go
│ │ ├── cloudfront-continuous-deployment-policy_test.go
│ │ ├── cloudfront-distribution.go
│ │ ├── cloudfront-distribution_test.go
│ │ ├── cloudfront-function.go
│ │ ├── cloudfront-function_test.go
│ │ ├── cloudfront-key-group.go
│ │ ├── cloudfront-key-group_test.go
│ │ ├── cloudfront-origin-access-control.go
│ │ ├── cloudfront-origin-access-control_test.go
│ │ ├── cloudfront-origin-request-policy.go
│ │ ├── cloudfront-origin-request-policy_test.go
│ │ ├── cloudfront-realtime-log-config.go
│ │ ├── cloudfront-realtime-log-config_test.go
│ │ ├── cloudfront-response-headers-policy.go
│ │ ├── cloudfront-response-headers-policy_test.go
│ │ ├── cloudfront-streaming-distribution.go
│ │ ├── cloudfront-streaming-distribution_test.go
│ │ ├── cloudfront.go
│ │ ├── cloudfront_test.go
│ │ ├── cloudwatch-alarm.go
│ │ ├── cloudwatch-alarm_test.go
│ │ ├── cloudwatch-instance-metric.go
│ │ ├── cloudwatch-instance-metric_integration_test.go
│ │ ├── cloudwatch-instance-metric_test.go
│ │ ├── cloudwatch_metric_links.go
│ │ ├── cloudwatch_metric_links_test.go
│ │ ├── directconnect-connection.go
│ │ ├── directconnect-connection_test.go
│ │ ├── directconnect-customer-metadata.go
│ │ ├── directconnect-customer-metadata_test.go
│ │ ├── directconnect-direct-connect-gateway-association-proposal.go
│ │ ├── directconnect-direct-connect-gateway-association-proposal_test.go
│ │ ├── directconnect-direct-connect-gateway-association.go
│ │ ├── directconnect-direct-connect-gateway-association_test.go
│ │ ├── directconnect-direct-connect-gateway-attachment.go
│ │ ├── directconnect-direct-connect-gateway-attachment_test.go
│ │ ├── directconnect-direct-connect-gateway.go
│ │ ├── directconnect-direct-connect-gateway_test.go
│ │ ├── directconnect-hosted-connection.go
│ │ ├── directconnect-hosted-connection_test.go
│ │ ├── directconnect-interconnect.go
│ │ ├── directconnect-interconnect_test.go
│ │ ├── directconnect-lag.go
│ │ ├── directconnect-lag_test.go
│ │ ├── directconnect-location.go
│ │ ├── directconnect-location_test.go
│ │ ├── directconnect-router-configuration.go
│ │ ├── directconnect-router-configuration_test.go
│ │ ├── directconnect-virtual-gateway.go
│ │ ├── directconnect-virtual-gateway_test.go
│ │ ├── directconnect-virtual-interface.go
│ │ ├── directconnect-virtual-interface_test.go
│ │ ├── directconnect.go
│ │ ├── directconnect_test.go
│ │ ├── dynamodb-backup.go
│ │ ├── dynamodb-backup_test.go
│ │ ├── dynamodb-table.go
│ │ ├── dynamodb-table_test.go
│ │ ├── dynamodb.go
│ │ ├── dynamodb_test.go
│ │ ├── ec2-address.go
│ │ ├── ec2-address_test.go
│ │ ├── ec2-capacity-reservation-fleet.go
│ │ ├── ec2-capacity-reservation-fleet_test.go
│ │ ├── ec2-capacity-reservation.go
│ │ ├── ec2-capacity-reservation_test.go
│ │ ├── ec2-egress-only-internet-gateway.go
│ │ ├── ec2-egress-only-internet-gateway_test.go
│ │ ├── ec2-iam-instance-profile-association.go
│ │ ├── ec2-iam-instance-profile-association_test.go
│ │ ├── ec2-image.go
│ │ ├── ec2-image_test.go
│ │ ├── ec2-instance-event-window.go
│ │ ├── ec2-instance-event-window_test.go
│ │ ├── ec2-instance-status.go
│ │ ├── ec2-instance-status_test.go
│ │ ├── ec2-instance.go
│ │ ├── ec2-instance_test.go
│ │ ├── ec2-internet-gateway.go
│ │ ├── ec2-internet-gateway_test.go
│ │ ├── ec2-key-pair.go
│ │ ├── ec2-key-pair_test.go
│ │ ├── ec2-launch-template-version.go
│ │ ├── ec2-launch-template-version_test.go
│ │ ├── ec2-launch-template.go
│ │ ├── ec2-launch-template_test.go
│ │ ├── ec2-nat-gateway.go
│ │ ├── ec2-nat-gateway_test.go
│ │ ├── ec2-network-acl.go
│ │ ├── ec2-network-acl_test.go
│ │ ├── ec2-network-interface-permission.go
│ │ ├── ec2-network-interface-permission_test.go
│ │ ├── ec2-network-interface.go
│ │ ├── ec2-network-interface_test.go
│ │ ├── ec2-placement-group.go
│ │ ├── ec2-placement-group_test.go
│ │ ├── ec2-reserved-instance.go
│ │ ├── ec2-reserved-instance_test.go
│ │ ├── ec2-route-table.go
│ │ ├── ec2-route-table_test.go
│ │ ├── ec2-security-group-rule.go
│ │ ├── ec2-security-group-rule_test.go
│ │ ├── ec2-security-group.go
│ │ ├── ec2-security-group_test.go
│ │ ├── ec2-snapshot.go
│ │ ├── ec2-snapshot_test.go
│ │ ├── ec2-subnet.go
│ │ ├── ec2-subnet_test.go
│ │ ├── ec2-transit-gateway-route-table-association.go
│ │ ├── ec2-transit-gateway-route-table-association_test.go
│ │ ├── ec2-transit-gateway-route-table-propagation.go
│ │ ├── ec2-transit-gateway-route-table-propagation_test.go
│ │ ├── ec2-transit-gateway-route-table.go
│ │ ├── ec2-transit-gateway-route-table_test.go
│ │ ├── ec2-transit-gateway-route.go
│ │ ├── ec2-transit-gateway-route_test.go
│ │ ├── ec2-volume-status.go
│ │ ├── ec2-volume-status_test.go
│ │ ├── ec2-volume.go
│ │ ├── ec2-volume_test.go
│ │ ├── ec2-vpc-endpoint.go
│ │ ├── ec2-vpc-endpoint_test.go
│ │ ├── ec2-vpc-peering-connection.go
│ │ ├── ec2-vpc-peering-connection_test.go
│ │ ├── ec2-vpc.go
│ │ ├── ec2-vpc_test.go
│ │ ├── ec2.go
│ │ ├── ec2_test.go
│ │ ├── ecs-capacity-provider.go
│ │ ├── ecs-capacity-provider_test.go
│ │ ├── ecs-cluster.go
│ │ ├── ecs-cluster_test.go
│ │ ├── ecs-container-instance.go
│ │ ├── ecs-container-instance_test.go
│ │ ├── ecs-service.go
│ │ ├── ecs-service_test.go
│ │ ├── ecs-task-definition.go
│ │ ├── ecs-task-definition_test.go
│ │ ├── ecs-task.go
│ │ ├── ecs-task_test.go
│ │ ├── ecs.go
│ │ ├── ecs_test.go
│ │ ├── efs-access-point.go
│ │ ├── efs-access-point_test.go
│ │ ├── efs-backup-policy.go
│ │ ├── efs-backup-policy_test.go
│ │ ├── efs-file-system.go
│ │ ├── efs-file-system_test.go
│ │ ├── efs-mount-target.go
│ │ ├── efs-mount-target_test.go
│ │ ├── efs-replication-configuration.go
│ │ ├── efs-replication-configuration_test.go
│ │ ├── efs.go
│ │ ├── efs_test.go
│ │ ├── eks-addon.go
│ │ ├── eks-addon_test.go
│ │ ├── eks-cluster.go
│ │ ├── eks-cluster_test.go
│ │ ├── eks-fargate-profile.go
│ │ ├── eks-fargate-profile_test.go
│ │ ├── eks-nodegroup.go
│ │ ├── eks-nodegroup_test.go
│ │ ├── eks.go
│ │ ├── eks_test.go
│ │ ├── elb-instance-health.go
│ │ ├── elb-instance-health_test.go
│ │ ├── elb-load-balancer.go
│ │ ├── elb-load-balancer_test.go
│ │ ├── elbv2-listener.go
│ │ ├── elbv2-listener_test.go
│ │ ├── elbv2-load-balancer.go
│ │ ├── elbv2-load-balancer_test.go
│ │ ├── elbv2-rule.go
│ │ ├── elbv2-rule_test.go
│ │ ├── elbv2-target-group.go
│ │ ├── elbv2-target-group_test.go
│ │ ├── elbv2-target-health.go
│ │ ├── elbv2-target-health_test.go
│ │ ├── elbv2.go
│ │ ├── elbv2_test.go
│ │ ├── iam-group.go
│ │ ├── iam-group_test.go
│ │ ├── iam-instance-profile.go
│ │ ├── iam-instance-profile_test.go
│ │ ├── iam-policy.go
│ │ ├── iam-policy_test.go
│ │ ├── iam-role.go
│ │ ├── iam-role_test.go
│ │ ├── iam-user.go
│ │ ├── iam-user_test.go
│ │ ├── iam.go
│ │ ├── iam_test.go
│ │ ├── integration/
│ │ │ ├── apigateway/
│ │ │ │ ├── apigateway_test.go
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── ec2/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── instance_test.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── ec2-transit-gateway/
│ │ │ │ ├── client.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ ├── transit_gateway_route_table_association_test.go
│ │ │ │ ├── transit_gateway_route_table_propagation_test.go
│ │ │ │ ├── transit_gateway_route_table_test.go
│ │ │ │ └── transit_gateway_route_test.go
│ │ │ ├── errors.go
│ │ │ ├── kms/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── kms_test.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── networkmanager/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── networkmanager_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── tags.go
│ │ │ │ └── teardown.go
│ │ │ ├── ssm/
│ │ │ │ └── main_test.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ ├── kms-alias.go
│ │ ├── kms-alias_test.go
│ │ ├── kms-custom-key-store.go
│ │ ├── kms-custom-key-store_test.go
│ │ ├── kms-grant.go
│ │ ├── kms-grant_test.go
│ │ ├── kms-key-policy.go
│ │ ├── kms-key-policy_test.go
│ │ ├── kms-key.go
│ │ ├── kms-key_test.go
│ │ ├── kms.go
│ │ ├── lambda-event-source-mapping.go
│ │ ├── lambda-event-source-mapping_test.go
│ │ ├── lambda-function.go
│ │ ├── lambda-function_test.go
│ │ ├── lambda-layer-version.go
│ │ ├── lambda-layer-version_test.go
│ │ ├── lambda-layer.go
│ │ ├── lambda-layer_test.go
│ │ ├── lambda.go
│ │ ├── lambda_test.go
│ │ ├── main.go
│ │ ├── network-firewall-firewall-policy.go
│ │ ├── network-firewall-firewall-policy_test.go
│ │ ├── network-firewall-firewall.go
│ │ ├── network-firewall-firewall_test.go
│ │ ├── network-firewall-rule-group.go
│ │ ├── network-firewall-rule-group_test.go
│ │ ├── network-firewall-tls-inspection-configuration.go
│ │ ├── network-firewall-tls-inspection-configuration_test.go
│ │ ├── networkfirewall.go
│ │ ├── networkfirewall_test.go
│ │ ├── networkmanager-connect-attachment.go
│ │ ├── networkmanager-connect-attachment_test.go
│ │ ├── networkmanager-connect-peer-association.go
│ │ ├── networkmanager-connect-peer-association_test.go
│ │ ├── networkmanager-connect-peer.go
│ │ ├── networkmanager-connect-peer_test.go
│ │ ├── networkmanager-connection.go
│ │ ├── networkmanager-connection_test.go
│ │ ├── networkmanager-core-network-policy.go
│ │ ├── networkmanager-core-network-policy_test.go
│ │ ├── networkmanager-core-network.go
│ │ ├── networkmanager-core-network_test.go
│ │ ├── networkmanager-device.go
│ │ ├── networkmanager-device_test.go
│ │ ├── networkmanager-global-network.go
│ │ ├── networkmanager-global-network_test.go
│ │ ├── networkmanager-link-association.go
│ │ ├── networkmanager-link-association_test.go
│ │ ├── networkmanager-link.go
│ │ ├── networkmanager-link_test.go
│ │ ├── networkmanager-network-resource-relationship.go
│ │ ├── networkmanager-network-resource-relationship_test.go
│ │ ├── networkmanager-site-to-site-vpn-attachment.go
│ │ ├── networkmanager-site-to-site-vpn-attachment_test.go
│ │ ├── networkmanager-site.go
│ │ ├── networkmanager-site_test.go
│ │ ├── networkmanager-transit-gateway-connect-peer-association.go
│ │ ├── networkmanager-transit-gateway-connect-peer-association_test.go
│ │ ├── networkmanager-transit-gateway-peering.go
│ │ ├── networkmanager-transit-gateway-peering_test.go
│ │ ├── networkmanager-transit-gateway-registration.go
│ │ ├── networkmanager-transit-gateway-registration_test.go
│ │ ├── networkmanager-transit-gateway-route-table-attachment.go
│ │ ├── networkmanager-transit-gateway-route-table-attachment_test.go
│ │ ├── networkmanager-vpc-attachment.go
│ │ ├── networkmanager-vpc-attachment_test.go
│ │ ├── networkmanager.go
│ │ ├── networkmanager_test.go
│ │ ├── rds-db-cluster-parameter-group.go
│ │ ├── rds-db-cluster-parameter-group_test.go
│ │ ├── rds-db-cluster.go
│ │ ├── rds-db-cluster_test.go
│ │ ├── rds-db-instance.go
│ │ ├── rds-db-instance_test.go
│ │ ├── rds-db-parameter-group.go
│ │ ├── rds-db-parameter-group_test.go
│ │ ├── rds-db-subnet-group.go
│ │ ├── rds-db-subnet-group_test.go
│ │ ├── rds-option-group.go
│ │ ├── rds-option-group_test.go
│ │ ├── rds.go
│ │ ├── rds_test.go
│ │ ├── route53-health-check.go
│ │ ├── route53-health-check_test.go
│ │ ├── route53-hosted-zone.go
│ │ ├── route53-hosted-zone_test.go
│ │ ├── route53-resource-record-set.go
│ │ ├── route53-resource-record-set_test.go
│ │ ├── route53.go
│ │ ├── route53_test.go
│ │ ├── s3.go
│ │ ├── s3_test.go
│ │ ├── sns-data-protection-policy.go
│ │ ├── sns-data-protection-policy_test.go
│ │ ├── sns-endpoint.go
│ │ ├── sns-endpoint_test.go
│ │ ├── sns-platform-application.go
│ │ ├── sns-platform-application_test.go
│ │ ├── sns-subscription.go
│ │ ├── sns-subscription_test.go
│ │ ├── sns-topic.go
│ │ ├── sns-topic_test.go
│ │ ├── sns.go
│ │ ├── sqs-queue.go
│ │ ├── sqs-queue_test.go
│ │ ├── sqs.go
│ │ ├── ssm-parameter.go
│ │ ├── ssm-parameter_test.go
│ │ └── tracing.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ ├── docker-compose.yml
│ ├── main.go
│ ├── module/
│ │ ├── provider/
│ │ │ ├── .github/
│ │ │ │ └── workflows/
│ │ │ │ ├── finalize-copybara-sync.yml
│ │ │ │ ├── release.yml
│ │ │ │ └── tag-on-merge.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── LICENSE
│ │ │ ├── datasource_aws_external_id.go
│ │ │ ├── main.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ ├── resource_aws_source.go
│ │ │ └── terraform-registry-manifest.json
│ │ └── terraform/
│ │ ├── .github/
│ │ │ └── workflows/
│ │ │ ├── finalize-copybara-sync.yml
│ │ │ └── tag-on-merge.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── examples/
│ │ │ ├── multi-account/
│ │ │ │ └── main.tf
│ │ │ └── single-account/
│ │ │ └── main.tf
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── variables.tf
│ │ └── versions.tf
│ └── proc/
│ ├── proc.go
│ └── proc_test.go
├── cmd/
│ ├── auth_client.go
│ ├── auth_client_test.go
│ ├── bookmarks.go
│ ├── bookmarks_create_bookmark.go
│ ├── bookmarks_get_affected_bookmarks.go
│ ├── bookmarks_get_bookmark.go
│ ├── changes.go
│ ├── changes_end_change.go
│ ├── changes_get_change.go
│ ├── changes_get_change_test.go
│ ├── changes_get_signals.go
│ ├── changes_get_signals_test.go
│ ├── changes_list_changes.go
│ ├── changes_start_analysis.go
│ ├── changes_start_analysis_test.go
│ ├── changes_start_change.go
│ ├── changes_submit_plan.go
│ ├── changes_submit_plan_test.go
│ ├── changes_submit_signal.go
│ ├── changes_submit_signal_test.go
│ ├── explore.go
│ ├── explore_test.go
│ ├── flags.go
│ ├── flags_test.go
│ ├── integrations.go
│ ├── integrations_tfc.go
│ ├── invites.go
│ ├── invites_crud.go
│ ├── knowledge.go
│ ├── knowledge_dir_flag_test.go
│ ├── knowledge_list.go
│ ├── knowledge_list_test.go
│ ├── logging.go
│ ├── pterm.go
│ ├── repo.go
│ ├── repo_test.go
│ ├── request.go
│ ├── request_load.go
│ ├── request_query.go
│ ├── root.go
│ ├── root_test.go
│ ├── snapshots.go
│ ├── snapshots_create.go
│ ├── snapshots_get_snapshot.go
│ ├── terraform.go
│ ├── terraform_apply.go
│ ├── terraform_plan.go
│ ├── terraform_plan_test.go
│ ├── theme.go
│ ├── theme_darwin.go
│ ├── theme_linux.go
│ ├── theme_test.go
│ ├── theme_windows.go
│ ├── version_check.go
│ └── version_check_test.go
├── demos/
│ └── plan.tape
├── docs.overmind.tech/
│ └── docs/
│ └── sources/
│ ├── aws/
│ │ └── data/
│ │ ├── apigateway-api-key.json
│ │ ├── apigateway-authorizer.json
│ │ ├── apigateway-deployment.json
│ │ ├── apigateway-domain-name.json
│ │ ├── apigateway-integration.json
│ │ ├── apigateway-method-response.json
│ │ ├── apigateway-method.json
│ │ ├── apigateway-model.json
│ │ ├── apigateway-resource.json
│ │ ├── apigateway-rest-api.json
│ │ ├── apigateway-stage.json
│ │ ├── autoscaling-auto-scaling-group.json
│ │ ├── cloudfront-cache-policy.json
│ │ ├── cloudfront-continuous-deployment-policy.json
│ │ ├── cloudfront-distribution.json
│ │ ├── cloudfront-function.json
│ │ ├── cloudfront-key-group.json
│ │ ├── cloudfront-origin-access-control.json
│ │ ├── cloudfront-origin-request-policy.json
│ │ ├── cloudfront-realtime-log-config.json
│ │ ├── cloudfront-response-headers-policy.json
│ │ ├── cloudfront-streaming-distribution.json
│ │ ├── cloudwatch-alarm.json
│ │ ├── directconnect-connection.json
│ │ ├── directconnect-customer-metadata.json
│ │ ├── directconnect-direct-connect-gateway-association-proposal.json
│ │ ├── directconnect-direct-connect-gateway-association.json
│ │ ├── directconnect-direct-connect-gateway-attachment.json
│ │ ├── directconnect-direct-connect-gateway.json
│ │ ├── directconnect-hosted-connection.json
│ │ ├── directconnect-interconnect.json
│ │ ├── directconnect-lag.json
│ │ ├── directconnect-location.json
│ │ ├── directconnect-router-configuration.json
│ │ ├── directconnect-virtual-gateway.json
│ │ ├── directconnect-virtual-interface.json
│ │ ├── dynamodb-backup.json
│ │ ├── dynamodb-table.json
│ │ ├── ec2-address.json
│ │ ├── ec2-capacity-reservation-fleet.json
│ │ ├── ec2-capacity-reservation.json
│ │ ├── ec2-egress-only-internet-gateway.json
│ │ ├── ec2-iam-instance-profile-association.json
│ │ ├── ec2-image.json
│ │ ├── ec2-instance-event-window.json
│ │ ├── ec2-instance-status.json
│ │ ├── ec2-instance.json
│ │ ├── ec2-internet-gateway.json
│ │ ├── ec2-key-pair.json
│ │ ├── ec2-launch-template-version.json
│ │ ├── ec2-launch-template.json
│ │ ├── ec2-nat-gateway.json
│ │ ├── ec2-network-acl.json
│ │ ├── ec2-network-interface-permission.json
│ │ ├── ec2-network-interface.json
│ │ ├── ec2-placement-group.json
│ │ ├── ec2-reserved-instance.json
│ │ ├── ec2-route-table.json
│ │ ├── ec2-security-group-rule.json
│ │ ├── ec2-security-group.json
│ │ ├── ec2-snapshot.json
│ │ ├── ec2-subnet.json
│ │ ├── ec2-transit-gateway-route-table-association.json
│ │ ├── ec2-transit-gateway-route-table-propagation.json
│ │ ├── ec2-transit-gateway-route-table.json
│ │ ├── ec2-transit-gateway-route.json
│ │ ├── ec2-volume-status.json
│ │ ├── ec2-volume.json
│ │ ├── ec2-vpc-endpoint.json
│ │ ├── ec2-vpc-peering-connection.json
│ │ ├── ec2-vpc.json
│ │ ├── ecs-capacity-provider.json
│ │ ├── ecs-cluster.json
│ │ ├── ecs-container-instance.json
│ │ ├── ecs-service.json
│ │ ├── ecs-task-definition.json
│ │ ├── ecs-task.json
│ │ ├── efs-access-point.json
│ │ ├── efs-backup-policy.json
│ │ ├── efs-file-system.json
│ │ ├── efs-mount-target.json
│ │ ├── efs-replication-configuration.json
│ │ ├── eks-addon.json
│ │ ├── eks-cluster.json
│ │ ├── eks-fargate-profile.json
│ │ ├── eks-nodegroup.json
│ │ ├── elb-instance-health.json
│ │ ├── elb-load-balancer.json
│ │ ├── elbv2-listener.json
│ │ ├── elbv2-load-balancer.json
│ │ ├── elbv2-rule.json
│ │ ├── elbv2-target-group.json
│ │ ├── elbv2-target-health.json
│ │ ├── iam-group.json
│ │ ├── iam-instance-profile.json
│ │ ├── iam-policy.json
│ │ ├── iam-role.json
│ │ ├── iam-user.json
│ │ ├── kms-alias.json
│ │ ├── kms-custom-key-store.json
│ │ ├── kms-grant.json
│ │ ├── kms-key-policy.json
│ │ ├── kms-key.json
│ │ ├── lambda-event-source-mapping.json
│ │ ├── lambda-function.json
│ │ ├── lambda-layer-version.json
│ │ ├── lambda-layer.json
│ │ ├── network-firewall-firewall-policy.json
│ │ ├── network-firewall-firewall.json
│ │ ├── network-firewall-rule-group.json
│ │ ├── network-firewall-tls-inspection-configuration.json
│ │ ├── networkmanager-connect-attachment.json
│ │ ├── networkmanager-connect-peer-association.json
│ │ ├── networkmanager-connect-peer.json
│ │ ├── networkmanager-connection.json
│ │ ├── networkmanager-core-network-policy.json
│ │ ├── networkmanager-core-network.json
│ │ ├── networkmanager-device.json
│ │ ├── networkmanager-global-network.json
│ │ ├── networkmanager-link-association.json
│ │ ├── networkmanager-link.json
│ │ ├── networkmanager-network-resource-relationship.json
│ │ ├── networkmanager-site-to-site-vpn-attachment.json
│ │ ├── networkmanager-site.json
│ │ ├── networkmanager-transit-gateway-connect-peer-association.json
│ │ ├── networkmanager-transit-gateway-peering.json
│ │ ├── networkmanager-transit-gateway-registration.json
│ │ ├── networkmanager-transit-gateway-route-table-attachment.json
│ │ ├── networkmanager-vpc-attachment.json
│ │ ├── rds-db-cluster-parameter-group.json
│ │ ├── rds-db-cluster.json
│ │ ├── rds-db-instance.json
│ │ ├── rds-db-parameter-group.json
│ │ ├── rds-db-subnet-group.json
│ │ ├── rds-option-group.json
│ │ ├── route53-health-check.json
│ │ ├── route53-hosted-zone.json
│ │ ├── route53-resource-record-set.json
│ │ ├── s3-bucket.json
│ │ ├── sns-data-protection-policy.json
│ │ ├── sns-endpoint.json
│ │ ├── sns-platform-application.json
│ │ ├── sns-subscription.json
│ │ ├── sns-topic.json
│ │ ├── sqs-queue.json
│ │ └── ssm-parameter.json
│ ├── embed.go
│ ├── gcp/
│ │ └── data/
│ │ ├── gcp-ai-platform-batch-prediction-job.json
│ │ ├── gcp-ai-platform-custom-job.json
│ │ ├── gcp-ai-platform-endpoint.json
│ │ ├── gcp-ai-platform-model-deployment-monitoring-job.json
│ │ ├── gcp-ai-platform-model.json
│ │ ├── gcp-ai-platform-pipeline-job.json
│ │ ├── gcp-artifact-registry-docker-image.json
│ │ ├── gcp-big-query-data-transfer-transfer-config.json
│ │ ├── gcp-big-query-dataset.json
│ │ ├── gcp-big-query-routine.json
│ │ ├── gcp-big-query-table.json
│ │ ├── gcp-big-table-admin-app-profile.json
│ │ ├── gcp-big-table-admin-backup.json
│ │ ├── gcp-big-table-admin-cluster.json
│ │ ├── gcp-big-table-admin-instance.json
│ │ ├── gcp-big-table-admin-table.json
│ │ ├── gcp-certificate-manager-certificate.json
│ │ ├── gcp-cloud-billing-billing-info.json
│ │ ├── gcp-cloud-build-build.json
│ │ ├── gcp-cloud-functions-function.json
│ │ ├── gcp-cloud-kms-crypto-key-version.json
│ │ ├── gcp-cloud-kms-crypto-key.json
│ │ ├── gcp-cloud-kms-key-ring.json
│ │ ├── gcp-cloud-resource-manager-project.json
│ │ ├── gcp-cloud-resource-manager-tag-value.json
│ │ ├── gcp-compute-address.json
│ │ ├── gcp-compute-autoscaler.json
│ │ ├── gcp-compute-backend-service.json
│ │ ├── gcp-compute-disk.json
│ │ ├── gcp-compute-external-vpn-gateway.json
│ │ ├── gcp-compute-firewall.json
│ │ ├── gcp-compute-forwarding-rule.json
│ │ ├── gcp-compute-global-address.json
│ │ ├── gcp-compute-global-forwarding-rule.json
│ │ ├── gcp-compute-health-check.json
│ │ ├── gcp-compute-http-health-check.json
│ │ ├── gcp-compute-image.json
│ │ ├── gcp-compute-instance-group-manager.json
│ │ ├── gcp-compute-instance-group.json
│ │ ├── gcp-compute-instance-template.json
│ │ ├── gcp-compute-instance.json
│ │ ├── gcp-compute-instant-snapshot.json
│ │ ├── gcp-compute-machine-image.json
│ │ ├── gcp-compute-network-endpoint-group.json
│ │ ├── gcp-compute-network.json
│ │ ├── gcp-compute-node-group.json
│ │ ├── gcp-compute-node-template.json
│ │ ├── gcp-compute-project.json
│ │ ├── gcp-compute-public-delegated-prefix.json
│ │ ├── gcp-compute-region-commitment.json
│ │ ├── gcp-compute-regional-instance-group-manager.json
│ │ ├── gcp-compute-reservation.json
│ │ ├── gcp-compute-route.json
│ │ ├── gcp-compute-router.json
│ │ ├── gcp-compute-security-policy.json
│ │ ├── gcp-compute-snapshot.json
│ │ ├── gcp-compute-ssl-certificate.json
│ │ ├── gcp-compute-ssl-policy.json
│ │ ├── gcp-compute-subnetwork.json
│ │ ├── gcp-compute-target-http-proxy.json
│ │ ├── gcp-compute-target-https-proxy.json
│ │ ├── gcp-compute-target-pool.json
│ │ ├── gcp-compute-url-map.json
│ │ ├── gcp-compute-vpn-gateway.json
│ │ ├── gcp-compute-vpn-tunnel.json
│ │ ├── gcp-container-cluster.json
│ │ ├── gcp-container-node-pool.json
│ │ ├── gcp-dataflow-job.json
│ │ ├── gcp-dataform-repository.json
│ │ ├── gcp-dataplex-aspect-type.json
│ │ ├── gcp-dataplex-data-scan.json
│ │ ├── gcp-dataplex-entry-group.json
│ │ ├── gcp-dataproc-autoscaling-policy.json
│ │ ├── gcp-dataproc-cluster.json
│ │ ├── gcp-dns-managed-zone.json
│ │ ├── gcp-essential-contacts-contact.json
│ │ ├── gcp-file-instance.json
│ │ ├── gcp-iam-role.json
│ │ ├── gcp-iam-service-account-key.json
│ │ ├── gcp-iam-service-account.json
│ │ ├── gcp-logging-bucket.json
│ │ ├── gcp-logging-link.json
│ │ ├── gcp-logging-saved-query.json
│ │ ├── gcp-logging-sink.json
│ │ ├── gcp-monitoring-alert-policy.json
│ │ ├── gcp-monitoring-custom-dashboard.json
│ │ ├── gcp-monitoring-notification-channel.json
│ │ ├── gcp-orgpolicy-policy.json
│ │ ├── gcp-pub-sub-subscription.json
│ │ ├── gcp-pub-sub-topic.json
│ │ ├── gcp-redis-instance.json
│ │ ├── gcp-run-revision.json
│ │ ├── gcp-run-service.json
│ │ ├── gcp-secret-manager-secret.json
│ │ ├── gcp-security-center-management-security-center-service.json
│ │ ├── gcp-service-directory-endpoint.json
│ │ ├── gcp-service-usage-service.json
│ │ ├── gcp-spanner-database.json
│ │ ├── gcp-spanner-instance.json
│ │ ├── gcp-sql-admin-backup-run.json
│ │ ├── gcp-sql-admin-backup.json
│ │ ├── gcp-sql-admin-instance.json
│ │ ├── gcp-storage-bucket-iam-policy.json
│ │ ├── gcp-storage-bucket.json
│ │ └── gcp-storage-transfer-transfer-job.json
│ ├── k8s/
│ │ └── data/
│ │ ├── ClusterRole.json
│ │ ├── ClusterRoleBinding.json
│ │ ├── ConfigMap.json
│ │ ├── CronJob.json
│ │ ├── DaemonSet.json
│ │ ├── Deployment.json
│ │ ├── EndpointSlice.json
│ │ ├── Endpoints.json
│ │ ├── HorizontalPodAutoscaler.json
│ │ ├── Ingress.json
│ │ ├── Job.json
│ │ ├── LimitRange.json
│ │ ├── NetworkPolicy.json
│ │ ├── Node.json
│ │ ├── PersistentVolume.json
│ │ ├── PersistentVolumeClaim.json
│ │ ├── Pod.json
│ │ ├── PodDisruptionBudget.json
│ │ ├── PriorityClass.json
│ │ ├── ReplicaSet.json
│ │ ├── ReplicationController.json
│ │ ├── ResourceQuota.json
│ │ ├── Role.json
│ │ ├── RoleBinding.json
│ │ ├── Secret.json
│ │ ├── Service.json
│ │ ├── ServiceAccount.json
│ │ ├── StatefulSet.json
│ │ ├── StorageClass.json
│ │ └── VolumeAttachment.json
│ └── stdlib/
│ └── data/
│ ├── certificate.json
│ ├── dns.json
│ ├── http.json
│ ├── ip.json
│ ├── rdap-asn.json
│ ├── rdap-domain.json
│ ├── rdap-entity.json
│ ├── rdap-ip-network.json
│ └── rdap-nameserver.json
├── examples/
│ └── create-bookmark.json
├── go/
│ ├── audit/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── auth/
│ │ ├── auth.go
│ │ ├── auth_client.go
│ │ ├── auth_test.go
│ │ ├── context_aware_auth_test.go
│ │ ├── gcpauth.go
│ │ ├── mcpoauth.go
│ │ ├── mcpoauth_test.go
│ │ ├── middleware.go
│ │ ├── middleware_test.go
│ │ ├── nats.go
│ │ ├── nats_test.go
│ │ └── tracing.go
│ ├── cliauth/
│ │ ├── cliauth.go
│ │ └── cliauth_test.go
│ ├── discovery/
│ │ ├── adapter.go
│ │ ├── adapter_test.go
│ │ ├── adapterhost.go
│ │ ├── adapterhost_bench_test.go
│ │ ├── adapterhost_test.go
│ │ ├── cmd.go
│ │ ├── cmd_test.go
│ │ ├── doc.go
│ │ ├── engine.go
│ │ ├── engine_initerror_test.go
│ │ ├── engine_test.go
│ │ ├── enginerequests.go
│ │ ├── enginerequests_test.go
│ │ ├── execute_query_trace_test.go
│ │ ├── getfindmutex.go
│ │ ├── getfindmutex_test.go
│ │ ├── heartbeat.go
│ │ ├── heartbeat_test.go
│ │ ├── item_tests.go
│ │ ├── logs.go
│ │ ├── logs_test.go
│ │ ├── main_test.go
│ │ ├── nats_shared_test.go
│ │ ├── nats_watcher.go
│ │ ├── nats_watcher_test.go
│ │ ├── nil_publisher.go
│ │ ├── performance_test.go
│ │ ├── querytracker.go
│ │ ├── querytracker_test.go
│ │ ├── shared_test.go
│ │ └── tracing.go
│ ├── logging/
│ │ ├── logging.go
│ │ └── logging_test.go
│ ├── sdp-go/
│ │ ├── .gitignore
│ │ ├── account.go
│ │ ├── account.pb.go
│ │ ├── apikey.go
│ │ ├── apikeys.pb.go
│ │ ├── area51.pb.go
│ │ ├── auth0support.pb.go
│ │ ├── bookmarks.go
│ │ ├── bookmarks.pb.go
│ │ ├── cached_entry.pb.go
│ │ ├── changes.go
│ │ ├── changes.pb.go
│ │ ├── changes_test.go
│ │ ├── changetimeline.go
│ │ ├── changetimeline_test.go
│ │ ├── cli.pb.go
│ │ ├── compare.go
│ │ ├── config.pb.go
│ │ ├── connection.go
│ │ ├── connection_test.go
│ │ ├── encoder_test.go
│ │ ├── errors.go
│ │ ├── gateway.go
│ │ ├── gateway.pb.go
│ │ ├── gateway_test.go
│ │ ├── genhandler.go
│ │ ├── graph/
│ │ │ ├── main.go
│ │ │ └── main_test.go
│ │ ├── handler_cancelquery.go
│ │ ├── handler_gatewayresponse.go
│ │ ├── handler_natsgetlogrecordsrequest.go
│ │ ├── handler_natsgetlogrecordsresponse.go
│ │ ├── handler_query.go
│ │ ├── handler_queryresponse.go
│ │ ├── host_trust.go
│ │ ├── host_trust_test.go
│ │ ├── instance_detect.go
│ │ ├── invites.pb.go
│ │ ├── items.go
│ │ ├── items.pb.go
│ │ ├── items_test.go
│ │ ├── link_extract.go
│ │ ├── link_extract_test.go
│ │ ├── logs.go
│ │ ├── logs.pb.go
│ │ ├── logs_test.go
│ │ ├── progress.go
│ │ ├── progress_test.go
│ │ ├── proto_clone_test.go
│ │ ├── responses.go
│ │ ├── responses.pb.go
│ │ ├── revlink.pb.go
│ │ ├── sdpconnect/
│ │ │ ├── account.connect.go
│ │ │ ├── apikeys.connect.go
│ │ │ ├── area51.connect.go
│ │ │ ├── auth0support.connect.go
│ │ │ ├── bookmarks.connect.go
│ │ │ ├── changes.connect.go
│ │ │ ├── cli.connect.go
│ │ │ ├── config.connect.go
│ │ │ ├── invites.connect.go
│ │ │ ├── logs.connect.go
│ │ │ ├── revlink.connect.go
│ │ │ ├── signal.connect.go
│ │ │ └── snapshots.connect.go
│ │ ├── sdpws/
│ │ │ ├── client.go
│ │ │ ├── client_test.go
│ │ │ ├── messagehandler.go
│ │ │ └── utils.go
│ │ ├── signal.pb.go
│ │ ├── signals.go
│ │ ├── snapshots.go
│ │ ├── snapshots.pb.go
│ │ ├── test_utils.go
│ │ ├── test_utils_test.go
│ │ ├── tracing.go
│ │ ├── tracing_test.go
│ │ ├── util.go
│ │ ├── util.pb.go
│ │ ├── util_test.go
│ │ ├── validation.go
│ │ └── validation_test.go
│ ├── sdpcache/
│ │ ├── bolt.go
│ │ ├── boltstore.go
│ │ ├── boltstore_test.go
│ │ ├── cache.go
│ │ ├── cache_benchmark_test.go
│ │ ├── cache_contract_test.go
│ │ ├── cache_stuck_test.go
│ │ ├── cache_test.go
│ │ ├── item_generator_test.go
│ │ ├── lookup_coordinator.go
│ │ ├── memory.go
│ │ ├── memory_test.go
│ │ ├── noop_cache_test.go
│ │ ├── pending.go
│ │ ├── purger.go
│ │ ├── sharded.go
│ │ └── sharded_test.go
│ └── tracing/
│ ├── deferlog.go
│ ├── header_carrier.go
│ ├── main.go
│ ├── main_test.go
│ ├── memory.go
│ └── memory_test.go
├── go.mod
├── go.sum
├── gon-amd64.json
├── gon-arm64.json
├── k8s-source/
│ ├── acceptance/
│ │ └── nats-server.conf
│ ├── adapters/
│ │ ├── clusterrole.go
│ │ ├── clusterrole_test.go
│ │ ├── clusterrolebinding.go
│ │ ├── clusterrolebinding_test.go
│ │ ├── configmap.go
│ │ ├── configmap_test.go
│ │ ├── cronjob.go
│ │ ├── cronjob_test.go
│ │ ├── daemonset.go
│ │ ├── daemonset_test.go
│ │ ├── deployment.go
│ │ ├── deployment_test.go
│ │ ├── endpoints.go
│ │ ├── endpoints_test.go
│ │ ├── endpointslice.go
│ │ ├── endpointslice_test.go
│ │ ├── generic_source.go
│ │ ├── generic_source_test.go
│ │ ├── horizontalpodautoscaler.go
│ │ ├── horizontalpodautoscaler_test.go
│ │ ├── ingress.go
│ │ ├── ingress_test.go
│ │ ├── job.go
│ │ ├── job_test.go
│ │ ├── limitrange.go
│ │ ├── limitrange_test.go
│ │ ├── main.go
│ │ ├── networkpolicy.go
│ │ ├── networkpolicy_test.go
│ │ ├── node.go
│ │ ├── node_test.go
│ │ ├── persistentvolume.go
│ │ ├── persistentvolume_test.go
│ │ ├── persistentvolumeclaim.go
│ │ ├── persistentvolumeclaim_test.go
│ │ ├── poddisruptionbudget.go
│ │ ├── poddisruptionbudget_test.go
│ │ ├── pods.go
│ │ ├── pods_test.go
│ │ ├── priorityclass.go
│ │ ├── priorityclass_test.go
│ │ ├── replicaset.go
│ │ ├── replicaset_test.go
│ │ ├── replicationcontroller.go
│ │ ├── replicationcontroller_test.go
│ │ ├── resourcequota.go
│ │ ├── resourcequota_test.go
│ │ ├── role.go
│ │ ├── role_test.go
│ │ ├── rolebinding.go
│ │ ├── rolebinding_test.go
│ │ ├── secret.go
│ │ ├── secret_test.go
│ │ ├── service.go
│ │ ├── service_test.go
│ │ ├── serviceaccount.go
│ │ ├── serviceaccount_test.go
│ │ ├── shared_test.go
│ │ ├── shared_util.go
│ │ ├── shared_util_test.go
│ │ ├── statefulset.go
│ │ ├── statefulset_test.go
│ │ ├── storageclass.go
│ │ ├── storageclass_test.go
│ │ ├── volumeattachment.go
│ │ └── volumeattachment_test.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ ├── config.json
│ ├── cr.sh
│ ├── deployments/
│ │ └── overmind-kube-source/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── templates/
│ │ │ ├── NOTES.txt
│ │ │ ├── _helpers.tpl
│ │ │ ├── clusterrole.yaml
│ │ │ ├── clusterrolebinding.yaml
│ │ │ ├── configmap.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── poddisruptionbudget.yaml
│ │ │ ├── secret.yaml
│ │ │ └── serviceaccount.yaml
│ │ └── values.yaml
│ ├── main.go
│ └── proc/
│ └── proc.go
├── knowledge/
│ ├── discover.go
│ └── discover_test.go
├── main.go
├── main.tf
├── sources/
│ ├── aws/
│ │ ├── apigateway-api-key.go
│ │ ├── apigateway-stage.go
│ │ ├── base.go
│ │ ├── errors.go
│ │ ├── shared/
│ │ │ ├── item-types.go
│ │ │ └── models.go
│ │ └── validation_test.go
│ ├── azure/
│ │ ├── README.MD
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── clients/
│ │ │ ├── application-gateways-client.go
│ │ │ ├── application-security-groups-client.go
│ │ │ ├── availability-sets-client.go
│ │ │ ├── batch-accounts-client.go
│ │ │ ├── batch-application-client.go
│ │ │ ├── batch-application-package-client.go
│ │ │ ├── batch-pool-client.go
│ │ │ ├── batch-private-endpoint-connection-client.go
│ │ │ ├── blob-containers-client.go
│ │ │ ├── capacity-reservation-groups-client.go
│ │ │ ├── capacity-reservations-client.go
│ │ │ ├── compute-disk-access-private-endpoint-connection-client.go
│ │ │ ├── dbforpostgresql-configurations-client.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator-client.go
│ │ │ ├── dbforpostgresql-flexible-server-backup-client.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection-client.go
│ │ │ ├── dbforpostgresql-flexible-server-replica-client.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint-client.go
│ │ │ ├── ddos-protection-plans-client.go
│ │ │ ├── dedicated-host-groups-client.go
│ │ │ ├── dedicated-hosts-client.go
│ │ │ ├── default-security-rules-client.go
│ │ │ ├── disk-accesses-client.go
│ │ │ ├── disk-encryption-sets-client.go
│ │ │ ├── disks-client.go
│ │ │ ├── documentdb-database-accounts-client.go
│ │ │ ├── documentdb-private-endpoint-connection-client.go
│ │ │ ├── elastic-san-client.go
│ │ │ ├── elastic-san-volume-client.go
│ │ │ ├── elastic-san-volume-group-client.go
│ │ │ ├── elastic-san-volume-snapshot-client.go
│ │ │ ├── encryption-scopes-client.go
│ │ │ ├── federated-identity-credentials-client.go
│ │ │ ├── fileshares-client.go
│ │ │ ├── flow-logs-client.go
│ │ │ ├── galleries-client.go
│ │ │ ├── gallery-application-versions-client.go
│ │ │ ├── gallery-applications-client.go
│ │ │ ├── gallery-images-client.go
│ │ │ ├── images-client.go
│ │ │ ├── interface-ip-configurations-client.go
│ │ │ ├── ip-groups-client.go
│ │ │ ├── keyvault-key-client.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection-client.go
│ │ │ ├── load-balancer-backend-address-pools-client.go
│ │ │ ├── load-balancer-frontend-ip-configurations-client.go
│ │ │ ├── load-balancer-probes-client.go
│ │ │ ├── load-balancers-client.go
│ │ │ ├── local-network-gateways-client.go
│ │ │ ├── maintenance-configuration-client.go
│ │ │ ├── managed-hsms-client.go
│ │ │ ├── nat-gateways-client.go
│ │ │ ├── network-interfaces-client.go
│ │ │ ├── network-private-endpoint-client.go
│ │ │ ├── network-security-groups-client.go
│ │ │ ├── network-watchers-client.go
│ │ │ ├── operational-insights-workspace-client.go
│ │ │ ├── pager.go
│ │ │ ├── pager_mocks.go
│ │ │ ├── postgresql-databases-client.go
│ │ │ ├── postgresql-flexible-server-firewall-rule-client.go
│ │ │ ├── postgresql-flexible-servers-client.go
│ │ │ ├── private-dns-zones-client.go
│ │ │ ├── private-link-services-client.go
│ │ │ ├── proximity-placement-groups-client.go
│ │ │ ├── public-ip-addresses.go
│ │ │ ├── public-ip-prefixes-client.go
│ │ │ ├── queues-client.go
│ │ │ ├── record-sets-client.go
│ │ │ ├── role-assignments-client.go
│ │ │ ├── role-definitions-client.go
│ │ │ ├── route-tables-client.go
│ │ │ ├── routes-client.go
│ │ │ ├── secrets-client.go
│ │ │ ├── security-rules-client.go
│ │ │ ├── shared-gallery-images-client.go
│ │ │ ├── snapshots-client.go
│ │ │ ├── sql-database-schemas-client.go
│ │ │ ├── sql-databases-client.go
│ │ │ ├── sql-elastic-pool-client.go
│ │ │ ├── sql-failover-groups-client.go
│ │ │ ├── sql-server-firewall-rule-client.go
│ │ │ ├── sql-server-keys-client.go
│ │ │ ├── sql-server-private-endpoint-connection-client.go
│ │ │ ├── sql-server-virtual-network-rule-client.go
│ │ │ ├── sql-servers-client.go
│ │ │ ├── storage-accounts-client.go
│ │ │ ├── storage-private-endpoint-connection-client.go
│ │ │ ├── subnets-client.go
│ │ │ ├── tables-client.go
│ │ │ ├── user-assigned-identities-client.go
│ │ │ ├── vaults-client.go
│ │ │ ├── virtual-machine-extensions-client.go
│ │ │ ├── virtual-machine-run-commands-client.go
│ │ │ ├── virtual-machine-scale-sets-client.go
│ │ │ ├── virtual-machines-client.go
│ │ │ ├── virtual-network-gateway-connections-client.go
│ │ │ ├── virtual-network-gateways-client.go
│ │ │ ├── virtual-network-links-client.go
│ │ │ ├── virtual-network-peerings-client.go
│ │ │ ├── virtual-networks-client.go
│ │ │ └── zones-client.go
│ │ ├── cmd/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── docs/
│ │ │ ├── federated-credentials.md
│ │ │ ├── testing-federated-auth.md
│ │ │ └── usage.md
│ │ ├── integration-tests/
│ │ │ ├── README.md
│ │ │ ├── authorization-role-assignment_test.go
│ │ │ ├── authorization-role-definition_test.go
│ │ │ ├── batch-batch-accounts_test.go
│ │ │ ├── batch-batch-application-package_test.go
│ │ │ ├── batch-private-endpoint-connection_test.go
│ │ │ ├── compute-availability-set_test.go
│ │ │ ├── compute-capacity-reservation-group_test.go
│ │ │ ├── compute-dedicated-host-group_test.go
│ │ │ ├── compute-disk-access_test.go
│ │ │ ├── compute-disk-encryption-set_test.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-gallery-application-version_test.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-proximity-placement-group_test.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-virtual-machine-extension_test.go
│ │ │ ├── compute-virtual-machine-run-command_test.go
│ │ │ ├── compute-virtual-machine-scale-set_test.go
│ │ │ ├── compute-virtual-machine_test.go
│ │ │ ├── dbforpostgresql-database_test.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator_test.go
│ │ │ ├── dbforpostgresql-flexible-server-backup_test.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration_test.go
│ │ │ ├── dbforpostgresql-flexible-server-replica_test.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint_test.go
│ │ │ ├── dbforpostgresql-flexible-server_test.go
│ │ │ ├── documentdb-database-accounts_test.go
│ │ │ ├── elastic-san-volume_test.go
│ │ │ ├── helpers_test.go
│ │ │ ├── keyvault-managed-hsm_test.go
│ │ │ ├── keyvault-secret_test.go
│ │ │ ├── keyvault-vault_test.go
│ │ │ ├── keyvault_helpers_test.go
│ │ │ ├── main_test.go
│ │ │ ├── maintenance-maintenance-configuration_test.go
│ │ │ ├── managedidentity-federated-identity-credential_test.go
│ │ │ ├── managedidentity-user-assigned-identity_test.go
│ │ │ ├── network-application-gateway_test.go
│ │ │ ├── network-dns-virtual-network-link_test.go
│ │ │ ├── network-flow-log_test.go
│ │ │ ├── network-ip-group_test.go
│ │ │ ├── network-load-balancer-backend-address-pool_test.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration_test.go
│ │ │ ├── network-load-balancer-probe_test.go
│ │ │ ├── network-load-balancer_test.go
│ │ │ ├── network-local-network-gateway_test.go
│ │ │ ├── network-network-interface-ip-configuration_test.go
│ │ │ ├── network-network-interface_test.go
│ │ │ ├── network-network-security-group_test.go
│ │ │ ├── network-network-watcher_test.go
│ │ │ ├── network-private-link-service_test.go
│ │ │ ├── network-public-ip-address_test.go
│ │ │ ├── network-route-table_test.go
│ │ │ ├── network-virtual-network-gateway-connection_test.go
│ │ │ ├── network-virtual-network_test.go
│ │ │ ├── network-zone_test.go
│ │ │ ├── operational-insights-workspace_test.go
│ │ │ ├── sql-database-schema_test.go
│ │ │ ├── sql-database_test.go
│ │ │ ├── sql-server-failover-group_test.go
│ │ │ ├── sql-server-key_test.go
│ │ │ ├── sql-server_test.go
│ │ │ ├── storage-account_test.go
│ │ │ ├── storage-blob-container_test.go
│ │ │ ├── storage-fileshare_test.go
│ │ │ ├── storage-queues_test.go
│ │ │ └── storage-table_test.go
│ │ ├── main.go
│ │ ├── manual/
│ │ │ ├── README.md
│ │ │ ├── adapters.go
│ │ │ ├── authorization-role-assignment.go
│ │ │ ├── authorization-role-assignment_test.go
│ │ │ ├── authorization-role-definition.go
│ │ │ ├── authorization-role-definition_test.go
│ │ │ ├── batch-batch-accounts.go
│ │ │ ├── batch-batch-accounts_test.go
│ │ │ ├── batch-batch-application-package.go
│ │ │ ├── batch-batch-application-package_test.go
│ │ │ ├── batch-batch-application.go
│ │ │ ├── batch-batch-application_test.go
│ │ │ ├── batch-batch-pool.go
│ │ │ ├── batch-batch-pool_test.go
│ │ │ ├── batch-private-endpoint-connection.go
│ │ │ ├── batch-private-endpoint-connection_test.go
│ │ │ ├── compute-availability-set.go
│ │ │ ├── compute-availability-set_test.go
│ │ │ ├── compute-capacity-reservation-group.go
│ │ │ ├── compute-capacity-reservation-group_test.go
│ │ │ ├── compute-capacity-reservation.go
│ │ │ ├── compute-capacity-reservation_test.go
│ │ │ ├── compute-dedicated-host-group.go
│ │ │ ├── compute-dedicated-host-group_test.go
│ │ │ ├── compute-dedicated-host.go
│ │ │ ├── compute-dedicated-host_test.go
│ │ │ ├── compute-disk-access-private-endpoint-connection.go
│ │ │ ├── compute-disk-access-private-endpoint-connection_test.go
│ │ │ ├── compute-disk-access.go
│ │ │ ├── compute-disk-access_test.go
│ │ │ ├── compute-disk-encryption-set.go
│ │ │ ├── compute-disk-encryption-set_test.go
│ │ │ ├── compute-disk.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-gallery-application-version.go
│ │ │ ├── compute-gallery-application-version_test.go
│ │ │ ├── compute-gallery-application.go
│ │ │ ├── compute-gallery-application_test.go
│ │ │ ├── compute-gallery-image.go
│ │ │ ├── compute-gallery-image_test.go
│ │ │ ├── compute-gallery.go
│ │ │ ├── compute-gallery_test.go
│ │ │ ├── compute-image.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-proximity-placement-group.go
│ │ │ ├── compute-proximity-placement-group_test.go
│ │ │ ├── compute-shared-gallery-image.go
│ │ │ ├── compute-shared-gallery-image_test.go
│ │ │ ├── compute-snapshot.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-virtual-machine-extension.go
│ │ │ ├── compute-virtual-machine-extension_test.go
│ │ │ ├── compute-virtual-machine-run-command.go
│ │ │ ├── compute-virtual-machine-run-command_test.go
│ │ │ ├── compute-virtual-machine-scale-set.go
│ │ │ ├── compute-virtual-machine-scale-set_test.go
│ │ │ ├── compute-virtual-machine.go
│ │ │ ├── compute-virtual-machine_test.go
│ │ │ ├── dbforpostgresql-database.go
│ │ │ ├── dbforpostgresql-database_test.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator_test.go
│ │ │ ├── dbforpostgresql-flexible-server-backup.go
│ │ │ ├── dbforpostgresql-flexible-server-backup_test.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration_test.go
│ │ │ ├── dbforpostgresql-flexible-server-firewall-rule.go
│ │ │ ├── dbforpostgresql-flexible-server-firewall-rule_test.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection_test.go
│ │ │ ├── dbforpostgresql-flexible-server-replica.go
│ │ │ ├── dbforpostgresql-flexible-server-replica_test.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint_test.go
│ │ │ ├── dbforpostgresql-flexible-server.go
│ │ │ ├── dbforpostgresql-flexible-server_test.go
│ │ │ ├── dns_links.go
│ │ │ ├── documentdb-database-accounts.go
│ │ │ ├── documentdb-database-accounts_test.go
│ │ │ ├── documentdb-private-endpoint-connection.go
│ │ │ ├── documentdb-private-endpoint-connection_test.go
│ │ │ ├── elastic-san-volume-group.go
│ │ │ ├── elastic-san-volume-group_test.go
│ │ │ ├── elastic-san-volume-snapshot.go
│ │ │ ├── elastic-san-volume-snapshot_test.go
│ │ │ ├── elastic-san-volume.go
│ │ │ ├── elastic-san-volume_test.go
│ │ │ ├── elastic-san.go
│ │ │ ├── elastic-san_test.go
│ │ │ ├── keyvault-key.go
│ │ │ ├── keyvault-key_test.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection_test.go
│ │ │ ├── keyvault-managed-hsm.go
│ │ │ ├── keyvault-managed-hsm_test.go
│ │ │ ├── keyvault-secret.go
│ │ │ ├── keyvault-secret_test.go
│ │ │ ├── keyvault-vault.go
│ │ │ ├── keyvault-vault_test.go
│ │ │ ├── links_helpers.go
│ │ │ ├── maintenance-maintenance-configuration.go
│ │ │ ├── maintenance-maintenance-configuration_test.go
│ │ │ ├── managedidentity-federated-identity-credential.go
│ │ │ ├── managedidentity-federated-identity-credential_test.go
│ │ │ ├── managedidentity-user-assigned-identity.go
│ │ │ ├── managedidentity-user-assigned-identity_test.go
│ │ │ ├── network-application-gateway.go
│ │ │ ├── network-application-gateway_test.go
│ │ │ ├── network-application-security-group.go
│ │ │ ├── network-application-security-group_test.go
│ │ │ ├── network-ddos-protection-plan.go
│ │ │ ├── network-ddos-protection-plan_test.go
│ │ │ ├── network-default-security-rule.go
│ │ │ ├── network-default-security-rule_test.go
│ │ │ ├── network-dns-record-set.go
│ │ │ ├── network-dns-record-set_test.go
│ │ │ ├── network-dns-virtual-network-link.go
│ │ │ ├── network-dns-virtual-network-link_test.go
│ │ │ ├── network-flow-log.go
│ │ │ ├── network-flow-log_test.go
│ │ │ ├── network-ip-group.go
│ │ │ ├── network-ip-group_test.go
│ │ │ ├── network-load-balancer-backend-address-pool.go
│ │ │ ├── network-load-balancer-backend-address-pool_test.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration_test.go
│ │ │ ├── network-load-balancer-probe.go
│ │ │ ├── network-load-balancer-probe_test.go
│ │ │ ├── network-load-balancer.go
│ │ │ ├── network-load-balancer_test.go
│ │ │ ├── network-local-network-gateway.go
│ │ │ ├── network-local-network-gateway_test.go
│ │ │ ├── network-nat-gateway.go
│ │ │ ├── network-nat-gateway_test.go
│ │ │ ├── network-network-interface-ip-configuration.go
│ │ │ ├── network-network-interface-ip-configuration_test.go
│ │ │ ├── network-network-interface.go
│ │ │ ├── network-network-interface_test.go
│ │ │ ├── network-network-security-group.go
│ │ │ ├── network-network-security-group_test.go
│ │ │ ├── network-network-watcher.go
│ │ │ ├── network-network-watcher_test.go
│ │ │ ├── network-private-dns-zone.go
│ │ │ ├── network-private-dns-zone_test.go
│ │ │ ├── network-private-endpoint.go
│ │ │ ├── network-private-endpoint_test.go
│ │ │ ├── network-private-link-service.go
│ │ │ ├── network-private-link-service_test.go
│ │ │ ├── network-public-ip-address.go
│ │ │ ├── network-public-ip-address_test.go
│ │ │ ├── network-public-ip-prefix.go
│ │ │ ├── network-public-ip-prefix_test.go
│ │ │ ├── network-route-table.go
│ │ │ ├── network-route-table_test.go
│ │ │ ├── network-route.go
│ │ │ ├── network-route_test.go
│ │ │ ├── network-security-rule.go
│ │ │ ├── network-security-rule_test.go
│ │ │ ├── network-subnet.go
│ │ │ ├── network-subnet_test.go
│ │ │ ├── network-virtual-network-gateway-connection.go
│ │ │ ├── network-virtual-network-gateway-connection_test.go
│ │ │ ├── network-virtual-network-gateway.go
│ │ │ ├── network-virtual-network-gateway_test.go
│ │ │ ├── network-virtual-network-peering.go
│ │ │ ├── network-virtual-network-peering_test.go
│ │ │ ├── network-virtual-network.go
│ │ │ ├── network-virtual-network_test.go
│ │ │ ├── network-zone.go
│ │ │ ├── network-zone_test.go
│ │ │ ├── operational-insights-workspace.go
│ │ │ ├── operational-insights-workspace_test.go
│ │ │ ├── sql-database-schema.go
│ │ │ ├── sql-database-schema_test.go
│ │ │ ├── sql-database.go
│ │ │ ├── sql-database_test.go
│ │ │ ├── sql-elastic-pool.go
│ │ │ ├── sql-elastic-pool_test.go
│ │ │ ├── sql-server-failover-group.go
│ │ │ ├── sql-server-failover-group_test.go
│ │ │ ├── sql-server-firewall-rule.go
│ │ │ ├── sql-server-firewall-rule_test.go
│ │ │ ├── sql-server-key.go
│ │ │ ├── sql-server-key_test.go
│ │ │ ├── sql-server-private-endpoint-connection.go
│ │ │ ├── sql-server-private-endpoint-connection_test.go
│ │ │ ├── sql-server-virtual-network-rule.go
│ │ │ ├── sql-server-virtual-network-rule_test.go
│ │ │ ├── sql-server.go
│ │ │ ├── sql-server_test.go
│ │ │ ├── storage-account.go
│ │ │ ├── storage-account_test.go
│ │ │ ├── storage-blob-container.go
│ │ │ ├── storage-blob-container_test.go
│ │ │ ├── storage-encryption-scope.go
│ │ │ ├── storage-encryption-scope_test.go
│ │ │ ├── storage-fileshare.go
│ │ │ ├── storage-fileshare_test.go
│ │ │ ├── storage-private-endpoint-connection.go
│ │ │ ├── storage-private-endpoint-connection_test.go
│ │ │ ├── storage-queues.go
│ │ │ ├── storage-queues_test.go
│ │ │ ├── storage-table.go
│ │ │ └── storage-table_test.go
│ │ ├── proc/
│ │ │ ├── proc.go
│ │ │ └── proc_test.go
│ │ ├── setup_helper_script.sh
│ │ └── shared/
│ │ ├── adapter-meta.go
│ │ ├── azure-http-client.go
│ │ ├── base.go
│ │ ├── credentials.go
│ │ ├── errors.go
│ │ ├── item-types.go
│ │ ├── mocks/
│ │ │ ├── mock_application_gateways_client.go
│ │ │ ├── mock_application_security_groups_client.go
│ │ │ ├── mock_availability_sets_client.go
│ │ │ ├── mock_batch_accounts_client.go
│ │ │ ├── mock_batch_application_client.go
│ │ │ ├── mock_batch_application_package_client.go
│ │ │ ├── mock_batch_pool_client.go
│ │ │ ├── mock_batch_private_endpoint_connection_client.go
│ │ │ ├── mock_blob_containers_client.go
│ │ │ ├── mock_capacity_reservation_groups_client.go
│ │ │ ├── mock_capacity_reservations_client.go
│ │ │ ├── mock_compute_disk_access_private_endpoint_connection_client.go
│ │ │ ├── mock_dbforpostgresql_configurations_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_administrator_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_backup_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_private_endpoint_connection_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_replica_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_virtual_endpoint_client.go
│ │ │ ├── mock_ddos_protection_plans_client.go
│ │ │ ├── mock_dedicated_host_groups_client.go
│ │ │ ├── mock_dedicated_hosts_client.go
│ │ │ ├── mock_default_security_rules_client.go
│ │ │ ├── mock_disk_accesses_client.go
│ │ │ ├── mock_disk_encryption_sets_client.go
│ │ │ ├── mock_disks_client.go
│ │ │ ├── mock_documentdb_database_accounts_client.go
│ │ │ ├── mock_documentdb_private_endpoint_connection_client.go
│ │ │ ├── mock_elastic_san_client.go
│ │ │ ├── mock_elastic_san_volume_client.go
│ │ │ ├── mock_elastic_san_volume_group_client.go
│ │ │ ├── mock_elastic_san_volume_snapshot_client.go
│ │ │ ├── mock_encryption_scopes_client.go
│ │ │ ├── mock_federated_identity_credentials_client.go
│ │ │ ├── mock_file_shares_client.go
│ │ │ ├── mock_flow_logs_client.go
│ │ │ ├── mock_galleries_client.go
│ │ │ ├── mock_gallery_application_versions_client.go
│ │ │ ├── mock_gallery_applications_client.go
│ │ │ ├── mock_gallery_images_client.go
│ │ │ ├── mock_images_client.go
│ │ │ ├── mock_interface_ip_configurations_client.go
│ │ │ ├── mock_ip_groups_client.go
│ │ │ ├── mock_keyvault_key_client.go
│ │ │ ├── mock_keyvault_managed_hsm_private_endpoint_connection_client.go
│ │ │ ├── mock_load_balancer_backend_address_pools_client.go
│ │ │ ├── mock_load_balancer_frontend_ip_configurations_client.go
│ │ │ ├── mock_load_balancer_probes_client.go
│ │ │ ├── mock_load_balancers_client.go
│ │ │ ├── mock_local_network_gateways_client.go
│ │ │ ├── mock_maintenance_configuration_client.go
│ │ │ ├── mock_managed_hsms_client.go
│ │ │ ├── mock_nat_gateways_client.go
│ │ │ ├── mock_network_interfaces_client.go
│ │ │ ├── mock_network_private_endpoint_client.go
│ │ │ ├── mock_network_security_groups_client.go
│ │ │ ├── mock_network_watchers_client.go
│ │ │ ├── mock_operational_insights_workspace_client.go
│ │ │ ├── mock_postgresql_databases_client.go
│ │ │ ├── mock_postgresql_flexible_server_firewall_rule_client.go
│ │ │ ├── mock_postgresql_flexible_servers_client.go
│ │ │ ├── mock_private_dns_zones_client.go
│ │ │ ├── mock_private_link_services_client.go
│ │ │ ├── mock_proximity_placement_groups_client.go
│ │ │ ├── mock_public_ip_addresses_client.go
│ │ │ ├── mock_public_ip_prefixes_client.go
│ │ │ ├── mock_queues_client.go
│ │ │ ├── mock_record_sets_client.go
│ │ │ ├── mock_role_assignments_client.go
│ │ │ ├── mock_role_definitions_client.go
│ │ │ ├── mock_route_tables_client.go
│ │ │ ├── mock_routes_client.go
│ │ │ ├── mock_secrets_client.go
│ │ │ ├── mock_security_rules_client.go
│ │ │ ├── mock_shared_gallery_images_client.go
│ │ │ ├── mock_snapshots_client.go
│ │ │ ├── mock_sql_database_schemas_client.go
│ │ │ ├── mock_sql_databases_client.go
│ │ │ ├── mock_sql_elastic_pool_client.go
│ │ │ ├── mock_sql_failover_groups_client.go
│ │ │ ├── mock_sql_server_firewall_rule_client.go
│ │ │ ├── mock_sql_server_keys_client.go
│ │ │ ├── mock_sql_server_private_endpoint_connection_client.go
│ │ │ ├── mock_sql_server_virtual_network_rule_client.go
│ │ │ ├── mock_sql_servers_client.go
│ │ │ ├── mock_storage_accounts_client.go
│ │ │ ├── mock_storage_accounts_pager.go
│ │ │ ├── mock_storage_private_endpoint_connection_client.go
│ │ │ ├── mock_subnets_client.go
│ │ │ ├── mock_tables_client.go
│ │ │ ├── mock_user_assigned_identities_client.go
│ │ │ ├── mock_vaults_client.go
│ │ │ ├── mock_virtual_machine_extensions_client.go
│ │ │ ├── mock_virtual_machine_run_commands_client.go
│ │ │ ├── mock_virtual_machine_scale_sets_client.go
│ │ │ ├── mock_virtual_machines_client.go
│ │ │ ├── mock_virtual_machines_pager.go
│ │ │ ├── mock_virtual_network_gateway_connections_client.go
│ │ │ ├── mock_virtual_network_gateways_client.go
│ │ │ ├── mock_virtual_network_links_client.go
│ │ │ ├── mock_virtual_network_peerings_client.go
│ │ │ ├── mock_virtual_networks_client.go
│ │ │ ├── mock_zones_client.go
│ │ │ └── pager_helpers.go
│ │ ├── models.go
│ │ ├── resource_id_item_type.go
│ │ ├── resource_id_item_type_test.go
│ │ ├── scope.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── example/
│ │ ├── base.go
│ │ ├── custom_searchable_listable.go
│ │ ├── errors.go
│ │ ├── metadata_test.go
│ │ ├── mocks/
│ │ │ └── mock_external_api_client.go
│ │ ├── shared/
│ │ │ └── models.go
│ │ ├── standard_searchable_listable.go
│ │ ├── standard_searchable_listable_test.go
│ │ └── validation_test.go
│ ├── gcp/
│ │ ├── README.md
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── cmd/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── dynamic/
│ │ │ ├── README.md
│ │ │ ├── adapter-listable.go
│ │ │ ├── adapter-searchable-listable.go
│ │ │ ├── adapter-searchable.go
│ │ │ ├── adapter.go
│ │ │ ├── adapter_test.go
│ │ │ ├── adapters/
│ │ │ │ ├── ai-platform-batch-prediction-job.go
│ │ │ │ ├── ai-platform-batch-prediction-job_test.go
│ │ │ │ ├── ai-platform-custom-job.go
│ │ │ │ ├── ai-platform-custom-job_test.go
│ │ │ │ ├── ai-platform-endpoint.go
│ │ │ │ ├── ai-platform-endpoint_test.go
│ │ │ │ ├── ai-platform-model-deployment-monitoring-job.go
│ │ │ │ ├── ai-platform-model-deployment-monitoring-job_test.go
│ │ │ │ ├── ai-platform-model.go
│ │ │ │ ├── ai-platform-model_test.go
│ │ │ │ ├── ai-platform-pipeline-job.go
│ │ │ │ ├── ai-platform-pipeline-job_test.go
│ │ │ │ ├── artifact-registry-docker-image.go
│ │ │ │ ├── artifact-registry-docker-image_test.go
│ │ │ │ ├── artifact-registry-repository.go
│ │ │ │ ├── big-query-data-transfer-transfer-config.go
│ │ │ │ ├── big-query-data-transfer-transfer-config_test.go
│ │ │ │ ├── big-table-admin-app-profile.go
│ │ │ │ ├── big-table-admin-app-profile_test.go
│ │ │ │ ├── big-table-admin-backup.go
│ │ │ │ ├── big-table-admin-backup_test.go
│ │ │ │ ├── big-table-admin-cluster.go
│ │ │ │ ├── big-table-admin-cluster_test.go
│ │ │ │ ├── big-table-admin-instance.go
│ │ │ │ ├── big-table-admin-instance_test.go
│ │ │ │ ├── big-table-admin-table.go
│ │ │ │ ├── big-table-admin-table_test.go
│ │ │ │ ├── cloud-billing-billing-info.go
│ │ │ │ ├── cloud-billing-billing-info_test.go
│ │ │ │ ├── cloud-build-build.go
│ │ │ │ ├── cloud-build-build_test.go
│ │ │ │ ├── cloud-resource-manager-project.go
│ │ │ │ ├── cloud-resource-manager-project_test.go
│ │ │ │ ├── cloud-resource-manager-tag-key.go
│ │ │ │ ├── cloud-resource-manager-tag-key_test.go
│ │ │ │ ├── cloud-resource-manager-tag-value.go
│ │ │ │ ├── cloud-resource-manager-tag-value_test.go
│ │ │ │ ├── cloudfunctions-function.go
│ │ │ │ ├── cloudfunctions-function_test.go
│ │ │ │ ├── compute-accelerator-type.go
│ │ │ │ ├── compute-disk-type.go
│ │ │ │ ├── compute-external-vpn-gateway.go
│ │ │ │ ├── compute-external-vpn-gateway_test.go
│ │ │ │ ├── compute-firewall.go
│ │ │ │ ├── compute-firewall_test.go
│ │ │ │ ├── compute-global-address.go
│ │ │ │ ├── compute-global-address_test.go
│ │ │ │ ├── compute-global-forwarding-rule.go
│ │ │ │ ├── compute-global-forwarding-rule_test.go
│ │ │ │ ├── compute-http-health-check.go
│ │ │ │ ├── compute-http-health-check_test.go
│ │ │ │ ├── compute-instance-template.go
│ │ │ │ ├── compute-instance-template_test.go
│ │ │ │ ├── compute-license.go
│ │ │ │ ├── compute-network-endpoint-group.go
│ │ │ │ ├── compute-network-endpoint-group_test.go
│ │ │ │ ├── compute-network.go
│ │ │ │ ├── compute-network_test.go
│ │ │ │ ├── compute-project.go
│ │ │ │ ├── compute-project_test.go
│ │ │ │ ├── compute-public-delegated-prefix.go
│ │ │ │ ├── compute-public-delegated-prefix_test.go
│ │ │ │ ├── compute-region-commitment.go
│ │ │ │ ├── compute-region-commitment_test.go
│ │ │ │ ├── compute-resource-policy.go
│ │ │ │ ├── compute-route.go
│ │ │ │ ├── compute-route_test.go
│ │ │ │ ├── compute-router.go
│ │ │ │ ├── compute-router_test.go
│ │ │ │ ├── compute-ssl-certificate.go
│ │ │ │ ├── compute-ssl-certificate_test.go
│ │ │ │ ├── compute-ssl-policy.go
│ │ │ │ ├── compute-ssl-policy_test.go
│ │ │ │ ├── compute-storage-pool.go
│ │ │ │ ├── compute-subnetwork.go
│ │ │ │ ├── compute-subnetwork_test.go
│ │ │ │ ├── compute-target-http-proxy.go
│ │ │ │ ├── compute-target-http-proxy_test.go
│ │ │ │ ├── compute-target-https-proxy.go
│ │ │ │ ├── compute-target-https-proxy_test.go
│ │ │ │ ├── compute-target-pool.go
│ │ │ │ ├── compute-target-pool_test.go
│ │ │ │ ├── compute-url-map.go
│ │ │ │ ├── compute-url-map_test.go
│ │ │ │ ├── compute-vpn-gateway.go
│ │ │ │ ├── compute-vpn-gateway_test.go
│ │ │ │ ├── compute-vpn-tunnel.go
│ │ │ │ ├── compute-vpn-tunnel_test.go
│ │ │ │ ├── container-cluster.go
│ │ │ │ ├── container-cluster_test.go
│ │ │ │ ├── container-node-pool.go
│ │ │ │ ├── container-node-pool_test.go
│ │ │ │ ├── dataflow-job.go
│ │ │ │ ├── dataflow-job_test.go
│ │ │ │ ├── dataform-repository.go
│ │ │ │ ├── dataform-repository_test.go
│ │ │ │ ├── dataplex-aspect-type.go
│ │ │ │ ├── dataplex-aspect-type_test.go
│ │ │ │ ├── dataplex-data-scan.go
│ │ │ │ ├── dataplex-data-scan_test.go
│ │ │ │ ├── dataplex-entry-group.go
│ │ │ │ ├── dataplex-entry-group_test.go
│ │ │ │ ├── dataproc-auto-scaling-policy.go
│ │ │ │ ├── dataproc-auto-scaling-policy_test.go
│ │ │ │ ├── dataproc-cluster.go
│ │ │ │ ├── dataproc-cluster_test.go
│ │ │ │ ├── dns-managed-zone.go
│ │ │ │ ├── dns-managed-zone_test.go
│ │ │ │ ├── essential-contacts-contact.go
│ │ │ │ ├── essential-contacts-contact_test.go
│ │ │ │ ├── eventarc-trigger.go
│ │ │ │ ├── eventarc-trigger_test.go
│ │ │ │ ├── file-instance.go
│ │ │ │ ├── file-instance_test.go
│ │ │ │ ├── iam-role.go
│ │ │ │ ├── iam-role_test.go
│ │ │ │ ├── logging-bucket.go
│ │ │ │ ├── logging-bucket_test.go
│ │ │ │ ├── logging-link.go
│ │ │ │ ├── logging-link_test.go
│ │ │ │ ├── logging-saved-query.go
│ │ │ │ ├── logging-saved-query_test.go
│ │ │ │ ├── models.go
│ │ │ │ ├── monitoring-alert-policy.go
│ │ │ │ ├── monitoring-alert-policy_test.go
│ │ │ │ ├── monitoring-custom-dashboard.go
│ │ │ │ ├── monitoring-custom-dashboard_test.go
│ │ │ │ ├── monitoring-notification-channel.go
│ │ │ │ ├── monitoring-notification-channel_test.go
│ │ │ │ ├── orgpolicy-policy.go
│ │ │ │ ├── orgpolicy-policy_test.go
│ │ │ │ ├── pubsub-subscription.go
│ │ │ │ ├── pubsub-subscription_test.go
│ │ │ │ ├── pubsub-topic.go
│ │ │ │ ├── pubsub-topic_test.go
│ │ │ │ ├── redis-instance.go
│ │ │ │ ├── redis-instance_test.go
│ │ │ │ ├── run-revision.go
│ │ │ │ ├── run-revision_test.go
│ │ │ │ ├── run-service.go
│ │ │ │ ├── run-service_test.go
│ │ │ │ ├── run-worker-pool.go
│ │ │ │ ├── secret-manager-secret.go
│ │ │ │ ├── secret-manager-secret_test.go
│ │ │ │ ├── security-center-management-security-center-service.go
│ │ │ │ ├── security-center-management-security-center-service_test.go
│ │ │ │ ├── service-directory-endpoint.go
│ │ │ │ ├── service-directory-endpoint_test.go
│ │ │ │ ├── service-directory-service.go
│ │ │ │ ├── service-usage-service.go
│ │ │ │ ├── service-usage-service_test.go
│ │ │ │ ├── spanner-backup.go
│ │ │ │ ├── spanner-database.go
│ │ │ │ ├── spanner-database_test.go
│ │ │ │ ├── spanner-instance-config.go
│ │ │ │ ├── spanner-instance.go
│ │ │ │ ├── spanner-instance_test.go
│ │ │ │ ├── sql-admin-backup-run.go
│ │ │ │ ├── sql-admin-backup-run_test.go
│ │ │ │ ├── sql-admin-backup.go
│ │ │ │ ├── sql-admin-backup_test.go
│ │ │ │ ├── sql-admin-instance.go
│ │ │ │ ├── sql-admin-instance_test.go
│ │ │ │ ├── storage-bucket.go
│ │ │ │ ├── storage-bucket_test.go
│ │ │ │ ├── storage-transfer-transfer-job.go
│ │ │ │ └── storage-transfer-transfer-job_test.go
│ │ │ ├── adapters.go
│ │ │ ├── adapters_test.go
│ │ │ ├── ai-tools/
│ │ │ │ ├── README.md
│ │ │ │ ├── build.sh
│ │ │ │ ├── generate-adapter-ticket-cmd/
│ │ │ │ │ └── main.go
│ │ │ │ └── generate-test-ticket-cmd/
│ │ │ │ └── main.go
│ │ │ ├── errors.go
│ │ │ ├── shared.go
│ │ │ ├── shared_test.go
│ │ │ └── testing.go
│ │ ├── integration-tests/
│ │ │ ├── README.md
│ │ │ ├── big-query-model_test.go
│ │ │ ├── compute-address_test.go
│ │ │ ├── compute-autoscaler_test.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-forwarding-rule_test.go
│ │ │ ├── compute-healthcheck_test.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-instance-group-manager_test.go
│ │ │ ├── compute-instance-group_test.go
│ │ │ ├── compute-instance_test.go
│ │ │ ├── compute-instant-snapshot_test.go
│ │ │ ├── compute-machine-image_test.go
│ │ │ ├── compute-network_test.go
│ │ │ ├── compute-node-group_test.go
│ │ │ ├── compute-reservation_test.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-subnetwork_test.go
│ │ │ ├── computer-instance-template_test.go
│ │ │ ├── kms_vs_asset_inventory_test.go
│ │ │ ├── main_test.go
│ │ │ ├── network-tags_test.go
│ │ │ ├── service-account-impersonation_test.go
│ │ │ ├── spanner-database_test.go
│ │ │ └── spanner-instance_test.go
│ │ ├── main.go
│ │ ├── manual/
│ │ │ ├── README.md
│ │ │ ├── adapters.go
│ │ │ ├── big-query-dataset.go
│ │ │ ├── big-query-dataset_test.go
│ │ │ ├── big-query-model.go
│ │ │ ├── big-query-model_test.go
│ │ │ ├── big-query-routine.go
│ │ │ ├── big-query-routine_test.go
│ │ │ ├── big-query-table.go
│ │ │ ├── big-query-table_test.go
│ │ │ ├── certificate-manager-certificate.go
│ │ │ ├── certificate-manager-certificate_test.go
│ │ │ ├── cloud-kms-crypto-key-version.go
│ │ │ ├── cloud-kms-crypto-key-version_test.go
│ │ │ ├── cloud-kms-crypto-key.go
│ │ │ ├── cloud-kms-crypto-key_test.go
│ │ │ ├── cloud-kms-key-ring.go
│ │ │ ├── cloud-kms-key-ring_test.go
│ │ │ ├── compute-address.go
│ │ │ ├── compute-address_test.go
│ │ │ ├── compute-autoscaler.go
│ │ │ ├── compute-autoscaler_test.go
│ │ │ ├── compute-backend-service.go
│ │ │ ├── compute-backend-service_test.go
│ │ │ ├── compute-disk.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-forwarding-rule.go
│ │ │ ├── compute-forwarding-rule_test.go
│ │ │ ├── compute-healthcheck.go
│ │ │ ├── compute-healthcheck_test.go
│ │ │ ├── compute-image.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-instance-group-manager-shared.go
│ │ │ ├── compute-instance-group-manager.go
│ │ │ ├── compute-instance-group-manager_test.go
│ │ │ ├── compute-instance-group.go
│ │ │ ├── compute-instance-group_test.go
│ │ │ ├── compute-instance.go
│ │ │ ├── compute-instance_test.go
│ │ │ ├── compute-instant-snapshot.go
│ │ │ ├── compute-instant-snapshot_test.go
│ │ │ ├── compute-machine-image.go
│ │ │ ├── compute-machine-image_test.go
│ │ │ ├── compute-node-group.go
│ │ │ ├── compute-node-group_test.go
│ │ │ ├── compute-node-template.go
│ │ │ ├── compute-node-template_test.go
│ │ │ ├── compute-region-instance-group-manager.go
│ │ │ ├── compute-region-instance-group-manager_test.go
│ │ │ ├── compute-reservation.go
│ │ │ ├── compute-reservation_test.go
│ │ │ ├── compute-security-policy.go
│ │ │ ├── compute-security-policy_test.go
│ │ │ ├── compute-snapshot.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── iam-service-account-key.go
│ │ │ ├── iam-service-account-key_test.go
│ │ │ ├── iam-service-account.go
│ │ │ ├── iam-service-account_test.go
│ │ │ ├── logging-sink.go
│ │ │ ├── logging-sink_test.go
│ │ │ ├── storage-bucket-iam-policy.go
│ │ │ └── storage-bucket-iam-policy_test.go
│ │ ├── proc/
│ │ │ ├── proc.go
│ │ │ └── proc_test.go
│ │ ├── setup/
│ │ │ ├── README.md
│ │ │ ├── scripts/
│ │ │ │ ├── overmind-gcp-roles.sh
│ │ │ │ ├── overmind-gcp-source-permission-check.sh
│ │ │ │ ├── overmind-gcp-source-setup-impersonation.sh
│ │ │ │ └── overmind-gcp-source-setup.sh
│ │ │ └── tutorial.md
│ │ └── shared/
│ │ ├── adapter-meta.go
│ │ ├── adapter-meta_test.go
│ │ ├── base.go
│ │ ├── big-query-clients.go
│ │ ├── certificate-manager-clients.go
│ │ ├── compute-clients.go
│ │ ├── cross_project_linking_test.go
│ │ ├── errors.go
│ │ ├── gcp-http-client.go
│ │ ├── iam-clients.go
│ │ ├── init_test.go
│ │ ├── item-types.go
│ │ ├── kms-asset-loader.go
│ │ ├── link-rules.go
│ │ ├── linker.go
│ │ ├── linker_test.go
│ │ ├── location_info.go
│ │ ├── location_info_test.go
│ │ ├── logging-clients.go
│ │ ├── manual-adapter-links.go
│ │ ├── manual-adapter-links_test.go
│ │ ├── mocks/
│ │ │ ├── mock_big_query_dataset_client.go
│ │ │ ├── mock_certificate_manager_certificate_client.go
│ │ │ ├── mock_compute_instance_client.go
│ │ │ ├── mock_iam_clients.go
│ │ │ └── mock_logging_config_client.go
│ │ ├── models.go
│ │ ├── network-security-clients.go
│ │ ├── predefined-roles.go
│ │ ├── storage-iam.go
│ │ ├── terraform-mappings.go
│ │ ├── terraform-mappings_test.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── shared/
│ │ ├── base.go
│ │ ├── shared.go
│ │ ├── testing.go
│ │ ├── util.go
│ │ └── util_test.go
│ ├── snapshot/
│ │ ├── README.md
│ │ ├── adapters/
│ │ │ ├── adapter.go
│ │ │ ├── adapter_test.go
│ │ │ ├── catalog.go
│ │ │ ├── index.go
│ │ │ ├── index_test.go
│ │ │ ├── loader.go
│ │ │ ├── loader_test.go
│ │ │ └── main.go
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── cmd/
│ │ │ └── root.go
│ │ └── main.go
│ ├── stdlib/
│ │ ├── items.go
│ │ └── shared/
│ │ └── models.go
│ ├── transformer.go
│ └── transformer_test.go
├── stdlib-source/
│ ├── adapters/
│ │ ├── certificate.go
│ │ ├── certificate_test.go
│ │ ├── dns.go
│ │ ├── dns_test.go
│ │ ├── http.go
│ │ ├── http_test.go
│ │ ├── ip.go
│ │ ├── ip_cache.go
│ │ ├── ip_cache_test.go
│ │ ├── ip_test.go
│ │ ├── main.go
│ │ ├── main_test.go
│ │ ├── rdap-asn.go
│ │ ├── rdap-asn_test.go
│ │ ├── rdap-domain.go
│ │ ├── rdap-domain_test.go
│ │ ├── rdap-entity.go
│ │ ├── rdap-entity_test.go
│ │ ├── rdap-ip-network.go
│ │ ├── rdap-ip-network_test.go
│ │ ├── rdap-nameserver.go
│ │ ├── rdap-nameserver_test.go
│ │ └── test/
│ │ ├── data.go
│ │ ├── testdog.go
│ │ ├── testfood.go
│ │ ├── testgroup.go
│ │ ├── testhobby.go
│ │ ├── testlocation.go
│ │ ├── testperson.go
│ │ └── testregion.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ └── main.go
└── tfutils/
├── aws_config.go
├── aws_config_test.go
├── azure_config.go
├── azure_config_test.go
├── gcp_config.go
├── gcp_config_test.go
├── plan.go
├── plan_mapper.go
├── plan_mapper_test.go
├── repo_to_scope.go
├── repo_to_scope_test.go
└── testdata/
├── binary-plan.tfplan
├── config_from_provider/
│ ├── ca-bundle.crt
│ └── test.tf
├── invalid_vars.tfvars
├── plan.json
├── providers.tf
├── state.json
├── subfolder/
│ └── more_providers.tf
├── test_vars.tfvars
└── tfvars.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/e2eapply.tape
================================================
Output e2e/apply.mp4
Set Width 1920
Set Height 1080
Set FontSize 12
Set CursorBlink false
Hide
Type "export PATH=$PWD:$PATH"
Enter
Type "clear"
Enter
Show
Type@1ms "overmind terraform apply -- tfplan"
Enter
Sleep 70
Screenshot e2e/apply.png
================================================
FILE: .github/e2eplan.tape
================================================
Output e2e/plan.mp4
Set Width 1920
Set Height 1080
Set FontSize 12
Set CursorBlink false
Hide
Type "export PATH=$PWD:$PATH"
Enter
Type "clear"
Enter
Show
Type@1ms "overmind terraform plan -- -out tfplan"
Enter
Sleep 2
Enter
Sleep 80
Screenshot e2e/plan.png
================================================
FILE: .github/workflows/docker-release.yml
================================================
name: Build and Release Docker Container
on:
push:
tags:
- 'v*'
jobs:
build-and-push:
name: Build and Push CLI Container
runs-on: depot-ubuntu-22.04
permissions:
contents: write
packages: write
id-token: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Extract version from tag
id: extract_version
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version: $VERSION"
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: depot/use-action@v1.3.1
with:
project: xnsnw3m20t
- name: Build and push container
uses: depot/build-push-action@v1.17.0
id: build
with:
project: xnsnw3m20t
context: .
file: ./Dockerfile
sbom: true
platforms: linux/amd64,linux/arm64
push: true
tags: |
ghcr.io/overmindtech/cli:latest
ghcr.io/overmindtech/cli:${{ steps.extract_version.outputs.version }}
================================================
FILE: .github/workflows/finalize-copybara-sync.yml
================================================
name: Finalize Copybara Sync
on:
push:
branches:
- 'copybara/v*'
# Cancel any in-progress runs when a new commit is pushed to the same branch
# This ensures only the latest commit is processed when Copybara sends many commits quickly
concurrency:
group: copybara-sync-${{ github.ref }}
cancel-in-progress: true
jobs:
finalize:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Extract version from branch name
id: version
run: |
# Extract v1.2.3 from copybara/v1.2.3
VERSION=$(echo "$GITHUB_REF" | sed 's|refs/heads/copybara/||')
echo "version=$VERSION" >> $GITHUB_OUTPUT
- uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Configure Git
run: |
git config user.name "GitHub Actions Bot"
git config user.email "actions@github.com"
- name: Run go mod tidy
run: go mod tidy
- name: Commit and push go mod tidy changes
env:
HEAD_BRANCH: ${{ github.ref_name }}
run: |
if ! git diff --quiet go.mod go.sum; then
git add go.mod go.sum
git commit -m "Run go mod tidy"
git push origin "$HEAD_BRANCH"
else
echo "No changes from go mod tidy"
fi
- name: Extract original commit author
id: author
run: |
# Get the GitHub username from the most recent non-bot commit
# Copybara preserves the original author via pass_thru
AUTHOR_EMAIL=$(git log -1 --format='%ae' --author='^(?!.*actions@github.com)' --perl-regexp 2>/dev/null || git log -1 --format='%ae')
AUTHOR_NAME=$(git log -1 --format='%an' --author='^(?!.*actions@github.com)' --perl-regexp 2>/dev/null || git log -1 --format='%an')
echo "email=$AUTHOR_EMAIL" >> $GITHUB_OUTPUT
echo "name=$AUTHOR_NAME" >> $GITHUB_OUTPUT
# Try to find GitHub username from email (works for users with public email)
# Format: username@users.noreply.github.com or regular email
if [[ "$AUTHOR_EMAIL" =~ ^([^@]+)@users\.noreply\.github\.com$ ]]; then
# Extract username from noreply email (handles 12345678+username format)
GITHUB_USER=$(echo "${BASH_REMATCH[1]}" | sed 's/^[0-9]*+//')
echo "github_user=$GITHUB_USER" >> $GITHUB_OUTPUT
else
echo "github_user=" >> $GITHUB_OUTPUT
fi
- name: Create Pull Request
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.version.outputs.version }}
AUTHOR_NAME: ${{ steps.author.outputs.name }}
AUTHOR_EMAIL: ${{ steps.author.outputs.email }}
GITHUB_USER: ${{ steps.author.outputs.github_user }}
HEAD_BRANCH: ${{ github.ref_name }}
run: |
# Build PR body
PR_BODY="## Copybara Sync - Release ${VERSION}
This PR was automatically created by Copybara, syncing changes from the [overmindtech/workspace](https://github.com/overmindtech/workspace) monorepo.
**Original author:** ${AUTHOR_NAME} (${AUTHOR_EMAIL})
### What happens when this PR is merged?
1. The \`tag-on-merge\` workflow will automatically create the \`${VERSION}\` tag on main
2. This tag will trigger the release workflow, which will:
- Run tests
- Build and publish release binaries via GoReleaser
- Upload packages to Cloudsmith
### Review Checklist
- [ ] Changes look correct and match the expected monorepo sync
- [ ] Tests pass (see CI checks below)
"
# Create the PR
PR_URL=$(gh pr create \
--base main \
--head "$HEAD_BRANCH" \
--title "Release ${VERSION}" \
--body "$PR_BODY")
echo "Created PR: $PR_URL"
# Try to assign reviewer - prefer original author, fall back to Engineering team
if [ -n "$GITHUB_USER" ]; then
echo "Requesting review from original author: $GITHUB_USER"
gh pr edit "$PR_URL" --add-reviewer "$GITHUB_USER" || true
fi
# Always add Engineering team as reviewer
echo "Requesting review from Engineering team"
gh pr edit "$PR_URL" --add-reviewer "overmindtech/Engineering" || true
================================================
FILE: .github/workflows/release.yml
================================================
name: goreleaser-release
on:
push:
tags:
- 'v*'
jobs:
test:
name: Run Tests
runs-on: depot-ubuntu-22.04-4
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 1.x
check-latest: true
cache: true
- name: Go Test
run: |
go run main.go --version
go test -race -v -timeout 5m github.com/overmindtech/cli github.com/overmindtech/cli/tfutils
# Actually release the binaries including signing them
release:
runs-on: depot-ubuntu-22.04-32
if: ${{ github.event_name != 'pull_request' }}
needs: test
permissions:
contents: write
packages: write
# id-token + attestations are required for Sigstore OIDC + the GitHub
# Artifact Attestations API used by attest-build-provenance.
id-token: write
attestations: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 1.x
check-latest: true
cache: true
# Syft is the SBOM generator GoReleaser shells out to (see the `sboms:`
# block in .goreleaser.yaml). It is not preinstalled on GitHub-hosted
# runners, so download it before goreleaser runs.
- name: Install Syft
uses: anchore/sbom-action/download-syft@v0.24.0
- name: Run GoReleaser (publish)
uses: goreleaser/goreleaser-action@v7
with:
# renovate: datasource=github-releases depName=goreleaser/goreleaser
version: "v2.15.4"
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Used to create PRs on the Winget repo
WINGET_TOKEN: ${{ secrets.WINGET_TOKEN }}
# Generate SLSA Level 3 build provenance attestations for the release
# archives and the checksums file. Each attestation is signed via Sigstore
# using the workflow's GitHub OIDC identity, recorded in the public Rekor
# transparency log, and surfaced on the repo's Attestations tab. Customers
# verify with `gh attestation verify --repo overmindtech/cli` or
# `cosign verify-blob-attestation`. See
# docs.overmind.tech/docs/cli/verifying-releases.md.
- name: Attest build provenance for release archives
uses: actions/attest-build-provenance@v3
with:
subject-path: |
dist/overmind_cli_*.tar.gz
dist/overmind_cli_*.zip
dist/checksums.txt
- name: Install cloudsmith CLI
run: |
pip install --upgrade cloudsmith-cli
- name: Upload packages to cloudsmith
run: |
for i in dist/*.apk; do
cloudsmith push alpine overmind/tools/alpine/any-version $i
done
for i in dist/*.deb; do
cloudsmith push deb overmind/tools/any-distro/any-version $i
done
for i in dist/*.rpm; do
cloudsmith push rpm overmind/tools/any-distro/any-version $i
done
env:
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
================================================
FILE: .github/workflows/tag-on-merge.yml
================================================
name: Tag Release on Merge
on:
pull_request:
types:
- closed
branches:
- main
jobs:
tag-release:
# Only run if the PR was merged (not just closed) and came from a copybara branch
if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'copybara/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Extract version from branch name
id: version
env:
BRANCH: ${{ github.event.pull_request.head.ref }}
run: |
# Extract v1.2.3 from copybara/v1.2.3
VERSION=$(echo "$BRANCH" | sed 's|copybara/||')
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- uses: actions/checkout@v6
with:
ref: main
fetch-depth: 0
token: ${{ secrets.RELEASE_PAT }}
- name: Configure Git
run: |
git config user.name "GitHub Actions Bot"
git config user.email "actions@github.com"
- name: Create and push tag
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
echo "Creating tag: $VERSION"
git tag "$VERSION"
git push origin "$VERSION"
echo "Successfully pushed tag $VERSION"
- name: Delete copybara branch
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: ${{ github.event.pull_request.head.ref }}
run: |
echo "Deleting branch: $BRANCH"
git push origin --delete "$BRANCH" || echo "Branch may have already been deleted"
================================================
FILE: .github/workflows/tests.yml
================================================
name: Run Tests
on: push
jobs:
test:
name: Run Tests
runs-on: depot-ubuntu-24.04-4
concurrency:
group: cli-tests-${{ github.ref }}
cancel-in-progress: true # we only need test results from the latest commit
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 1.x
check-latest: true
cache: true
- name: Go Test
run: |
go run main.go --version
# Only run the tests that are relevant to the release. All other tests have already run internally.
go test -race -v -timeout 5m github.com/overmindtech/cli github.com/overmindtech/cli/tfutils
================================================
FILE: .gitignore
================================================
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
gon
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work
dist/
output
.DS_Store
.terraform
overmind.plan
terraform.tfstate
terraform.tfstate.backup
/tmp/
/node_modules
__debug_bin*
# ignore local terraform files
tfplan.json*
================================================
FILE: .goreleaser.yaml
================================================
# Make sure to check the documentation at https://goreleaser.com
version: 2
builds:
- binary: overmind
id: overmind
env:
- CGO_ENABLED=0
goos:
- linux
- windows
ldflags:
- -s -w -X github.com/overmindtech/cli/go/tracing.version={{.Version}}
- binary: overmind
id: overmind-macos
env:
- CGO_ENABLED=0
goos:
- darwin
ldflags:
- -s -w -X github.com/overmindtech/cli/go/tracing.version={{.Version}}
# For now we are going to disable signing MacOS packages. This works on Dylan's
# person laptop, but we haven't worked out a way to get this set up in a github
# action yet.
# signs:
# - id: amd64
# signature: "overmind-cli-amd64.dmg"
# ids:
# - overmind-macos # here we filter the macos only build id
# cmd: ./gon
# args:
# - gon-amd64.json
# artifacts: all
# - id: arm64
# signature: "overmind-cli-arm64.dmg"
# ids:
# - overmind-macos # here we filter the macos only build id
# cmd: ./gon
# args:
# - gon-arm64.json
# artifacts: all
archives:
- formats: [tar.gz]
# this name template makes the OS and Arch compatible with the results of uname.
name_template: >-
{{ .Binary }}_
{{- .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end }}
# use zip for windows archives
format_overrides:
- goos: windows
formats: [zip]
files:
- LICENSE
- README.md
nfpms:
- id: nfpm
package_name: overmind-cli
file_name_template: "{{ .ConventionalFileName }}"
# Build IDs for the builds you want to create NFPM packages for.
# Defaults empty, which means no filtering.
ids:
- overmind
vendor: Overmind
homepage: https://overmind.tech/
maintainer: Overmind <engineering@overmind.tech>
description: |-
Predict what will happen for any given change
license: Apache 2.0
formats:
- apk
- deb
- rpm
- archlinux
bindir: /usr/bin
section: default
priority: extra
winget:
- name: OvermindCLI
publisher: Overmind
short_description: "Predict what will happen for any given change"
license: "FSL-1.1-Apache-2.0"
publisher_url: https://overmind.tech/
publisher_support_url: "https://github.com/overmindtech/cli/issues/new"
package_identifier: Overmind.OvermindCLI
homepage: "https://overmind.tech/"
description: "Overmind calculates the impact of Terraform changes in your infrastructure, including the blast radius and likely risks."
license_url: "https://github.com/overmindtech/cli?tab=License-1-ov-file#readme"
copyright: "Copyright 2024 Overmind Technology Inc."
# Setting this will prevent goreleaser to actually try to commit the updated
# package - instead, it will be stored on the dist directory only,
# leaving the responsibility of publishing it to the user.
#
# If set to auto, the release will not be uploaded to the repository
# in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1
skip_upload: auto
release_notes_url: "https://github.com/overmindtech/cli/releases/tag/{{ .Tag }}"
# Repository to push the generated files to.
repository:
owner: overmindtech
name: winget-pkgs
branch: "{{.ProjectName}}-{{.Version}}"
# Optionally a token can be provided, if it differs from the token
# provided to GoReleaser
token: "{{ .Env.WINGET_TOKEN }}"
# Sets up pull request creation instead of just pushing to the given branch.
# Make sure the 'branch' property is different from base before enabling
# it.
#
# Since: v1.17
pull_request:
enabled: true
draft: false
# Base can also be another repository, in which case the owner and name
# above will be used as HEAD, allowing cross-repository pull requests.
#
# Since: v1.19
base:
owner: microsoft
name: winget-pkgs
branch: master
checksum:
name_template: "checksums.txt"
# Generate one SPDX-format SBOM per release archive using Syft (the GoReleaser
# default). Each SBOM is uploaded as a sibling release asset. See
# docs.overmind.tech/docs/cli/verifying-releases.md for the customer-facing
# verification commands.
sboms:
- id: archive-sbom
artifacts: archive
documents:
- "{{ .ArtifactName }}.spdx.json"
snapshot:
version_template: "{{ if .Version }}{{ $cleanVersion := replace .Version \"kargo/\" \"\" }}{{ incpatch $cleanVersion }}{{ else }}0.0.1{{ end }}-next"
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
# The lines beneath this are called `modelines`. See `:help modeline`
# Feel free to remove those if you don't want/use them.
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
================================================
FILE: .terraform.lock.hcl
================================================
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
provider "registry.terraform.io/hashicorp/aws" {
version = "6.41.0"
constraints = ">= 4.56.0, >= 6.39.0"
hashes = [
"h1:0WhwadQsRyMh7+ULLH6RBEr6IyaQZ5ep6l/GGGwLfYg=",
"h1:1FXO2hJl4cpcT7FAfI5ArdtU1fJL8PWEHPF7x/o6BkY=",
"h1:3f4f8yZBP/wdxgresI5RZSZvN82SzjDfQI4YVmzC2Ts=",
"h1:JIWQGFFHRiAARjCFZYckU+q4cGtsspjpQ+88qMEErLk=",
"h1:P5G2OYd40P7QUS0dM2uw3WJ0y+VzOoIO7RvRRqA62D0=",
"h1:Xf/kQ9A+CT8ZpCKfL8gDkId/JnA6Q+Y0KxLVALlGQuY=",
"h1:XhGMmUFwwi5L5QQ+lAvRsSsXgVSV5RgJr49Bd2aZgEk=",
"h1:ZlRFSpwbPosZj6ZER2OoxGQEbFI0PkC9GoAq4VpYvT0=",
"h1:d1iTaanE9Q9qZE83hf6g3Kt+hFCExLXOYmzyo0KrQfY=",
"h1:dc1ChE3N91+iuj8xjS031sLXnjEL92qtE3ZUVOk6zoI=",
"h1:gk7KrN9LYvncV2VoWlfumFLEaWUwDx6jpaXovzi7c7k=",
"h1:gmD0jxj+nOAIg0GGzmxKpFKd7Xnib3niuvKGPuV36g4=",
"h1:iFwjmQtc0tIkSpB1KL+LcqLfuR6KYIGs49ea+LdVXXQ=",
"h1:wuS3cwipVBJH0AP11NwtGKAQjb6OZVmTiBq3+/9ojTA=",
"zh:01835476adda6d93095e37fdf782f14e6709f6922dc62e88994f9684627deb69",
"zh:0b9bc5eda9def53df19e1a37562dcb67c1fba8452803e1b5601e75653c986255",
"zh:196f81d97ea2951d2c6667709445d7c36b5fd8603890c774495806b4da0743aa",
"zh:1ba36118b0146e5c3603020509b34d09e693db50ec29f9be5badc9f2a4fd95b8",
"zh:4253c2f6066ce279e5ce48849c78fc193f222dc42a929e6876b9563ed5c23fcf",
"zh:457ed8609680338dbcb9809e263638a530c06ba43208af9e660803133dc5e1e6",
"zh:4e8de5f3fcc3e3f41b6703ad4c0fa62175d0c29afcf56ac82eb16c604bb6dafa",
"zh:583ae622cfe4633fabca071ded738e9ef3398d9e9916cb26350aad28068462c5",
"zh:5b8bf11070c13e21a0fef05713a25be0392c7d064bd2199c2f99939cc345e8c5",
"zh:6aa7ae41d4fff4e95cedcbeaa143b2af9ad3e3a4b40208801b701d77a738b2c7",
"zh:8143670bca48af3b873b0db83443dbdcb868442f1e789ffba356d6adf4dbd7b9",
"zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425",
"zh:c22951cf0a4b169607ea066717dd499f46221af035903497b97f24590fb79d2c",
"zh:dbd9cd975206a41a9c12006d3a30c77b95c0e660fcba2cc3bb0ee5779431c107",
"zh:e6ea2e0f142001b7f2229e8d39eb7f8037084723861be9d53478005196cd7f9e",
]
}
provider "registry.terraform.io/hashicorp/google" {
version = "7.28.0"
constraints = ">= 4.0.0"
hashes = [
"h1:M3DrxwI8FiHJpvq3yVX2QWZeqv5dyLt3nQ1YBm/TNXA=",
"zh:078c16b9c5e9067e72070367846976b58f906d8efab6fc4fc1325661717dc9cc",
"zh:08b839014b428233a3a83d15045e7559b07fc035c7f73cc1ee2694c50c4dea54",
"zh:0c76ea69f75633bdfc67a0cd6ea510332c0cb0f2d4968b8a070e546fb47e444e",
"zh:3a308492ad4c153583f7b8ecc3c80bf0bbc15a32c62b5b3794efb27db01ff26b",
"zh:6754f51373994470f78937856982b0a39648ac302713d07205d320a13ad41d82",
"zh:79d387214f55df16c795f11988a0285a4bfa846c447faa85008b953b77081eb1",
"zh:8de432482d77d1a1077b2dc3db764b8ba6d1b07a4b991a07c960855adc0b031b",
"zh:900daa2435de1928a9868aa4c17d8b7b109ab363c97f7fe274466193af1412b0",
"zh:96c25183a7f13b3de9a5631aa2a13ed1a4285b8393df90c2380c2fe74f350ab5",
"zh:971121626be01245acd9a4520a63e1405e4f528d3c83f39a28f8caaeac235b45",
"zh:e90d5e7d7bf47c8cf5bbf2e5d0bf855ed10350ad3584795a6911f85fdb5c0c3c",
"zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
]
}
provider "registry.terraform.io/hashicorp/random" {
version = "3.8.1"
constraints = ">= 3.0.0"
hashes = [
"h1:Eexl06+6J+s75uD46+WnZtpJZYRVUMB0AiuPBifK6Jc=",
"zh:08dd03b918c7b55713026037c5400c48af5b9f468f483463321bd18e17b907b4",
"zh:0eee654a5542dc1d41920bbf2419032d6f0d5625b03bd81339e5b33394a3e0ae",
"zh:229665ddf060aa0ed315597908483eee5b818a17d09b6417a0f52fd9405c4f57",
"zh:2469d2e48f28076254a2a3fc327f184914566d9e40c5780b8d96ebf7205f8bc0",
"zh:37d7eb334d9561f335e748280f5535a384a88675af9a9eac439d4cfd663bcb66",
"zh:741101426a2f2c52dee37122f0f4a2f2d6af6d852cb1db634480a86398fa3511",
"zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
"zh:a902473f08ef8df62cfe6116bd6c157070a93f66622384300de235a533e9d4a9",
"zh:b85c511a23e57a2147355932b3b6dce2a11e856b941165793a0c3d7578d94d05",
"zh:c5172226d18eaac95b1daac80172287b69d4ce32750c82ad77fa0768be4ea4b8",
"zh:dab4434dba34aad569b0bc243c2d3f3ff86dd7740def373f2a49816bd2ff819b",
"zh:f49fd62aa8c5525a5c17abd51e27ca5e213881d58882fd42fec4a545b53c9699",
]
}
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to the CLI
Just open a PR and we'll review it.
================================================
FILE: Dockerfile
================================================
FROM ghcr.io/opentofu/opentofu:minimal AS tofu
FROM alpine:3.23.4
# Copy the tofu binary from the minimal image
COPY --from=tofu /usr/local/bin/tofu /usr/local/bin/tofu
# Add the Overmind public key directly
ADD https://dl.cloudsmith.io/public/overmind/tools/rsa.7B6E65C2058FDB78.key \
/etc/apk/keys/tools@overmind-7B6E65C2058FDB78.rsa.pub
# Add repository config
ADD https://dl.cloudsmith.io/public/overmind/tools/config.alpine.txt?distro=alpine&codename=v3.8 \
/tmp/config.alpine.txt
RUN cat /tmp/config.alpine.txt >> /etc/apk/repositories \
&& rm /tmp/config.alpine.txt
RUN apk update
RUN apk add --no-cache overmind-cli
================================================
FILE: LICENSE
================================================
# Functional Source License, Version 1.1, Apache 2.0 Future License
## Abbreviation
FSL-1.1-Apache-2.0
## Notice
Copyright 2024 Overmind Technology Inc.
## Terms and Conditions
### Licensor ("We")
The party offering the Software under these Terms and Conditions.
### The Software
The "Software" is each version of the software that we make available under
these Terms and Conditions, as indicated by our inclusion of these Terms and
Conditions with the Software.
### License Grant
Subject to your compliance with this License Grant and the Patents,
Redistribution and Trademark clauses below, we hereby grant you the right to
use, copy, modify, create derivative works, publicly perform, publicly display
and redistribute the Software for any Permitted Purpose identified below.
### Permitted Purpose
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
means making the Software available to others in a commercial product or
service that:
1. substitutes for the Software;
2. substitutes for any other product or service we offer using the Software
that exists as of the date we make the Software available; or
3. offers the same or substantially similar functionality as the Software.
Permitted Purposes specifically include using the Software:
1. for your internal use and access;
2. for non-commercial education;
3. for non-commercial research; and
4. in connection with professional services that you provide to a licensee
using the Software in accordance with these Terms and Conditions.
### Patents
To the extent your use for a Permitted Purpose would necessarily infringe our
patents, the license grant above includes a license under our patents. If you
make a claim against any party that the Software infringes or contributes to
the infringement of any patent, then your patent license to the Software ends
immediately.
### Redistribution
The Terms and Conditions apply to all copies, modifications and derivatives of
the Software.
If you redistribute any copies, modifications or derivatives of the Software,
you must include a copy of or a link to these Terms and Conditions and not
remove any copyright notices provided in or with the Software.
### Disclaimer
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
### Trademarks
Except for displaying the License Details and identifying us as the origin of
the Software, you have no right under these Terms and Conditions to use our
trademarks, trade names, service marks or product names.
## Grant of Future License
We hereby irrevocably grant you an additional license to use the Software under
the Apache License, Version 2.0 that is effective on the second anniversary of
the date we make the Software available. On or after that date, you may use the
Software under the Apache License, Version 2.0, in which case the following
will apply:
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
================================================
FILE: README.md
================================================
<p align="center">
<picture width="120px" align="center">
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.prod.website-files.com/6241e92445c21f9c1245a940/69047fa84e22dce67b16f483_logo.png">
<img alt="Overmind" src="https://cdn.prod.website-files.com/6241e92445c21f9c1245a940/69047fa84e22dce67b16f483_logo.png" width="120px" align="center">
</picture>
<h1 align="center">Overmind CLI</h1>
<p align="center">
<a href="https://discord.com/invite/5UKsqAkPWG" rel="nofollow"><img src="https://img.shields.io/discord/1088753599951151154?label=Discord&logo=discord&logoColor=white" alt="Discord Server"></a>
</p>
<p align="center">
<a href="https://www.youtube.com/watch?v=cr4Q0oLaANk">🎥 Watch a demo</a> | <a href="https://docs.overmind.tech">📖 Docs</a> | <a href="https://app.overmind.tech/api/auth/signup">🚀 Sign up</a> | <a href="https://www.linkedin.com/company/overmindtech/">🙌 Follow us</a>
</p>
# What is Overmind?
Overmind is a **tribal knowledge database** that empowers your team to manage infrastructure confidently, even without extensive experience.
### Signs your team needs Overmind
- **Blocked Experts & Slow Onboarding**
- Expert team members spend too much time on approvals, reducing overall productivity.
- Newer staff face a steep learning curve, delaying their effectiveness.
- **Limited Dependency Visibility**
- Tools like Terraform show intended changes but don't reveal underlying dependencies.
- Difficulty in assessing whether changes will disrupt existing applications.
- **Complex Outage Troubleshooting**
- Pinpointing issues during outages is challenging due to hidden dependencies.
- Outages often result from intricate, unforeseen relationships rather than simple cause-and-effect.
# Quick Start
Install the Overmind CLI using brew:
```shell
brew install overmindtech/overmind/overmind-cli
```
Launch the assistant and explore your newly configured AWS source:
```shell
overmind explore
```
Run a terraform plan:
```shell
overmind terraform plan
```
.gif>)
<details>
<summary>Install on other platforms</summary>
## Prerequisites
- Terraform environment set up
- Access to all required credentials
- Ability to install and run the Overmind CLI
## Installation
### MacOS
To install on Mac with homebrew use:
```shell
brew install overmindtech/overmind/overmind-cli
```
### Windows
Install using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/):
```shell
winget install Overmind.OvermindCLI
```
Or manually download the [latest release](https://github.com/overmindtech/cli/releases/latest), extract `overmind.exe`, and add to your `PATH`
### Ubuntu / Debian
Set up the repository automatically:
```shell
curl -1sLf \
'https://dl.cloudsmith.io/public/overmind/tools/setup.deb.sh' \
| sudo -E bash
```
Or set it up manually
```shell
# NOTE: For Debian Stretch, Ubuntu 16.04 and later
keyring_location=/usr/share/keyrings/overmind-tools-archive-keyring.gpg
# NOTE: For Debian Jessie, Ubuntu 15.10 and earlier
keyring_location=/etc/apt/trusted.gpg.d/overmind-tools.gpg
# Capture the codename
codename=$(lsb_release -cs)
apt-get install -y debian-keyring # debian only
apt-get install -y debian-archive-keyring # debian only
apt-get install -y apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/overmind/tools/gpg.BC5CDEFB4E37A1B3.key' | gpg --dearmor >> ${keyring_location}
curl -1sLf 'https://dl.cloudsmith.io/public/overmind/tools/config.deb.txt?distro=ubuntu&$codename=xenial&component=main' > /etc/apt/sources.list.d/overmind-tools.list
chmod 0644 /etc/apt/sources.list.d/overmind-tools.list
chmod 0644 /usr/share/keyrings/overmind-tools-archive-keyring.gpg
apt-get update
```
Then install the CLI:
```shell
apt-get install overmind-cli
```
### RHEL
Set up the repository automatically:
```shell
curl -1sLf \
'https://dl.cloudsmith.io/public/overmind/tools/setup.rpm.sh' \
| sudo -E bash
```
Or set it up manually
```shell
yum install yum-utils pygpgme
rpm --import 'https://dl.cloudsmith.io/public/overmind/tools/gpg.BC5CDEFB4E37A1B3.key'
curl -1sLf 'https://dl.cloudsmith.io/public/overmind/tools/config.rpm.txt?distro=amzn&codename=2023' > /tmp/overmind-tools.repo
yum-config-manager --add-repo '/tmp/overmind-tools.repo'
yum -q makecache -y --disablerepo='*' --enablerepo='overmind-tools'
```
Then install the CLI:
```shell
sudo yum install overmind-cli
```
### Alpine
Set up the repository automatically:
```shell
sudo apk add --no-cache bash
curl -1sLf \
'https://dl.cloudsmith.io/public/overmind/tools/setup.alpine.sh' \
| sudo -E bash
```
Or set it up manually
```shell
curl -1sLf 'https://dl.cloudsmith.io/public/overmind/tools/rsa.7B6E65C2058FDB78.key' > /etc/apk/keys/tools@overmind-7B6E65C2058FDB78.rsa.pub
curl -1sLf 'https://dl.cloudsmith.io/public/overmind/tools/config.alpine.txt?distro=alpine&codename=v3.8' >> /etc/apk/repositories
apk update
```
Then install the CLI:
```shell
apk add overmind-cli
```
### Container / Docker
You can use the CLI via Docker which includes both OpenTofu and the CLI:
```shell
docker pull ghcr.io/overmindtech/cli:latest
docker run --rm ghcr.io/overmindtech/cli:latest overmind terraform plan
```
This is useful for CI/CD environments where you need a reproducible Terraform execution environment.
### Arch
Packages for Arch are available on the [releases page](https://github.com/overmindtech/cli/releases/latest) for manual download and installation.
Additionally a community maintained package can be found in the [aur](https://aur.archlinux.org/packages/overmind-cli-bin).
### ASDF
Overmind can be installed using [asdf](https://asdf-vm.com/):
```shell
# Add the plugin
asdf plugin add overmind-cli https://github.com/overmindtech/asdf-overmind-cli.git
# Show all installable versions
asdf list-all overmind-cli
# Install specific version
asdf install overmind-cli latest
# Set a version globally (on your ~/.tool-versions file)
asdf global overmind-cli latest
# Now overmind-cli commands are available
overmind --version
```
</details>
# Discover CLI Commands
- `overmind explore`
Overmind Assistant is a chat assistant that has real-time access to all your
AWS, GCP and K8S infrastructure. It alleviates the mental exhaustion of
manual troubleshooting, simplifies incident resolution by easily accessing
historical data, and automates time-consuming tasks such as documentation
and Terraform code generation. You can access the assistant by running
`overmind explore`.
- `overmind terraform plan / apply`
Overmind can identify the blast radius and uncover potential risks with
`overmind terraform plan` before they harm your infrastructure, allowing
anyone to make changes with confidence. It can also track the impact of the
changes you make with `overmind terraform apply`, so that you can be sure
that your changes haven't had any unexpected downstream impact.
- `overmind knowledge list`
View which knowledge files Overmind would discover from your current location.
Knowledge files in `.overmind/knowledge/` teach the AI investigator about your
infrastructure context, standards, and approved patterns. This command shows the
resolved knowledge directory path, valid files with their metadata, and any
validation warnings for invalid files.
You can specify multiple knowledge directories to layer organizational and
stack-specific knowledge:
```bash
overmind knowledge list \
--knowledge-dir .overmind/knowledge \
--knowledge-dir ./stacks/prod/.overmind/knowledge
```
When the same knowledge file name appears in multiple directories, later directories
override earlier ones. For more details, see the
[Knowledge Files documentation](https://docs.overmind.tech/docs/knowledge/knowledge).
## Cloud Provider Support
The CLI automatically discovers AWS and GCP providers from your Terraform configuration.
## How We Solve It?
<table style="width: 100%; table-layout: fixed;">
<tr>
<td style="width: 50%; vertical-align: top;">
<img width="100%" src="https://uploads-ssl.webflow.com/6241e92445c21f9c1245a940/66607bb64e562f2d332dad8b_blast_radius.png" /><br/>
<b>🔍 Blast Radius: </b>Overmind maps out all potential dependencies and interactions within your infra in realtime. Supports over 120 AWS resources and all Kubernetes.
</td>
<td style="width: 50%; vertical-align: top;">
<img width="100%" src="https://uploads-ssl.webflow.com/6241e92445c21f9c1245a940/66607454e2bf59158c49565a_health%20check%20risk.png" /><br/>
<b>🚨 Risks: </b>Discover specific risks that would be invisible otherwise. Risks are delivered directly to the pull request. Make deployment decisions within minutes not hours.
</td>
</tr>
</table>
## Advanced Use
### Passing Arguments
Overmind's `overmind terraform plan` and `overmind terraform apply` commands mostly just wrap the `terraform` that you already have installed, adding all of Overmind's features on top. This means that no matter how you're using Terraform today, this will still work with Overmind. For example if you're using a more complex command like:
```shell
terraform plan -var-file=production.tfvars -parallelism=20 -auto-approve
```
Then you would add `overmind` to the beginning, and your arguments after a double-dash e.g.
```shell
overmind terraform plan -- -var-file=production.tfvars -parallelism=20 -auto-approve
```
## Join the Community
- Join our [Discord](https://discord.com/invite/5UKsqAkPWG)
- Contact us via email at [sales@overmind.tech](mailto:sales@overmind.tech)
- Follow us on [LinkedIn](https://www.linkedin.com/company/overmindtech/)
## Additional Resources
- [Documentation](https://docs.overmind.tech)
- [Getting Started Guide](https://docs.overmind.tech)
- [Overmind Blog](https://overmind.tech/blog)
## Reporting Bugs
- Want to report a bug or request a feature? [Open an issue](https://github.com/overmindtech/cli/issues/new) or ask on <a href="https://discord.com/invite/5UKsqAkPWG" rel="nofollow">Discord</a>.
## Development
Please look in the [CONTRIBUTING.md](https://github.com/overmindtech/cli/blob/main/CONTRIBUTING.md) document.
## License
See the [LICENSE](/LICENSE) file for licensing information.
Overmind is made with ❤️ in 🇺🇸🇬🇧🇦🇹🇫🇷🇷🇴
================================================
FILE: aws-source/.deadcode-ignore
================================================
adapterhelpers/shared_tests.go:19:6: unreachable func: PtrInt32
adapterhelpers/shared_tests.go:27:6: unreachable func: PtrFloat32
adapterhelpers/shared_tests.go:31:6: unreachable func: PtrFloat64
adapterhelpers/shared_tests.go:35:6: unreachable func: PtrTime
adapterhelpers/shared_tests.go:39:6: unreachable func: PtrBool
adapterhelpers/shared_tests.go:73:21: unreachable func: VPCConfig.Cleanup
adapterhelpers/shared_tests.go:77:21: unreachable func: VPCConfig.RunCleanup
adapterhelpers/shared_tests.go:88:21: unreachable func: VPCConfig.Fetch
adapterhelpers/shared_tests.go:121:21: unreachable func: VPCConfig.CreateGateway
adapterhelpers/shared_tests.go:198:6: unreachable func: retry
adapterhelpers/shared_tests.go:221:21: unreachable func: QueryTests.Execute
adapterhelpers/shared_tests.go:238:6: unreachable func: lirMatches
adapterhelpers/shared_tests.go:246:6: unreachable func: CheckQuery
adapterhelpers/util.go:180:18: unreachable func: E2ETest.Run
adapterhelpers/util.go:326:6: unreachable func: GetAutoConfig
adapters/rds.go:25:24: unreachable func: mockRdsClient.DescribeDBClusterParameterGroups
adapters/rds.go:29:24: unreachable func: mockRdsClient.DescribeDBClusterParameters
adapters/rds.go:33:24: unreachable func: mockRdsClient.ListTagsForResource
adapters/rds.go:44:24: unreachable func: mockRdsClient.DescribeDBClusters
adapters/rds.go:48:24: unreachable func: mockRdsClient.DescribeDBInstances
adapters/rds.go:52:24: unreachable func: mockRdsClient.DescribeDBSubnetGroups
adapters/rds.go:56:24: unreachable func: mockRdsClient.DescribeOptionGroups
adapters/rds.go:60:24: unreachable func: mockRdsClient.DescribeDBParameterGroups
adapters/rds.go:64:24: unreachable func: mockRdsClient.DescribeDBParameters
================================================
FILE: aws-source/acceptance/nats-server.conf
================================================
# Client port of 4222 on all interfaces
port: 4222
# HTTP monitoring port
monitor_port: 8222
# This is for clustering multiple servers together.
cluster {
# It is recommended to set a cluster name
name: "my_cluster"
# Route connections to be received on any interface on port 6222
port: 6222
# Routes are protected, so need to use them with --routes flag
# e.g. --routes=nats-route://ruser:T0pS3cr3t@otherdockerhost:6222
authorization {
user: ruser
timeout: 0.75
}
# Routes are actively solicited and connected to from this server.
# This Docker image has none by default, but you can pass a
# flag to the nats-server docker image to create one to an existing server.
routes = []
}
websocket {
port: 4433
no_tls: true
}
================================================
FILE: aws-source/adapters/adapterhelpers_always_get_source.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"sync/atomic"
"time"
"buf.build/go/protovalidate"
"github.com/getsentry/sentry-go"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
"github.com/sourcegraph/conc/pool"
)
// MaxParallel An integer that defaults to 10
type MaxParallel int
// Value Get the value of MaxParallel, defaulting to 10
func (m MaxParallel) Value() int {
if m == 0 {
return 10
}
return int(m)
}
// AlwaysGetAdapter This adapter is designed for AWS APIs that have separate List
// and Get functions. It also assumes that the results of the list function
// cannot be converted directly into items as they do not contain enough
// information, and therefore they always need to be passed to the Get function
// before returning. An example is the `ListClusters` API in EKS which returns a
// list of cluster names.
type AlwaysGetAdapter[ListInput InputType, ListOutput OutputType, GetInput InputType, GetOutput OutputType, ClientStruct ClientStructType, Options OptionsType] struct {
ItemType string // The type of items to return
Client ClientStruct // The AWS API client
AccountID string // The AWS account ID
Region string // The AWS region this is related to
MaxParallel MaxParallel // How many Get request to run in parallel for a single List request
AdapterMetadata *sdp.AdapterMetadata
// Disables List(), meaning all calls will return empty results. This does
// not affect Search()
DisableList bool
// A function that gets the details of a given item. This should include the
// tags if relevant
GetFunc func(ctx context.Context, client ClientStruct, scope string, input GetInput) (*sdp.Item, error)
// The input to the ListFunc. This is static
ListInput ListInput
// A function that maps from the SDP get inputs to the relevant input for
// the GetFunc
GetInputMapper func(scope, query string) GetInput
// If this is set, Search queries will always use the automatic ARN resolver
// if the input is an ARN, falling back to the `SearchInputMapper` if it
// isn't
AlwaysSearchARNs bool
// Maps search terms from an SDP Search request into the relevant input for
// the ListFunc. If this is not set, Search() will handle ARNs like most AWS
// adapters. Note that this and `SearchGetInputMapper` are mutually exclusive
SearchInputMapper func(scope, query string) (ListInput, error)
// Maps search terms from an SDP Search request into the relevant input for
// the GetFunc. If this is not set, Search() will handle ARNs like most AWS
// adapters. Note that this and `SearchInputMapper` are mutually exclusive
SearchGetInputMapper func(scope, query string) (GetInput, error)
// A function that returns a paginator for the ListFunc
ListFuncPaginatorBuilder func(client ClientStruct, input ListInput) Paginator[ListOutput, Options]
// A function that accepts the output of a ListFunc and maps this to a slice
// of inputs to pass to the GetFunc. The input used for the ListFunc is also
// included in case it is required
ListFuncOutputMapper func(output ListOutput, input ListInput) ([]GetInput, error)
CacheDuration time.Duration // How long to cache items for
cache sdpcache.Cache // This is mandatory
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) cacheDuration() time.Duration {
if s.CacheDuration == 0 {
return DefaultCacheDuration
}
return s.CacheDuration
}
// Validate Checks that the adapter has been set up correctly
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Validate() error {
if !s.DisableList {
if s.ListFuncPaginatorBuilder == nil {
return errors.New("ListFuncPaginatorBuilder is nil")
}
if s.ListFuncOutputMapper == nil {
return errors.New("ListFuncOutputMapper is nil")
}
}
if s.GetFunc == nil {
return errors.New("GetFunc is nil")
}
if s.GetInputMapper == nil {
return errors.New("GetInputMapper is nil")
}
if s.SearchGetInputMapper != nil && s.SearchInputMapper != nil {
return errors.New("SearchGetInputMapper and SearchInputMapper are mutually exclusive")
}
return protovalidate.Validate(s.AdapterMetadata)
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Type() string {
return s.ItemType
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Name() string {
return fmt.Sprintf("%v-adapter", s.ItemType)
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Metadata() *sdp.AdapterMetadata {
return s.AdapterMetadata
}
// List of scopes that this adapter is capable of find items for. This will be
// in the format {accountID}.{region}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Scopes() []string {
return []string{
FormatScope(s.AccountID, s.Region),
}
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Get(ctx context.Context, scope string, query string, ignoreCache bool) (*sdp.Item, error) {
if scope != s.Scopes()[0] {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
var err error
var item *sdp.Item
if err = s.Validate(); err != nil {
return nil, WrapAWSError(err)
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_GET, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
return nil, qErr
}
if cacheHit {
if len(cachedItems) > 0 {
return cachedItems[0], nil
} else {
return nil, nil
}
}
input := s.GetInputMapper(scope, query)
item, err = s.GetFunc(ctx, s.Client, scope, input)
if err != nil {
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
return nil, err
}
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
return item, nil
}
// List Lists all available items. This is done by running the ListFunc, then
// passing these results to GetFunc in order to get the details
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) ListStream(ctx context.Context, scope string, ignoreCache bool, stream discovery.QueryResultStream) {
if scope != s.Scopes()[0] {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
})
return
}
if err := s.Validate(); err != nil {
stream.SendError(WrapAWSError(err))
return
}
// Check to see if we have supplied the required functions
if s.DisableList {
// In this case we can't run list, so just return empty
return
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_LIST, scope, s.ItemType, "", ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return
}
stream.SendError(qErr)
return
}
if cacheHit {
for _, item := range cachedItems {
stream.SendItem(item)
}
return
}
s.listInternal(ctx, scope, s.ListInput, ck, stream)
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) listInternal(ctx context.Context, scope string, input ListInput, ck sdpcache.CacheKey, stream discovery.QueryResultStream) {
paginator := s.ListFuncPaginatorBuilder(s.Client, input)
var newGetInputs []GetInput
p := pool.New().WithContext(ctx).WithMaxGoroutines(s.MaxParallel.Value())
// Track whether any items were found and if we had an error
var itemsSent atomic.Int64
var hadError atomic.Bool
defer func() {
// Always wait for everything to be completed before returning
err := p.Wait()
if err != nil {
sentry.CaptureException(err)
}
// Only cache not-found when no items were found AND no error occurred
// If we had an error, that error is already cached, don't overwrite it
shouldCacheNotFound := itemsSent.Load() == 0 && !hadError.Load()
if shouldCacheNotFound {
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("no %s found in scope %s", s.ItemType, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
}()
for paginator.HasMorePages() {
output, err := paginator.NextPage(ctx)
if err != nil {
hadError.Store(true)
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
stream.SendError(err)
return
}
newGetInputs, err = s.ListFuncOutputMapper(output, input)
if err != nil {
hadError.Store(true)
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
stream.SendError(err)
return
}
for _, input := range newGetInputs {
// This call will block if no workers are available, and therefore
// we will only load new pages once there are workers ready to
// accept that work
p.Go(func(ctx context.Context) error {
item, err := s.GetFunc(ctx, s.Client, scope, input)
if err != nil {
// Don't cache individual errors as they are cheap to re-run
stream.SendError(WrapAWSError(err))
// Mark that we had an error so we don't cache NOTFOUND
hadError.Store(true)
}
if item != nil {
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
stream.SendItem(item)
itemsSent.Add(1)
}
return nil
})
}
}
}
// Search Searches for AWS resources by ARN
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) SearchStream(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
if scope != s.Scopes()[0] {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
})
return
}
if err := s.Validate(); err != nil {
stream.SendError(WrapAWSError(err))
return
}
if s.SearchInputMapper == nil && s.SearchGetInputMapper == nil {
s.SearchARN(ctx, scope, query, ignoreCache, stream)
} else {
// If we should always look for ARNs first, do that
if s.AlwaysSearchARNs {
if _, err := ParseARN(query); err == nil {
s.SearchARN(ctx, scope, query, ignoreCache, stream)
} else {
s.SearchCustom(ctx, scope, query, ignoreCache, stream)
}
} else {
s.SearchCustom(ctx, scope, query, ignoreCache, stream)
}
}
}
// SearchCustom Searches using custom mapping logic. The SearchInputMapper is
// used to create an input for ListFunc, at which point the usual logic is used
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) SearchCustom(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_SEARCH, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return
}
stream.SendError(qErr)
return
}
if cacheHit {
for _, item := range cachedItems {
stream.SendItem(item)
}
return
}
if s.SearchInputMapper != nil {
input, err := s.SearchInputMapper(scope, query)
if err != nil {
// Don't bother caching this error since it costs nearly nothing
stream.SendError(WrapAWSError(err))
return
}
s.listInternal(ctx, scope, input, ck, stream)
} else if s.SearchGetInputMapper != nil {
input, err := s.SearchGetInputMapper(scope, query)
if err != nil {
// Don't cache this as it costs nearly nothing
stream.SendError(WrapAWSError(err))
return
}
item, err := s.GetFunc(ctx, s.Client, scope, input)
if err != nil {
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
stream.SendError(err)
return
}
if item != nil {
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
stream.SendItem(item)
} else {
// Cache not-found when item is nil
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("%s not found for search query '%s'", s.ItemType, query),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
} else {
stream.SendError(errors.New("SearchCustom called without SearchInputMapper or SearchGetInputMapper"))
return
}
}
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) SearchARN(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
// Parse the ARN
a, err := ParseARN(query)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
if a.ContainsWildcard() {
// We can't handle wildcards by default so bail out
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("wildcards are not supported by adapter %v", s.Name()),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
if arnScope := FormatScope(a.AccountID, a.Region); arnScope != scope {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("ARN scope %v does not match request scope %v", arnScope, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
item, err := s.Get(ctx, scope, a.ResourceID(), ignoreCache)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
if item != nil {
stream.SendItem(item)
}
}
// Weight Returns the priority weighting of items returned by this sourcs.
// This is used to resolve conflicts where two sources of the same type
// return an item for a GET request. In this instance only one item can be
// seen on, so the one with the higher weight value will win.
func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, ClientStruct, Options]) Weight() int {
return 100
}
================================================
FILE: aws-source/adapters/adapterhelpers_always_get_source_test.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"testing"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
"google.golang.org/protobuf/types/known/structpb"
)
func TestMaxParallel(t *testing.T) {
var p MaxParallel
if p.Value() != 10 {
t.Errorf("expected max parallel to be 10, got %v", p)
}
}
func TestAlwaysGetSourceType(t *testing.T) {
lgs := AlwaysGetAdapter[any, any, any, any, any, any]{
ItemType: "foo",
}
if lgs.Type() != "foo" {
t.Errorf("expected type to be foo, got %v", lgs.Type())
}
}
func TestAlwaysGetSourceName(t *testing.T) {
lgs := AlwaysGetAdapter[any, any, any, any, any, any]{
ItemType: "foo",
}
if lgs.Name() != "foo-adapter" {
t.Errorf("expected name to be foo-adapter, got %v", lgs.Name())
}
}
func TestAlwaysGetSourceScopes(t *testing.T) {
lgs := AlwaysGetAdapter[any, any, any, any, any, any]{
AccountID: "foo",
Region: "bar",
}
if lgs.Scopes()[0] != "foo.bar" {
t.Errorf("expected scope to be foo.bar, got %v", lgs.Scopes()[0])
}
}
func TestAlwaysGetSourceGet(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
_, err := lgs.Get(context.Background(), "foo.bar", "", false)
if err != nil {
t.Error(err)
}
})
t.Run("with an error", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return &sdp.Item{}, errors.New("foo")
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
_, err := lgs.Get(context.Background(), "foo.bar", "", false)
if err == nil {
t.Error("expected error")
}
})
}
func TestAlwaysGetSourceList(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
lgs.ListStream(context.Background(), "foo.bar", false, stream)
if len(stream.GetErrors()) != 0 {
t.Errorf("expected no errors, got %v: %v", len(stream.GetErrors()), stream.GetErrors())
}
if len(stream.GetItems()) != 6 {
t.Errorf("expected 6 results, got %v: %v", len(stream.GetItems()), stream.GetItems())
}
})
t.Run("with a failing output mapper", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return nil, errors.New("output mapper error")
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
lgs.ListStream(context.Background(), "foo.bar", false, stream)
errs := stream.GetErrors()
if len(errs) != 1 {
t.Fatalf("expected 1 error, got %v: %v", len(errs), errs)
}
qErr := &sdp.QueryError{}
if !errors.As(errs[0], &qErr) {
t.Errorf("expected error to be a QueryError, got %v", errs[0])
} else {
if qErr.GetErrorString() != "output mapper error" {
t.Errorf("expected 'output mapper error', got '%v'", qErr.GetErrorString())
}
}
})
t.Run("with a failing GetFunc", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return nil, errors.New("get func error")
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
lgs.ListStream(context.Background(), "foo.bar", false, stream)
errs := stream.GetErrors()
if len(errs) != 6 {
t.Fatalf("expected 6 error, got %v", len(errs))
}
items := stream.GetItems()
if len(items) != 0 {
t.Errorf("expected no items, got %v", len(items))
}
})
}
func TestAlwaysGetSourceSearch(t *testing.T) {
t.Run("with ARN search", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
if input == "foo.bar.id" {
return &sdp.Item{}, nil
} else {
return nil, sdp.NewQueryError(errors.New("bad query details"))
}
},
GetInputMapper: func(scope, query string) string {
return scope + "." + query
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("bad ARN", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "query", false, stream)
if len(stream.GetErrors()) == 0 {
t.Error("expected error because the ARN was bad")
}
})
t.Run("good ARN but bad scope", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "arn:aws:service:region:account:type/id", false, stream)
if len(stream.GetErrors()) == 0 {
t.Error("expected error because the ARN had a bad scope")
}
})
t.Run("good ARN", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "arn:aws:service:bar:foo:type/id", false, stream)
if len(stream.GetErrors()) != 0 {
t.Errorf("expected no errors, got %v: %v", len(stream.GetErrors()), stream.GetErrors())
}
})
})
t.Run("with Custom & ARN search", func(t *testing.T) {
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
AlwaysSearchARNs: true,
SearchInputMapper: func(scope, query string) (string, error) {
return query, nil
},
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
if input == "foo.bar.id" {
return &sdp.Item{}, nil
} else {
return nil, sdp.NewQueryError(errors.New("bad query details"))
}
},
GetInputMapper: func(scope, query string) string {
return scope + "." + query
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("ARN", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "arn:aws:service:bar:foo:type/id", false, stream)
errs := stream.GetErrors()
if len(errs) != 0 {
t.Error(errs[0])
}
items := stream.GetItems()
if len(items) != 1 {
t.Errorf("expected 1 item, got %v", len(items))
}
})
t.Run("other search", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "id", false, stream)
errs := stream.GetErrors()
if len(errs) != 6 {
t.Errorf("expected 6 error, got %v", len(errs))
}
items := stream.GetItems()
if len(items) != 0 {
t.Errorf("expected 0 items, got %v", len(items))
}
})
})
t.Run("with custom search logic", func(t *testing.T) {
searchMapperCalled := false
lgs := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
ListInput: "",
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
SearchInputMapper: func(scope, query string) (string, error) {
searchMapperCalled = true
return "", nil
},
GetInputMapper: func(scope, query string) string {
return ""
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
lgs.SearchStream(context.Background(), "foo.bar", "bar", false, stream)
errs := stream.GetErrors()
if len(errs) != 0 {
t.Error(errs[0])
}
if !searchMapperCalled {
t.Error("search mapper not called")
}
})
t.Run("with SearchGetInputMapper", func(t *testing.T) {
ags := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "bar",
Client: struct{}{},
MaxParallel: MaxParallel(1),
ListInput: "",
AlwaysSearchARNs: true,
SearchGetInputMapper: func(scope, query string) (string, error) {
return "foo.bar.id", nil
},
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
// Returns 3 pages
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns 2 gets per page
return []string{"", ""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
if input == "foo.bar.id" {
return &sdp.Item{}, nil
} else {
return nil, sdp.NewQueryError(errors.New("bad query details"))
}
},
GetInputMapper: func(scope, query string) string {
return scope + "." + query
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
ags.SearchStream(context.Background(), "foo.bar", "id", false, stream)
errs := stream.GetErrors()
if len(errs) != 0 {
t.Error(errs[0])
}
items := stream.GetItems()
if len(items) != 1 {
t.Errorf("expected 1 item, got %v", len(items))
}
})
}
func TestAlwaysGetSourceCaching(t *testing.T) {
ctx := t.Context()
generation := 0
s := AlwaysGetAdapter[string, string, string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test",
AccountID: "foo",
Region: "eu-west-2",
Client: struct{}{},
ListInput: "",
cache: sdpcache.NewMemoryCache(),
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[string, struct{}] {
return &TestPaginator{
DataFunc: func() string {
generation += 1
return fmt.Sprintf("%v", generation)
},
MaxPages: 1,
}
},
ListFuncOutputMapper: func(output, input string) ([]string, error) {
// Returns only 1 get per page to avoid confusing the cache with duplicate items
return []string{""}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, input string) (*sdp.Item, error) {
generation += 1
return &sdp.Item{
Scope: "foo.eu-west-2",
Type: "test-type",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": structpb.NewStringValue("test-item"),
"generation": structpb.NewStringValue(fmt.Sprintf("%v%v", input, generation)),
},
},
},
}, nil
},
GetInputMapper: func(scope, query string) string {
return ""
},
}
t.Run("get", func(t *testing.T) {
// get
first, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// get again
withCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// get ignore cache
withoutCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
t.Run("list", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
// First query
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// Second time we're expecting caching
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// Third time we're expecting no caching since we asked it to ignore
s.ListStream(ctx, "foo.eu-west-2", true, stream)
errs := stream.GetErrors()
if len(errs) != 0 {
for _, err := range errs {
t.Error(err)
}
t.Fatal("expected no errors")
}
items := stream.GetItems()
if len(items) != 3 {
t.Errorf("expected 3 items, got %v", len(items))
}
firstGen, err := items[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withCache, err := items[1].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withoutCache, err := items[2].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCache {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCache)
}
if withoutCache == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCache)
}
})
t.Run("search", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
// First query
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false, stream)
// Second time we're expecting caching
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false, stream)
// Third time we're expecting no caching since we asked it to ignore
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", true, stream)
errs := stream.GetErrors()
if len(errs) != 0 {
for _, err := range errs {
t.Error(err)
}
t.Fatal("expected no errors")
}
items := stream.GetItems()
if len(items) != 3 {
t.Errorf("expected 3 items, got %v", len(items))
}
firstGen, err := items[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withCache, err := items[1].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withoutCache, err := items[2].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCache {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCache)
}
if withoutCache == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCache)
}
})
}
var adapterMetadata = &sdp.AdapterMetadata{
Type: "test-adapter",
DescriptiveName: "Test Adapter",
Category: sdp.AdapterCategory_ADAPTER_CATEGORY_COMPUTE_APPLICATION,
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
GetDescription: "Get a test adapter",
Search: true,
SearchDescription: "Search test adapters",
List: true,
ListDescription: "List test adapters",
},
PotentialLinks: []string{"test-link"},
TerraformMappings: []*sdp.TerraformMapping{
{
TerraformMethod: sdp.QueryMethod_GET,
TerraformQueryMap: "aws_test_adapter.test_adapter",
},
},
}
================================================
FILE: aws-source/adapters/adapterhelpers_describe_source.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"strings"
"time"
"buf.build/go/protovalidate"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
)
// relatively short cache duration to cover a single Change Analysis run.
// Previously this was 1 hour and we had issues with stale data where customers
// were able to create resources that were not visible to them.
const DefaultCacheDuration = 5 * time.Minute
// DescribeOnlyAdapter Generates a adapter for AWS APIs that only use a `Describe`
// function for both List and Get operations. EC2 is a good example of this,
// where running Describe with no params returns everything, but params can be
// supplied to reduce the number of results.
type DescribeOnlyAdapter[Input InputType, Output OutputType, ClientStruct ClientStructType, Options OptionsType] struct {
MaxResultsPerPage int32 // Max results per page when making API queries
ItemType string // The type of items that will be returned
AdapterMetadata *sdp.AdapterMetadata
CacheDuration time.Duration // How long to cache items for
cache sdpcache.Cache // The cache for this adapter (set during creation, can be nil for tests)
// The function that should be used to describe the resources that this
// adapter is related to
DescribeFunc func(ctx context.Context, client ClientStruct, input Input) (Output, error)
// A function that returns the input object that will be passed to
// DescribeFunc for a GET request
InputMapperGet func(scope, query string) (Input, error)
// A function that returns the input object that will be passed to
// DescribeFunc for a LIST request
InputMapperList func(scope string) (Input, error)
// A function that maps a search query to the required input. If this is
// unset then a search request will default to searching by ARN
InputMapperSearch func(ctx context.Context, client ClientStruct, scope string, query string) (Input, error)
// A PostSearchFilter, if set, will be called after the search has been
// completed. This can be used to filter the results of the search before
// they are returned to the user, based on the query. This is used in
// situations where the underlying API doesn't allow for granular enough
// searching to match a given query string, and we need to apply some
// additional filtering to the response.
//
// A good example if this is allowing users to search using ARNs that
// contain IAM-Style wildcards. Since IAM is enforced *after* a query is
// run, most APIs don't provide detailed enough search options to completely
// replicate this functionality in the query, and instead we need to filter
// the results ourselves.
//
// This will only be applied when the InputMapperSearch function is also set
PostSearchFilter func(ctx context.Context, query string, items []*sdp.Item) ([]*sdp.Item, error)
// A function that returns a paginator for this API. If this is nil, we will
// assume that the API is not paginated e.g.
// https://aws.github.io/aws-sdk-go-v2/docs/making-requests/#using-paginators
PaginatorBuilder func(client ClientStruct, params Input) Paginator[Output, Options]
// A function that returns a slice of items for a given output. The scope
// and input are passed in on order to assist in creating the items if
// needed, but primarily this function should iterate over the output and
// create new items for each result
OutputMapper func(ctx context.Context, client ClientStruct, scope string, input Input, output Output) ([]*sdp.Item, error)
// The region that this adapter is configured in, each adapter can only be
// configured for one region. Getting data from many regions requires a
// adapter per region. This is used in the scope of returned resources
Region string
// AccountID The id of the account that is being used. This is used by
// sources as the first element in the scope
AccountID string
// Client The AWS client to use when making requests
Client ClientStruct
// UseListForGet If true, the adapter will use the List function to get items
// This option should be used when the Describe function does not support
// getting a single item by ID. The adapter will then filter the items
// itself.
// InputMapperGet should still be defined. It will be used to create the
// input for the List function. The output of the List function will be
// filtered by the adapter to find the item with the matching ID.
// See the directconnect-virtual-gateway adapter for an example of this.
UseListForGet bool
}
// Returns the duration that items should be cached for. This will use the
// `CacheDuration` for this adapter if set, otherwise it will use the default
// duration of 1 hour
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) cacheDuration() time.Duration {
if s.CacheDuration == 0 {
return DefaultCacheDuration
}
return s.CacheDuration
}
// Validate Checks that the adapter is correctly set up and returns an error if
// not
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Validate() error {
if s.DescribeFunc == nil {
return errors.New("adapter describe func is nil")
}
if s.MaxResultsPerPage == 0 {
s.MaxResultsPerPage = DefaultMaxResultsPerPage
}
if s.InputMapperGet == nil {
return errors.New("adapter get input mapper is nil")
}
if s.OutputMapper == nil {
return errors.New("adapter output mapper is nil")
}
return protovalidate.Validate(s.AdapterMetadata)
}
// Paginated returns whether or not this adapter is using a paginated API
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Paginated() bool {
return s.PaginatorBuilder != nil
}
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Type() string {
return s.ItemType
}
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Name() string {
return fmt.Sprintf("%v-adapter", s.ItemType)
}
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Metadata() *sdp.AdapterMetadata {
return s.AdapterMetadata
}
// List of scopes that this adapter is capable of find items for. This will be
// in the format {accountID}.{region}
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Scopes() []string {
return []string{
FormatScope(s.AccountID, s.Region),
}
}
// Get Get a single item with a given scope and query. The item returned
// should have a UniqueAttributeValue that matches the `query` parameter. The
// ctx parameter contains a golang context object which should be used to allow
// this adapter to timeout or be cancelled when executing potentially
// long-running actions
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Get(ctx context.Context, scope string, query string, ignoreCache bool) (*sdp.Item, error) {
if scope != s.Scopes()[0] {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
var input Input
var output Output
var err error
var items []*sdp.Item
err = s.Validate()
if err != nil {
return nil, WrapAWSError(err)
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_GET, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
return nil, qErr
}
if cacheHit {
if len(cachedItems) > 0 {
return cachedItems[0], nil
} else {
return nil, nil
}
}
// Get the input object
input, err = s.InputMapperGet(scope, query)
if err != nil {
err = s.processError(ctx, err, ck)
return nil, err
}
// Call the API using the object
output, err = s.DescribeFunc(ctx, s.Client, input)
if err != nil {
err = s.processError(ctx, err, ck)
return nil, err
}
items, err = s.OutputMapper(ctx, s.Client, scope, input, output)
if err != nil {
err = s.processError(ctx, err, ck)
return nil, err
}
if s.UseListForGet {
// If we're using List for Get, we need to filter the items ourselves
var filteredItems []*sdp.Item
for _, item := range items {
if item.UniqueAttributeValue() == query {
filteredItems = append(filteredItems, item)
break
}
}
items = filteredItems
}
numItems := len(items)
switch {
case numItems > 1:
itemNames := make([]string, 0, len(items))
// Get the names for logging
for i := range items {
itemNames = append(itemNames, items[i].GloballyUniqueName())
}
qErr := &sdp.QueryError{
ErrorType: sdp.QueryError_OTHER,
ErrorString: fmt.Sprintf("Request returned > 1 item for a GET request. Items: %v", strings.Join(itemNames, ", ")),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, qErr, s.cacheDuration(), ck)
return nil, qErr
case numItems == 0:
qErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("%v %v not found", s.Type(), query),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, qErr, s.cacheDuration(), ck)
return nil, qErr
}
s.cache.StoreItem(ctx, items[0], s.cacheDuration(), ck)
return items[0], nil
}
// List Lists all items in a given scope
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) ListStream(ctx context.Context, scope string, ignoreCache bool, stream discovery.QueryResultStream) {
if scope != s.Scopes()[0] {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
if s.InputMapperList == nil {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("list is not supported for %v resources", s.ItemType),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
err := s.Validate()
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_LIST, scope, s.ItemType, "", ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return
}
stream.SendError(qErr)
return
}
if cacheHit {
for _, item := range cachedItems {
stream.SendItem(item)
}
return
}
input, err := s.InputMapperList(scope)
if err != nil {
err = s.processError(ctx, err, ck)
stream.SendError(err)
return
}
s.describe(ctx, nil, input, scope, ck, stream)
}
// Search Searches for AWS resources by ARN
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) SearchStream(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
if scope != s.Scopes()[0] {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
})
return
}
if s.InputMapperSearch == nil {
s.searchARN(ctx, scope, query, ignoreCache, stream)
} else {
s.searchCustom(ctx, scope, query, ignoreCache, stream)
}
}
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) searchARN(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
// Parse the ARN
a, err := ParseARN(query)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
if a.ContainsWildcard() {
// We can't handle wildcards by default so bail out
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("wildcards are not supported by adapter %v", s.Name()),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
if arnScope := FormatScope(a.AccountID, a.Region); arnScope != scope {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("ARN scope %v does not match request scope %v", arnScope, scope),
Scope: scope,
})
return
}
// this already uses the cache, so needs no extra handling
item, err := s.Get(ctx, scope, a.ResourceID(), ignoreCache)
if err != nil {
stream.SendError(err)
return
}
if item != nil {
stream.SendItem(item)
}
}
// searchCustom Runs custom search logic using the `InputMapperSearch` function
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) searchCustom(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_SEARCH, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return
}
stream.SendError(qErr)
return
}
if cacheHit {
for _, item := range cachedItems {
stream.SendItem(item)
}
return
}
input, err := s.InputMapperSearch(ctx, s.Client, scope, query)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
s.describe(ctx, &query, input, scope, ck, stream)
}
// Processes an error returned by the AWS API so that it can be handled by
// Overmind. This includes extracting the correct error type, wrapping in an SDP
// error, and caching that error if it is non-transient (like a 404)
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) processError(ctx context.Context, err error, cacheKey sdpcache.CacheKey) error {
var sdpErr *sdp.QueryError
if err != nil {
sdpErr = WrapAWSError(err)
// Only cache the error if is something that won't be fixed by retrying
if sdpErr.GetErrorType() == sdp.QueryError_NOTFOUND || sdpErr.GetErrorType() == sdp.QueryError_NOSCOPE {
s.cache.StoreUnavailableItem(ctx, sdpErr, s.cacheDuration(), cacheKey)
}
}
return sdpErr
}
// describe Runs describe on the given input, intelligently choosing whether to
// run the paginated or unpaginated query. This handles caching, error handling,
// and post-search filtering if the query param is passed
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) describe(ctx context.Context, query *string, input Input, scope string, ck sdpcache.CacheKey, stream discovery.QueryResultStream) {
// Track whether any items were found
itemsSent := 0
if s.Paginated() {
paginator := s.PaginatorBuilder(s.Client, input)
for paginator.HasMorePages() {
output, err := paginator.NextPage(ctx)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
items, err := s.OutputMapper(ctx, s.Client, scope, input, output)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
if query != nil && s.PostSearchFilter != nil {
items, err = s.PostSearchFilter(ctx, *query, items)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
}
for _, item := range items {
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
stream.SendItem(item)
itemsSent++
}
}
} else {
output, err := s.DescribeFunc(ctx, s.Client, input)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
items, err := s.OutputMapper(ctx, s.Client, scope, input, output)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
if query != nil && s.PostSearchFilter != nil {
items, err = s.PostSearchFilter(ctx, *query, items)
if err != nil {
stream.SendError(s.processError(ctx, err, ck))
return
}
}
for _, item := range items {
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
stream.SendItem(item)
itemsSent++
}
}
// Cache not-found when no items were found
if itemsSent == 0 {
var errorString string
if query != nil {
errorString = fmt.Sprintf("no %s found for search query '%s' in scope %s", s.ItemType, *query, scope)
} else {
errorString = fmt.Sprintf("no %s found in scope %s", s.ItemType, scope)
}
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: errorString,
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
}
// Weight Returns the priority weighting of items returned by this adapter.
// This is used to resolve conflicts where two sources of the same type
// return an item for a GET request. In this instance only one item can be
// seen on, so the one with the higher weight value will win.
func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Weight() int {
return 100
}
================================================
FILE: aws-source/adapters/adapterhelpers_describe_source_test.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"regexp"
"testing"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
"google.golang.org/protobuf/types/known/structpb"
)
func TestType(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "foo",
}
if s.Type() != "foo" {
t.Errorf("expected type to be foo, got %v", s.Type())
}
}
func TestName(t *testing.T) {
// Basically just test that it's not empty. It doesn't matter what it is
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "foo",
}
if s.Name() == "" {
t.Error("blank name")
}
}
func TestScopes(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "outer-space",
AccountID: "mars",
}
scopes := s.Scopes()
if len(scopes) != 1 {
t.Errorf("expected 1 scope, got %v", len(scopes))
}
if scopes[0] != "mars.outer-space" {
t.Errorf("expected scope to be mars.outer-space, got %v", scopes[0])
}
}
func TestGet(t *testing.T) {
t.Run("when everything goes well", func(t *testing.T) {
var inputMapperCalled bool
var outputMapperCalled bool
var describeFuncCalled bool
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
inputMapperCalled = true
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
outputMapperCalled = true
return []*sdp.Item{
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
describeFuncCalled = true
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
item, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err != nil {
t.Error(err)
}
if !inputMapperCalled {
t.Error("input mapper not called")
}
if !outputMapperCalled {
t.Error("output mapper not called")
}
if !describeFuncCalled {
t.Error("describe func not called")
}
if item == nil {
t.Error("nil item")
}
})
t.Run("use get for list: output returns multiple sources", func(t *testing.T) {
uniqueAttribute := "virtualGatewayId"
uniqueAttributeValue := "test-id"
var inputMapperCalled bool
var outputMapperCalled bool
var describeFuncCalled bool
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
inputMapperCalled = true
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
outputMapperCalled = true
return []*sdp.Item{
{
UniqueAttribute: uniqueAttribute,
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
uniqueAttribute: structpb.NewStringValue(uniqueAttributeValue),
},
},
},
},
{
UniqueAttribute: uniqueAttribute,
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
uniqueAttribute: structpb.NewStringValue("some-value"),
},
},
},
},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
describeFuncCalled = true
return "", nil
},
UseListForGet: true,
cache: sdpcache.NewNoOpCache(),
}
item, err := s.Get(context.Background(), "foo.eu-west-2", uniqueAttributeValue, false)
if err != nil {
t.Error(err)
}
if !inputMapperCalled {
t.Error("input mapper not called")
}
if !outputMapperCalled {
t.Error("output mapper not called")
}
if !describeFuncCalled {
t.Error("describe func not called")
}
if item == nil {
t.Error("nil item")
}
})
t.Run("with too many results", func(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
{},
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error")
}
})
t.Run("with no results", func(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error")
}
})
}
func TestSearchARN(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "region",
AccountID: "account-id",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "fancy", nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
s.SearchStream(context.Background(), "account-id.region", "arn:partition:service:region:account-id:resource-type:resource-id", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 1 {
t.Errorf("expected 1 item, got %v", len(items))
}
}
func TestSearchCustom(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "region",
AccountID: "account-id",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": structpb.NewStringValue(output),
},
},
},
},
}, nil
},
InputMapperSearch: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "custom", nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return input, nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
s.SearchStream(context.Background(), "account-id.region", "foo", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 1 {
t.Errorf("expected 1 item, got %v", len(items))
}
if items[0].UniqueAttributeValue() != "custom" {
t.Errorf("expected item to be 'custom', got %v", items[0].UniqueAttributeValue())
}
t.Run("with a post-search filter", func(t *testing.T) {
s.PostSearchFilter = func(ctx context.Context, query string, items []*sdp.Item) ([]*sdp.Item, error) {
return nil, nil
}
stream := discovery.NewRecordingQueryResultStream()
s.SearchStream(context.Background(), "account-id.region", "bar", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 0 {
t.Errorf("expected 0 item, got %v", len(items))
}
})
}
func TestNoInputMapper(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
if len(stream.GetErrors()) == 0 {
t.Error("expected error but got none")
}
})
}
func TestNoOutputMapper(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
if len(stream.GetErrors()) == 0 {
t.Error("expected error but got none")
}
})
}
func TestNoDescribeFunc(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
if len(stream.GetErrors()) == 0 {
t.Error("expected error but got none")
}
})
}
func TestFailingInputMapper(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", errors.New("foobar")
},
InputMapperList: func(scope string) (string, error) {
return "input", errors.New("foobar")
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
fooBar := regexp.MustCompile("foobar")
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
if !fooBar.MatchString(err.Error()) {
t.Errorf("expected error string '%v' to contain foobar", err.Error())
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) == 0 {
t.Error("expected error but got none")
}
if !fooBar.MatchString(errs[0].Error()) {
t.Errorf("expected error string '%v' to contain foobar", errs[0].Error())
}
})
}
func TestFailingOutputMapper(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return nil, errors.New("foobar")
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
fooBar := regexp.MustCompile("foobar")
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
if !fooBar.MatchString(err.Error()) {
t.Errorf("expected error string '%v' to contain foobar", err.Error())
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) == 0 {
t.Error("expected error but got none")
}
if !fooBar.MatchString(errs[0].Error()) {
t.Errorf("expected error string '%v' to contain foobar", errs[0].Error())
}
})
}
func TestFailingDescribeFunc(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", errors.New("foobar")
},
cache: sdpcache.NewNoOpCache(),
}
fooBar := regexp.MustCompile("foobar")
t.Run("Get", func(t *testing.T) {
_, err := s.Get(context.Background(), "foo.eu-west-2", "bar", false)
if err == nil {
t.Error("expected error but got nil")
}
if !fooBar.MatchString(err.Error()) {
t.Errorf("expected error string '%v' to contain foobar", err.Error())
}
})
t.Run("List", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) == 0 {
t.Error("expected error but got none")
}
if !fooBar.MatchString(errs[0].Error()) {
t.Errorf("expected error string '%v' to contain foobar", errs[0].Error())
}
})
}
type TestPaginator struct {
DataFunc func() string
MaxPages int
page int
}
func (t *TestPaginator) HasMorePages() bool {
if t.MaxPages == 0 {
t.MaxPages = 3
}
return t.page < t.MaxPages
}
func (t *TestPaginator) NextPage(context.Context, ...func(struct{})) (string, error) {
data := t.DataFunc()
t.page++
return data, nil
}
func TestPaginated(t *testing.T) {
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
MaxResultsPerPage: 1,
Region: "eu-west-2",
AccountID: "foo",
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{},
}, nil
},
PaginatorBuilder: func(client struct{}, params string) Paginator[string, struct{}] {
return &TestPaginator{DataFunc: func() string {
return "foo"
}}
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("detecting pagination", func(t *testing.T) {
if !s.Paginated() {
t.Error("pagination not detected")
}
if err := s.Validate(); err != nil {
t.Error(err)
}
})
t.Run("paginating a List query", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "foo.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 3 {
t.Errorf("expected 3 items, got %v", len(items))
}
})
}
func TestDescribeOnlySourceCaching(t *testing.T) {
ctx := context.Background()
generation := 0
s := DescribeOnlyAdapter[string, string, struct{}, struct{}]{
AdapterMetadata: adapterMetadata,
ItemType: "test-type",
MaxResultsPerPage: 1,
Region: "eu-west-2",
AccountID: "foo",
cache: sdpcache.NewMemoryCache(),
InputMapperGet: func(scope, query string) (string, error) {
return "input", nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
OutputMapper: func(_ context.Context, _ struct{}, scope, input, output string) ([]*sdp.Item, error) {
return []*sdp.Item{
{
Scope: "foo.eu-west-2",
Type: "test-type",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": structpb.NewStringValue("test-item"),
"generation": structpb.NewStringValue(output),
},
},
},
},
}, nil
},
PaginatorBuilder: func(client struct{}, params string) Paginator[string, struct{}] {
return &TestPaginator{
DataFunc: func() string {
generation += 1
return fmt.Sprintf("%v", generation)
},
MaxPages: 1,
}
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
generation += 1
return fmt.Sprintf("%v", generation), nil
},
}
t.Run("get", func(t *testing.T) {
// get
first, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// get again
withCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// get ignore cache
withoutCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
t.Run("list", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
// Fist list
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// List again, expect caching
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// List again, ignore cache
s.ListStream(ctx, "foo.eu-west-2", true, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 3 {
t.Fatalf("expected 3 items, got %v", len(items))
}
firstGen, err := items[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withCache, err := items[1].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withoutCache, err := items[2].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCache {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCache)
}
if withoutCache == firstGen {
t.Errorf("without cache: expected generation %v, got %v", firstGen, withoutCache)
}
})
t.Run("search", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
// First time
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false, stream)
// Search again, expect caching
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false, stream)
// Search again, ignore cache
s.SearchStream(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", true, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 3 {
t.Fatalf("expected 3 items, got %v", len(items))
}
firstGen, err := items[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withCache, err := items[1].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withoutCache, err := items[2].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCache {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCache)
}
if withoutCache == firstGen {
t.Errorf("without cache: expected generation %v, got %v", firstGen, withoutCache)
}
})
}
// TestListCachingZeroItems demonstrates that LIST caching works when 0 items are returned.
// This is a simple test to verify that repeated LIST calls don't hit the backend when
// the first call returned no items.
func TestListCachingZeroItems(t *testing.T) {
ctx := context.Background()
describeCalls := 0
cache := sdpcache.NewMemoryCache()
adapter := &DescribeOnlyAdapter[string, string, struct{}, struct{}]{
ItemType: "ec2-instance",
Region: "us-east-1",
AccountID: "123456789012",
cache: cache,
AdapterMetadata: &sdp.AdapterMetadata{
Type: "ec2-instance",
DescriptiveName: "EC2 Instance",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get an EC2 instance by ID",
ListDescription: "List all EC2 instances",
},
},
InputMapperGet: func(scope, query string) (string, error) {
return query, nil
},
InputMapperList: func(scope string) (string, error) {
return "", nil
},
DescribeFunc: func(ctx context.Context, client struct{}, input string) (string, error) {
describeCalls++
t.Logf("DescribeFunc called (call #%d)", describeCalls)
return "", nil
},
OutputMapper: func(ctx context.Context, client struct{}, scope, input, output string) ([]*sdp.Item, error) {
// Return empty slice - simulates no EC2 instances found
return []*sdp.Item{}, nil
},
}
// First LIST call - should hit the backend
stream1 := discovery.NewRecordingQueryResultStream()
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream1)
if describeCalls != 1 {
t.Errorf("First call: expected 1 DescribeFunc call, got %d", describeCalls)
}
if len(stream1.GetItems()) != 0 {
t.Errorf("First call: expected 0 items, got %d", len(stream1.GetItems()))
}
t.Logf("First call complete: %d items, %d errors", len(stream1.GetItems()), len(stream1.GetErrors()))
// Second LIST call - should hit cache, NOT the backend
stream2 := discovery.NewRecordingQueryResultStream()
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream2)
if describeCalls != 1 {
t.Errorf("Second call: expected still 1 DescribeFunc call (cache hit), got %d", describeCalls)
}
if len(stream2.GetItems()) != 0 {
t.Errorf("Second call: expected 0 items, got %d", len(stream2.GetItems()))
}
// For backward compatibility, cached NOTFOUND is treated as empty result (no error)
// This matches the behavior of the first call which returns empty stream with no errors
if len(stream2.GetErrors()) != 0 {
t.Errorf("Second call: expected 0 errors from cache (backward compatibility), got %d errors", len(stream2.GetErrors()))
}
t.Logf("Second call complete: %d items, %d errors (cache hit!)", len(stream2.GetItems()), len(stream2.GetErrors()))
// Third LIST call with ignoreCache=true - should bypass cache and hit backend
stream3 := discovery.NewRecordingQueryResultStream()
adapter.ListStream(ctx, "123456789012.us-east-1", true, stream3) // ignoreCache=true
if describeCalls != 2 {
t.Errorf("Third call (ignoreCache): expected 2 DescribeFunc calls, got %d", describeCalls)
}
t.Logf("Third call (ignoreCache=true) complete: %d items, %d errors", len(stream3.GetItems()), len(stream3.GetErrors()))
}
================================================
FILE: aws-source/adapters/adapterhelpers_get_list_adapter_v2.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"slices"
"time"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
)
// GetListAdapterV2 A adapter for AWS APIs where the Get and List functions both
// return the full item, such as many of the IAM APIs. This version supports
// paginated APIs and streaming results.
type GetListAdapterV2[ListInput InputType, ListOutput OutputType, AWSItem AWSItemType, ClientStruct ClientStructType, Options OptionsType] struct {
ItemType string // The type of items that will be returned
Client ClientStruct // The AWS API client
AccountID string // The AWS account ID
Region string // The AWS region this is related to
SupportGlobalResources bool // If true, this will also support resources in the "aws" scope which are global
AdapterMetadata *sdp.AdapterMetadata
CacheDuration time.Duration // How long to cache items for
cache sdpcache.Cache // The cache for this adapter (set during creation, can be nil for tests)
// Disables List(), meaning all calls will return empty results. This does
// not affect Search()
DisableList bool
// GetFunc Gets the details of a specific item, returns the AWS
// representation of that item, and an error
GetFunc func(ctx context.Context, client ClientStruct, scope string, query string) (AWSItem, error)
// A function that returns the input object that will be passed to
// ListFunc for a LIST request
InputMapperList func(scope string) (ListInput, error)
// ListFunc Lists all items that it can find this should be used only if the
// API does not have a paginator, otherwise use ListFuncPaginatorBuilder
ListFunc func(ctx context.Context, client ClientStruct, input ListInput) (ListOutput, error)
// A function that returns a paginator for this API. If this is nil, we will
// assume that the API is not paginated e.g.
// https://aws.github.io/aws-sdk-go-v2/docs/making-requests/#using-paginators
//
// If this is set then ListFunc will be ignored
ListFuncPaginatorBuilder func(client ClientStruct, params ListInput) Paginator[ListOutput, Options]
// Extracts the list of items from the output of the ListFunc, these will be
// passed to the ItemMapper for conversion to SDP items
ListExtractor func(ctx context.Context, output ListOutput, client ClientStruct) ([]AWSItem, error)
// NOTE
//
// This does not yet support custom searching, this will be added in a
// future version
// ItemMapper Maps an AWS representation of an item to the SDP version, the
// query will be nil if the method was LIST
ItemMapper func(query *string, scope string, awsItem AWSItem) (*sdp.Item, error)
// ListTagsFunc Optional function that will be used to list tags for a
// resource
ListTagsFunc func(context.Context, AWSItem, ClientStruct) (map[string]string, error)
}
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) cacheDuration() time.Duration {
if s.CacheDuration == 0 {
return DefaultCacheDuration
}
return s.CacheDuration
}
// Validate Checks that the adapter has been set up correctly
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Validate() error {
if s.GetFunc == nil {
return errors.New("GetFunc is nil")
}
if !s.DisableList {
if s.ListFunc == nil && s.ListFuncPaginatorBuilder == nil {
return errors.New("ListFunc and ListFuncPaginatorBuilder are nil")
}
if s.ListExtractor == nil {
return errors.New("ListExtractor is nil")
}
if s.InputMapperList == nil {
return errors.New("InputMapperList is nil")
}
}
if s.ItemMapper == nil {
return errors.New("ItemMapper is nil")
}
return nil
}
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Type() string {
return s.ItemType
}
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Name() string {
return fmt.Sprintf("%v-adapter", s.ItemType)
}
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Metadata() *sdp.AdapterMetadata {
return s.AdapterMetadata
}
// List of scopes that this adapter is capable of find items for. This will be
// in the format {accountID}.{region}
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Scopes() []string {
scopes := make([]string, 0)
scopes = append(scopes, FormatScope(s.AccountID, s.Region))
if s.SupportGlobalResources {
scopes = append(scopes, "aws")
}
return scopes
}
// hasScope Returns whether or not this adapter has the given scope
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) hasScope(scope string) bool {
if scope == "aws" && s.SupportGlobalResources {
// There is a special global "account" that is used for global resources
// called "aws"
return true
}
return slices.Contains(s.Scopes(), scope)
}
// Get retrieves an item from the adapter based on the provided scope, query, and
// cache settings. It uses the defined `GetFunc`, `ItemMapper`, and
// `ListTagsFunc` to retrieve and map the item.
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) Get(ctx context.Context, scope string, query string, ignoreCache bool) (*sdp.Item, error) {
if !s.hasScope(scope) {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_GET, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
return nil, qErr
}
if cacheHit {
if len(cachedItems) == 0 {
return nil, nil
} else {
return cachedItems[0], nil
}
}
awsItem, err := s.GetFunc(ctx, s.Client, scope, query)
if err != nil {
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
return nil, err
}
item, err := s.ItemMapper(&query, scope, awsItem)
if err != nil {
// Don't cache this as wrapping is very cheap and better to just try
// again than store in memory
return nil, WrapAWSError(err)
}
if s.ListTagsFunc != nil {
item.Tags, err = s.ListTagsFunc(ctx, awsItem, s.Client)
if err != nil {
item.Tags = HandleTagsError(ctx, err)
}
}
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
return item, nil
}
// List Lists all available items. This is done by running the ListFunc, then
// passing these results to GetFunc in order to get the details
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) ListStream(ctx context.Context, scope string, ignoreCache bool, stream discovery.QueryResultStream) {
if !s.hasScope(scope) {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
})
return
}
if s.DisableList {
return
}
if err := s.Validate(); err != nil {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_OTHER,
ErrorString: err.Error(),
})
return
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_LIST, scope, s.ItemType, "", ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return
}
stream.SendError(qErr)
return
}
if cacheHit {
for _, item := range cachedItems {
stream.SendItem(item)
}
return
}
listInput, err := s.InputMapperList(scope)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
// Track whether any items were found and if we had an error
itemsSent := 0
hadError := false
// Define the function to send the outputs
sendOutputs := func(out ListOutput) {
// Extract the items in the correct format
awsItems, err := s.ListExtractor(ctx, out, s.Client)
if err != nil {
hadError = true
stream.SendError(WrapAWSError(err))
return
}
// Map the items to SDP items, send on the stream, and save to the
// cache
for _, awsItem := range awsItems {
item, err := s.ItemMapper(nil, scope, awsItem)
if err != nil {
hadError = true
stream.SendError(WrapAWSError(err))
continue
}
if s.ListTagsFunc != nil {
item.Tags, err = s.ListTagsFunc(ctx, awsItem, s.Client)
if err != nil {
item.Tags = HandleTagsError(ctx, err)
}
}
stream.SendItem(item)
itemsSent++
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
}
}
// See if this is paginated or not and use the appropriate method
if s.ListFuncPaginatorBuilder != nil {
paginator := s.ListFuncPaginatorBuilder(s.Client, listInput)
for paginator.HasMorePages() {
out, err := paginator.NextPage(ctx)
if err != nil {
hadError = true
stream.SendError(WrapAWSError(err))
return
}
sendOutputs(out)
}
} else if s.ListFunc != nil {
out, err := s.ListFunc(ctx, s.Client, listInput)
if err != nil {
hadError = true
stream.SendError(WrapAWSError(err))
return
}
sendOutputs(out)
}
// Cache not-found only when no items were found AND no error occurred
// If we had an error, that error is already sent to the stream, don't overwrite it
if itemsSent == 0 && !hadError {
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("no %s found in scope %s", s.ItemType, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
}
// Search Searches for AWS resources, this can be implemented either as a
// generic ARN search that tries to extract the globally unique name from the
// ARN and pass this to a Get request, or a custom search function that can be
// used to search for items in a different, adapter-specific way
func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, Options]) SearchStream(ctx context.Context, scope string, query string, ignoreCache bool, stream discovery.QueryResultStream) {
if !s.hasScope(scope) {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
})
return
}
// Parse the ARN
a, err := ParseARN(query)
if err != nil {
stream.SendError(WrapAWSError(err))
return
}
if a.ContainsWildcard() {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("wildcards are not supported by adapter %v", s.Name()),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
})
return
}
if arnScope := FormatScope(a.AccountID, a.Region); !s.hasScope(arnScope) {
stream.SendError(&sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("ARN scope %v does not match request scope %v", arnScope, scope),
Scope: scope,
})
return
}
// Since this gits the Get method, and this method implements caching, we
// don't need to implement it here
item, err := s.Get(ctx, scope, a.ResourceID(), ignoreCache)
if err != nil {
stream.SendError(err)
return
}
if item != nil {
stream.SendItem(item)
}
}
================================================
FILE: aws-source/adapters/adapterhelpers_get_list_adapter_v2_test.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"testing"
"github.com/overmindtech/cli/go/discovery"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
"google.golang.org/protobuf/types/known/structpb"
)
func TestGetListAdapterV2Type(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "foo",
}
if s.Type() != "foo" {
t.Errorf("expected type to be foo got %v", s.Type())
}
}
func TestGetListAdapterV2Name(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "foo",
}
if s.Name() != "foo-adapter" {
t.Errorf("expected type to be foo-adapter got %v", s.Name())
}
}
func TestGetListAdapterV2Scopes(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
AccountID: "foo",
Region: "bar",
}
if s.Scopes()[0] != "foo.bar" {
t.Errorf("expected scope to be foo.bar, got %v", s.Scopes()[0])
}
}
func TestGetListAdapterV2Get(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
ListTagsFunc: func(ctx context.Context, s1 string, s2 struct{}) (map[string]string, error) {
return map[string]string{
"foo": "bar",
}, nil
},
cache: sdpcache.NewNoOpCache(),
}
item, err := s.Get(context.Background(), "12345.eu-west-2", "", false)
if err != nil {
t.Error(err)
}
if item.GetTags()["foo"] != "bar" {
t.Errorf("expected tag foo to be bar, got %v", item.GetTags()["foo"])
}
})
t.Run("with an error in the GetFunc", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", errors.New("get func error")
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
cache: sdpcache.NewNoOpCache(),
}
if _, err := s.Get(context.Background(), "12345.eu-west-2", "", false); err == nil {
t.Error("expected error got nil")
}
})
t.Run("with an error in the mapper", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, errors.New("mapper error")
},
cache: sdpcache.NewNoOpCache(),
}
if _, err := s.Get(context.Background(), "12345.eu-west-2", "", false); err == nil {
t.Error("expected error got nil")
}
})
}
func TestGetListAdapterV2ListStream(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, input string) ([]string, error) {
return []string{"one", "two"}, nil
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
ListExtractor: func(ctx context.Context, output []string, client struct{}) ([]string, error) {
return output, nil
},
ListTagsFunc: func(ctx context.Context, s1 string, s2 struct{}) (map[string]string, error) {
return map[string]string{
"foo": "bar",
}, nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "12345.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 2 {
t.Errorf("expected 2 items, got %v", len(items))
}
})
t.Run("with an error in the ListFunc", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, errors.New("list func error")
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "12345.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) == 0 {
t.Error("expected errors got none")
}
})
t.Run("with an error in the mapper", func(t *testing.T) {
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListExtractor: func(ctx context.Context, output []string, client struct{}) ([]string, error) {
return output, nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query *string, scope, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, errors.New("mapper error")
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
s.ListStream(context.Background(), "12345.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) != 2 {
t.Errorf("expected 2 errors got %v", len(errs))
}
items := stream.GetItems()
if len(items) != 0 {
t.Errorf("expected no items, got %v", len(items))
}
})
}
// MockPaginator is a mock implementation of the Paginator interface
type MockPaginator struct {
pages [][]string
pageIdx int
hasPages bool
}
func (p *MockPaginator) HasMorePages() bool {
return p.hasPages && p.pageIdx < len(p.pages)
}
func (p *MockPaginator) NextPage(ctx context.Context, opts ...func(struct{})) ([]string, error) {
if !p.HasMorePages() {
return nil, errors.New("no more pages available")
}
page := p.pages[p.pageIdx]
p.pageIdx++
return page, nil
}
func TestListFuncPaginatorBuilder(t *testing.T) {
adapter := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "test-item",
AccountID: "foo",
Region: "eu-west-2",
Client: struct{}{},
InputMapperList: func(scope string) (string, error) {
return "test-input", nil
},
ListFuncPaginatorBuilder: func(client struct{}, input string) Paginator[[]string, struct{}] {
return &MockPaginator{
pages: [][]string{
{"item1", "item2"},
{"item3", "item4"},
},
hasPages: true,
}
},
ListExtractor: func(ctx context.Context, output []string, client struct{}) ([]string, error) {
return output, nil
},
ItemMapper: func(query *string, scope string, awsItem string) (*sdp.Item, error) {
attrs, _ := sdp.ToAttributes(map[string]any{
"id": awsItem,
})
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "id",
Attributes: attrs,
Scope: scope,
}, nil
},
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
cache: sdpcache.NewNoOpCache(),
}
stream := discovery.NewRecordingQueryResultStream()
adapter.ListStream(context.Background(), "foo.eu-west-2", false, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
if len(items) != 4 {
t.Errorf("expected 4 items, got %v", len(items))
}
}
func TestGetListAdapterV2Caching(t *testing.T) {
ctx := context.Background()
generation := 0
s := GetListAdapterV2[string, []string, string, struct{}, struct{}]{
ItemType: "test-type",
Region: "eu-west-2",
AccountID: "foo",
cache: sdpcache.NewCache(ctx),
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
generation += 1
return fmt.Sprintf("%v", generation), nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
generation += 1
return []string{fmt.Sprintf("%v", generation)}, nil
},
ListExtractor: func(ctx context.Context, output []string, client struct{}) ([]string, error) {
return output, nil
},
InputMapperList: func(scope string) (string, error) {
return "input", nil
},
ItemMapper: func(query *string, scope string, output string) (*sdp.Item, error) {
return &sdp.Item{
Scope: "foo.eu-west-2",
Type: "test-type",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": structpb.NewStringValue("test-item"),
"generation": structpb.NewStringValue(output),
},
},
},
}, nil
},
}
t.Run("get", func(t *testing.T) {
// get
first, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// get again
withCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// get ignore cache
withoutCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
t.Run("list", func(t *testing.T) {
stream := discovery.NewRecordingQueryResultStream()
// First call
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// Second call with caching
s.ListStream(ctx, "foo.eu-west-2", false, stream)
// Third call without caching
s.ListStream(ctx, "foo.eu-west-2", true, stream)
errs := stream.GetErrors()
if len(errs) > 0 {
t.Error(errs)
}
items := stream.GetItems()
firstGen, err := items[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withCacheGen, err := items[1].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := items[2].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
}
// TestGetListAdapterV2_ListExtractorErrorNoNotFoundCache tests that when ListExtractor fails,
// we don't incorrectly cache NOTFOUND. The error should be sent, but NOTFOUND should not be cached
// because the failure was due to extraction errors, not because items don't exist.
func TestGetListAdapterV2_ListExtractorErrorNoNotFoundCache(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
listCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
return nil, errors.New("should not be called in LIST test")
},
InputMapperList: func(scope string) (*MockInput, error) {
return &MockInput{}, nil
},
ListFunc: func(ctx context.Context, client *MockClient, input *MockInput) (*MockOutput, error) {
listCalls++
// Return a valid output that indicates items exist
return &MockOutput{}, nil
},
ListExtractor: func(ctx context.Context, output *MockOutput, client *MockClient) ([]*MockAWSItem, error) {
// Simulate extraction failure - this should NOT result in NOTFOUND caching
return nil, errors.New("extraction failed")
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call - ListExtractor fails, should send error but NOT cache NOTFOUND
stream1 := discovery.NewRecordingQueryResultStream()
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream1)
if len(stream1.GetItems()) != 0 {
t.Errorf("Expected 0 items, got %d", len(stream1.GetItems()))
}
if len(stream1.GetErrors()) != 1 {
t.Errorf("Expected 1 error from ListExtractor failure, got %d", len(stream1.GetErrors()))
}
if listCalls != 1 {
t.Errorf("Expected 1 ListFunc call, got %d", listCalls)
}
// Second call - should NOT hit cache (NOTFOUND was not cached), should try again
stream2 := discovery.NewRecordingQueryResultStream()
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream2)
if listCalls != 2 {
t.Errorf("Expected 2 ListFunc calls (no cache hit because NOTFOUND was not cached), got %d", listCalls)
}
if len(stream2.GetItems()) != 0 {
t.Errorf("Expected 0 items, got %d", len(stream2.GetItems()))
}
if len(stream2.GetErrors()) != 1 {
t.Errorf("Expected 1 error from ListExtractor failure, got %d", len(stream2.GetErrors()))
}
}
================================================
FILE: aws-source/adapters/adapterhelpers_get_list_source.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"slices"
"time"
"buf.build/go/protovalidate"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
)
// GetListAdapter A adapter for AWS APIs where the Get and List functions both
// return the full item, such as many of the IAM APIs
type GetListAdapter[AWSItem AWSItemType, ClientStruct ClientStructType, Options OptionsType] struct {
ItemType string // The type of items that will be returned
Client ClientStruct // The AWS API client
AccountID string // The AWS account ID
Region string // The AWS region this is related to
SupportGlobalResources bool // If true, this will also support resources in the "aws" scope which are global
AdapterMetadata *sdp.AdapterMetadata
CacheDuration time.Duration // How long to cache items for
cache sdpcache.Cache // The cache for this adapter (set during creation, can be nil for tests)
// Disables List(), meaning all calls will return empty results. This does
// not affect Search()
DisableList bool
// GetFunc Gets the details of a specific item, returns the AWS
// representation of that item, and an error
GetFunc func(ctx context.Context, client ClientStruct, scope string, query string) (AWSItem, error)
// ListFunc Lists all items that it can find. Returning a slice of AWS items
ListFunc func(ctx context.Context, client ClientStruct, scope string) ([]AWSItem, error)
// Optional search func that will be used for Search Requests. If this is
// unset, Search will simply use ARNs
SearchFunc func(ctx context.Context, client ClientStruct, scope string, query string) ([]AWSItem, error)
// ItemMapper Maps an AWS representation of an item to the SDP version
ItemMapper func(query, scope string, awsItem AWSItem) (*sdp.Item, error)
// ListTagsFunc Optional function that will be used to list tags for a
// resource
ListTagsFunc func(context.Context, AWSItem, ClientStruct) (map[string]string, error)
}
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) cacheDuration() time.Duration {
if s.CacheDuration == 0 {
return DefaultCacheDuration
}
return s.CacheDuration
}
// Validate Checks that the adapter has been set up correctly
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Validate() error {
if s.GetFunc == nil {
return errors.New("GetFunc is nil")
}
if !s.DisableList {
if s.ListFunc == nil {
return errors.New("ListFunc is nil")
}
}
if s.ItemMapper == nil {
return errors.New("ItemMapper is nil")
}
return protovalidate.Validate(s.AdapterMetadata)
}
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Type() string {
return s.ItemType
}
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Name() string {
return fmt.Sprintf("%v-adapter", s.ItemType)
}
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Metadata() *sdp.AdapterMetadata {
return s.AdapterMetadata
}
// List of scopes that this adapter is capable of find items for. This will be
// in the format {accountID}.{region}
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Scopes() []string {
scopes := make([]string, 0)
scopes = append(scopes, FormatScope(s.AccountID, s.Region))
if s.SupportGlobalResources {
scopes = append(scopes, "aws")
}
return scopes
}
// hasScope Returns whether or not this adapter has the given scope
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) hasScope(scope string) bool {
if scope == "aws" && s.SupportGlobalResources {
// There is a special global "account" that is used for global resources
// called "aws"
return true
}
return slices.Contains(s.Scopes(), scope)
}
// Get retrieves an item from the adapter based on the provided scope, query, and
// cache settings. It uses the defined `GetFunc`, `ItemMapper`, and
// `ListTagsFunc` to retrieve and map the item.
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Get(ctx context.Context, scope string, query string, ignoreCache bool) (*sdp.Item, error) {
if !s.hasScope(scope) {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_GET, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
return nil, qErr
}
if cacheHit {
if len(cachedItems) == 0 {
return nil, nil
} else {
return cachedItems[0], nil
}
}
awsItem, err := s.GetFunc(ctx, s.Client, scope, query)
if err != nil {
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
return nil, err
}
item, err := s.ItemMapper(query, scope, awsItem)
if err != nil {
// Don't cache this as wrapping is very cheap and better to just try
// again than store in memory
return nil, WrapAWSError(err)
}
if s.ListTagsFunc != nil {
item.Tags, err = s.ListTagsFunc(ctx, awsItem, s.Client)
if err != nil {
item.Tags = HandleTagsError(ctx, err)
}
}
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
return item, nil
}
// List Lists all available items. This is done by running the ListFunc, then
// passing these results to GetFunc in order to get the details
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) List(ctx context.Context, scope string, ignoreCache bool) ([]*sdp.Item, error) {
if !s.hasScope(scope) {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
if s.DisableList {
return []*sdp.Item{}, nil
}
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_LIST, scope, s.ItemType, "", ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return []*sdp.Item{}, nil
}
return nil, qErr
}
if cacheHit {
return cachedItems, nil
}
awsItems, err := s.ListFunc(ctx, s.Client, scope)
if err != nil {
err := WrapAWSError(err)
if !CanRetry(err) {
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
}
return nil, err
}
items := make([]*sdp.Item, 0)
hadError := false
for _, awsItem := range awsItems {
item, err := s.ItemMapper("", scope, awsItem)
if err != nil {
hadError = true
continue
}
if s.ListTagsFunc != nil {
item.Tags, err = s.ListTagsFunc(ctx, awsItem, s.Client)
if err != nil {
item.Tags = HandleTagsError(ctx, err)
}
}
items = append(items, item)
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
}
// Cache not-found only when no items were found AND no error occurred
if len(items) == 0 && !hadError {
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("no %s found in scope %s", s.ItemType, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
return items, nil
}
// Search Searches for AWS resources, this can be implemented either as a
// generic ARN search that tries to extract the globally unique name from the
// ARN and pass this to a Get request, or a custom search function that can be
// used to search for items in a different, adapter-specific way
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Search(ctx context.Context, scope string, query string, ignoreCache bool) ([]*sdp.Item, error) {
if !s.hasScope(scope) {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("requested scope %v does not match adapter scope %v", scope, s.Scopes()[0]),
}
}
if s.SearchFunc != nil {
return s.SearchCustom(ctx, scope, query, ignoreCache)
} else {
return s.SearchARN(ctx, scope, query, ignoreCache)
}
}
// Extracts the `ResourceID` and scope from the ARN, then calls `Get` with the
// extracted `ResourceID`
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) SearchARN(ctx context.Context, scope string, query string, ignoreCache bool) ([]*sdp.Item, error) {
// Parse the ARN
a, err := ParseARN(query)
if err != nil {
return nil, WrapAWSError(err)
}
if a.ContainsWildcard() {
// We can't handle wildcards by default so bail out
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("wildcards are not supported by adapter %v", s.Name()),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
}
if arnScope := FormatScope(a.AccountID, a.Region); !s.hasScope(arnScope) {
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOSCOPE,
ErrorString: fmt.Sprintf("ARN scope %v does not match request scope %v", arnScope, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
}
// Since this gits the Get method, and this method implements caching, we
// don't need to implement it here
item, err := s.Get(ctx, scope, a.ResourceID(), ignoreCache)
if err != nil {
return nil, WrapAWSError(err)
}
if item != nil {
return []*sdp.Item{item}, nil
}
return []*sdp.Item{}, nil
}
// Custom search function that can be used to search for items in a different,
// adapter-specific way
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) SearchCustom(ctx context.Context, scope string, query string, ignoreCache bool) ([]*sdp.Item, error) {
cacheHit, ck, cachedItems, qErr, done := s.cache.Lookup(ctx, s.Name(), sdp.QueryMethod_SEARCH, scope, s.ItemType, query, ignoreCache)
defer done()
if qErr != nil {
// For better semantics, convert cached NOTFOUND into empty result
if qErr.GetErrorType() == sdp.QueryError_NOTFOUND {
return []*sdp.Item{}, nil
}
return nil, qErr
}
if cacheHit {
return cachedItems, nil
}
awsItems, err := s.SearchFunc(ctx, s.Client, scope, query)
if err != nil {
err = WrapAWSError(err)
s.cache.StoreUnavailableItem(ctx, err, s.cacheDuration(), ck)
return nil, err
}
items := make([]*sdp.Item, 0)
hadError := false
var item *sdp.Item
for _, awsItem := range awsItems {
item, err = s.ItemMapper(query, scope, awsItem)
if err != nil {
hadError = true
continue
}
items = append(items, item)
s.cache.StoreItem(ctx, item, s.cacheDuration(), ck)
}
// Cache not-found only when no items were found AND no error occurred
if len(items) == 0 && !hadError {
notFoundErr := &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: fmt.Sprintf("no %s found for search query '%s' in scope %s", s.ItemType, query, scope),
Scope: scope,
SourceName: s.Name(),
ItemType: s.ItemType,
ResponderName: s.Name(),
}
s.cache.StoreUnavailableItem(ctx, notFoundErr, s.cacheDuration(), ck)
}
return items, nil
}
// Weight Returns the priority weighting of items returned by this adapter.
// This is used to resolve conflicts where two adapters of the same type
// return an item for a GET request. In this instance only one item can be
// seen on, so the one with the higher weight value will win.
func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Weight() int {
return 100
}
================================================
FILE: aws-source/adapters/adapterhelpers_get_list_source_test.go
================================================
package adapters
import (
"context"
"errors"
"fmt"
"testing"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
"google.golang.org/protobuf/types/known/structpb"
)
func TestGetListSourceType(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "foo",
}
if s.Type() != "foo" {
t.Errorf("expected type to be foo got %v", s.Type())
}
}
func TestGetListSourceName(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "foo",
}
if s.Name() != "foo-adapter" {
t.Errorf("expected type to be foo-adapter got %v", s.Name())
}
}
func TestGetListSourceScopes(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
AccountID: "foo",
Region: "bar",
}
if s.Scopes()[0] != "foo.bar" {
t.Errorf("expected scope to be foo.bar, got %v", s.Scopes()[0])
}
}
func TestGetListSourceGet(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
ListTagsFunc: func(ctx context.Context, s1 string, s2 struct{}) (map[string]string, error) {
return map[string]string{
"foo": "bar",
}, nil
},
cache: sdpcache.NewNoOpCache(),
}
item, err := s.Get(context.Background(), "12345.eu-west-2", "", false)
if err != nil {
t.Error(err)
}
if item.GetTags()["foo"] != "bar" {
t.Errorf("expected tag foo to be bar, got %v", item.GetTags()["foo"])
}
})
t.Run("with an error in the GetFunc", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", errors.New("get func error")
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
cache: sdpcache.NewNoOpCache(),
}
if _, err := s.Get(context.Background(), "12345.eu-west-2", "", false); err == nil {
t.Error("expected error got nil")
}
})
t.Run("with an error in the mapper", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, errors.New("mapper error")
},
cache: sdpcache.NewNoOpCache(),
}
if _, err := s.Get(context.Background(), "12345.eu-west-2", "", false); err == nil {
t.Error("expected error got nil")
}
})
}
func TestGetListSourceList(t *testing.T) {
t.Run("with no errors", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
ListTagsFunc: func(ctx context.Context, s1 string, s2 struct{}) (map[string]string, error) {
return map[string]string{
"foo": "bar",
}, nil
},
cache: sdpcache.NewNoOpCache(),
}
if items, err := s.List(context.Background(), "12345.eu-west-2", false); err != nil {
t.Error(err)
} else {
if len(items) != 2 {
t.Errorf("expected 2 items, got %v", len(items))
}
if items[0].GetTags()["foo"] != "bar" {
t.Errorf("expected tag foo to be bar, got %v", items[0].GetTags()["foo"])
}
}
})
t.Run("with an error in the ListFunc", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, errors.New("list func error")
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
cache: sdpcache.NewNoOpCache(),
}
if _, err := s.List(context.Background(), "12345.eu-west-2", false); err == nil {
t.Error("expected error got nil")
}
})
t.Run("with an error in the mapper", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, errors.New("mapper error")
},
cache: sdpcache.NewNoOpCache(),
}
if items, err := s.List(context.Background(), "12345.eu-west-2", false); err != nil {
t.Error(err)
} else {
if len(items) != 0 {
t.Errorf("expected no items, got %v", len(items))
}
}
})
}
func TestGetListSourceSearch(t *testing.T) {
t.Run("with ARN search", func(t *testing.T) {
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "person",
Region: "eu-west-2",
AccountID: "12345",
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
return "", nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
return []string{"", ""}, nil
},
ItemMapper: func(query, scope string, awsItem string) (*sdp.Item, error) {
return &sdp.Item{}, nil
},
cache: sdpcache.NewNoOpCache(),
}
t.Run("bad ARN", func(t *testing.T) {
_, err := s.Search(context.Background(), "12345.eu-west-2", "query", false)
if err == nil {
t.Error("expected error because the ARN was bad")
}
})
t.Run("good ARN but bad scope", func(t *testing.T) {
_, err := s.Search(context.Background(), "12345.eu-west-2", "arn:aws:service:region:account:type/id", false)
if err == nil {
t.Error("expected error because the ARN had a bad scope")
}
})
t.Run("good ARN", func(t *testing.T) {
_, err := s.Search(context.Background(), "12345.eu-west-2", "arn:aws:service:eu-west-2:12345:type/id", false)
if err != nil {
t.Error(err)
}
})
})
}
func TestGetListSourceCaching(t *testing.T) {
ctx := context.Background()
generation := 0
s := GetListAdapter[string, struct{}, struct{}]{
ItemType: "test-type",
Region: "eu-west-2",
AccountID: "foo",
cache: sdpcache.NewMemoryCache(),
GetFunc: func(ctx context.Context, client struct{}, scope, query string) (string, error) {
generation += 1
return fmt.Sprintf("%v", generation), nil
},
ListFunc: func(ctx context.Context, client struct{}, scope string) ([]string, error) {
generation += 1
return []string{fmt.Sprintf("%v", generation)}, nil
},
SearchFunc: func(ctx context.Context, client struct{}, scope, query string) ([]string, error) {
generation += 1
return []string{fmt.Sprintf("%v", generation)}, nil
},
ItemMapper: func(query, scope string, output string) (*sdp.Item, error) {
return &sdp.Item{
Scope: "foo.eu-west-2",
Type: "test-type",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{
AttrStruct: &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": structpb.NewStringValue("test-item"),
"generation": structpb.NewStringValue(output),
},
},
},
}, nil
},
}
t.Run("get", func(t *testing.T) {
// get
first, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// get again
withCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// get ignore cache
withoutCache, err := s.Get(ctx, "foo.eu-west-2", "test-item", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache.GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
t.Run("list", func(t *testing.T) {
// list
first, err := s.List(ctx, "foo.eu-west-2", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// list again
withCache, err := s.List(ctx, "foo.eu-west-2", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// list ignore cache
withoutCache, err := s.List(ctx, "foo.eu-west-2", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
t.Run("search", func(t *testing.T) {
// search
first, err := s.Search(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false)
if err != nil {
t.Fatal(err)
}
firstGen, err := first[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
// Get the result of the search
getCachedItem, err := s.Get(ctx, "foo.eu-west-2", "test-item", false)
if err != nil {
t.Fatal(err)
}
// Check that we get a valid item
if err := getCachedItem.Validate(); err != nil {
t.Fatal(err)
}
// Check the generation to make sure it was actually served from the cache
cachedGeneration, _ := getCachedItem.GetAttributes().Get("generation")
if firstGen != cachedGeneration {
t.Errorf("expected generation %v, got %v", firstGen, cachedGeneration)
}
// search again
withCache, err := s.Search(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", false)
if err != nil {
t.Fatal(err)
}
withCacheGen, err := withCache[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if firstGen != withCacheGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withCacheGen)
}
// search ignore cache
withoutCache, err := s.Search(ctx, "foo.eu-west-2", "arn:aws:test-type:eu-west-2:foo:test-item", true)
if err != nil {
t.Fatal(err)
}
withoutCacheGen, err := withoutCache[0].GetAttributes().Get("generation")
if err != nil {
t.Fatal(err)
}
if withoutCacheGen == firstGen {
t.Errorf("with cache: expected generation %v, got %v", firstGen, withoutCacheGen)
}
})
}
================================================
FILE: aws-source/adapters/adapterhelpers_notfound_cache_test.go
================================================
package adapters
import (
"context"
"errors"
"testing"
"time"
"github.com/overmindtech/cli/go/sdp-go"
"github.com/overmindtech/cli/go/sdpcache"
)
// TestGetListAdapterV2_GetNotFoundCaching tests that GetListAdapterV2 caches not-found error results
func TestGetListAdapterV2_GetNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getCalls := 0
// Mock AWS item type
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
getCalls++
// Return NOTFOUND error (typical AWS behavior)
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "resource not found",
Scope: scope,
}
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call should invoke GetFunc and get error
item, err := adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item, got %v", item)
}
// First call returns the error (but it's cached)
if err == nil {
t.Error("Expected NOTFOUND error, got nil")
}
if getCalls != 1 {
t.Errorf("Expected 1 GetFunc call, got %d", getCalls)
}
// Second call should hit cache and return the cached NOTFOUND error
item, err = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item on cache hit, got %v", item)
}
var qErr *sdp.QueryError
if err == nil {
t.Error("Expected NOTFOUND error on cache hit, got nil")
} else if !errors.As(err, &qErr) || qErr.GetErrorType() != sdp.QueryError_NOTFOUND {
t.Errorf("Expected NOTFOUND error on cache hit, got %v", err)
}
if getCalls != 1 {
t.Errorf("Expected still 1 GetFunc call (cache hit), got %d", getCalls)
}
}
// TestGetListAdapterV2_ListNotFoundCaching tests that GetListAdapterV2 caches not-found results when LIST returns 0 items
func TestGetListAdapterV2_ListNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
listCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
return nil, errors.New("should not be called in LIST test")
},
InputMapperList: func(scope string) (*MockInput, error) {
return &MockInput{}, nil
},
ListFunc: func(ctx context.Context, client *MockClient, input *MockInput) (*MockOutput, error) {
listCalls++
return &MockOutput{}, nil
},
ListExtractor: func(ctx context.Context, output *MockOutput, client *MockClient) ([]*MockAWSItem, error) {
// Return empty slice to simulate no items found
return []*MockAWSItem{}, nil
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// Use test stream to collect results
stream := &testQueryResultStream{}
// First call should invoke ListFunc
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream)
if len(stream.items) != 0 {
t.Errorf("Expected 0 items, got %d", len(stream.items))
}
if listCalls != 1 {
t.Errorf("Expected 1 ListFunc call, got %d", listCalls)
}
// Second call should hit cache
stream2 := &testQueryResultStream{}
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream2)
if len(stream2.items) != 0 {
t.Errorf("Expected 0 items on cache hit, got %d", len(stream2.items))
}
// For backward compatibility, cached NOTFOUND is treated as empty result (no error)
// This matches the behavior of the first call which returns empty stream with no errors
if len(stream2.errors) != 0 {
t.Errorf("Expected 0 errors from cache (backward compatibility), got %d", len(stream2.errors))
}
if listCalls != 1 {
t.Errorf("Expected still 1 ListFunc call (cache hit), got %d", listCalls)
}
}
// TestGetListAdapter_GetNotFoundCaching tests GetListAdapter's GET not-found caching
func TestGetListAdapter_GetNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapter[*MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
getCalls++
// Return NOTFOUND error (typical AWS behavior)
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "resource not found",
Scope: scope,
}
},
ItemMapper: func(query, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call returns error (which gets cached)
item, err := adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item, got %v", item)
}
if err == nil {
t.Error("Expected NOTFOUND error, got nil")
}
if getCalls != 1 {
t.Errorf("Expected 1 GetFunc call, got %d", getCalls)
}
// Second call should hit cache and return the cached NOTFOUND error
item, err = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item on cache hit, got %v", item)
}
var qErr *sdp.QueryError
if err == nil {
t.Error("Expected NOTFOUND error on cache hit, got nil")
} else if !errors.As(err, &qErr) || qErr.GetErrorType() != sdp.QueryError_NOTFOUND {
t.Errorf("Expected NOTFOUND error on cache hit, got %v", err)
}
if getCalls != 1 {
t.Errorf("Expected still 1 GetFunc call (cache hit), got %d", getCalls)
}
}
// TestGetListAdapter_ListNotFoundCaching tests GetListAdapter's LIST not-found caching
func TestGetListAdapter_ListNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
listCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapter[*MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
return nil, errors.New("should not be called")
},
ListFunc: func(ctx context.Context, client *MockClient, scope string) ([]*MockAWSItem, error) {
listCalls++
return []*MockAWSItem{}, nil // Empty list
},
ItemMapper: func(query, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call
items, err := adapter.List(ctx, "123456789012.us-east-1", false)
if len(items) != 0 {
t.Errorf("Expected 0 items, got %d", len(items))
}
if err != nil {
t.Errorf("Expected nil error, got %v", err)
}
if listCalls != 1 {
t.Errorf("Expected 1 ListFunc call, got %d", listCalls)
}
// Second call should hit cache and return empty result with nil error (backward compatibility)
items2, err := adapter.List(ctx, "123456789012.us-east-1", false)
// Should get empty result with nil error for backward compatibility
if len(items2) != 0 {
t.Errorf("Expected 0 items from cache, got %d", len(items2))
}
if err != nil {
t.Errorf("Expected nil error from cache (backward compat), got %v", err)
}
if listCalls != 1 {
t.Errorf("Expected still 1 ListFunc call (cache hit), got %d", listCalls)
}
}
// TestAlwaysGetAdapter_GetNotFoundCaching tests AlwaysGetAdapter's GET not-found caching
func TestAlwaysGetAdapter_GetNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getFuncCalls := 0
adapter := &AlwaysGetAdapter[*MockInput, *MockOutput, *MockGetInput, *MockGetOutput, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetInputMapper: func(scope, query string) *MockGetInput {
return &MockGetInput{}
},
GetFunc: func(ctx context.Context, client *MockClient, scope string, input *MockGetInput) (*sdp.Item, error) {
getFuncCalls++
// Return NOTFOUND error (typical AWS behavior)
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "resource not found",
Scope: scope,
}
},
// Add ListFuncPaginatorBuilder to avoid validation error
ListFuncPaginatorBuilder: func(client *MockClient, input *MockInput) Paginator[*MockOutput, *MockOptions] {
return nil // Not used in GET test
},
ListFuncOutputMapper: func(output *MockOutput, input *MockInput) ([]*MockGetInput, error) {
return nil, nil // Not used in GET test
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call returns error (which gets cached)
item, err := adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item, got %v", item)
}
if err == nil {
t.Error("Expected NOTFOUND error, got nil")
}
if getFuncCalls != 1 {
t.Errorf("Expected 1 GetFunc call, got %d", getFuncCalls)
}
// Second call should hit cache and return the cached NOTFOUND error
item, err = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if item != nil {
t.Errorf("Expected nil item on cache hit, got %v", item)
}
var qErr *sdp.QueryError
if err == nil {
t.Error("Expected NOTFOUND error on cache hit, got nil")
} else if !errors.As(err, &qErr) || qErr.GetErrorType() != sdp.QueryError_NOTFOUND {
t.Errorf("Expected NOTFOUND error on cache hit, got %v", err)
}
if getFuncCalls != 1 {
t.Errorf("Expected still 1 GetFunc call (cache hit), got %d", getFuncCalls)
}
}
// TestDescribeOnlyAdapter_ListNotFoundCaching tests DescribeOnlyAdapter's LIST not-found caching
func TestDescribeOnlyAdapter_ListNotFoundCaching(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
describeCalls := 0
adapter := &DescribeOnlyAdapter[*MockInput, *MockOutput, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
MaxResultsPerPage: 100, // Set to avoid validation using default
DescribeFunc: func(ctx context.Context, client *MockClient, input *MockInput) (*MockOutput, error) {
describeCalls++
return &MockOutput{}, nil
},
InputMapperGet: func(scope, query string) (*MockInput, error) {
return &MockInput{}, nil
},
InputMapperList: func(scope string) (*MockInput, error) {
return &MockInput{}, nil
},
OutputMapper: func(ctx context.Context, client *MockClient, scope string, input *MockInput, output *MockOutput) ([]*sdp.Item, error) {
// Return empty slice to simulate no items found
return []*sdp.Item{}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
stream := &testQueryResultStream{}
// First call
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream)
if len(stream.items) != 0 {
t.Errorf("Expected 0 items, got %d", len(stream.items))
}
if describeCalls != 1 {
t.Errorf("Expected 1 DescribeFunc call, got %d", describeCalls)
}
// Second call should hit cache
stream2 := &testQueryResultStream{}
adapter.ListStream(ctx, "123456789012.us-east-1", false, stream2)
if len(stream2.items) != 0 {
t.Errorf("Expected 0 items on cache hit, got %d", len(stream2.items))
}
// For backward compatibility, cached NOTFOUND is treated as empty result (no error)
// This matches the behavior of the first call which returns empty stream with no errors
if len(stream2.errors) != 0 {
t.Errorf("Expected 0 errors from cache (backward compatibility), got %d", len(stream2.errors))
}
if describeCalls != 1 {
t.Errorf("Expected still 1 DescribeFunc call (cache hit), got %d", describeCalls)
}
}
// Mock types for testing
type MockClient struct{}
type MockInput struct{}
type MockOutput struct{}
type MockGetInput struct{}
type MockGetOutput struct{}
type MockOptions struct{}
// testQueryResultStream is a simple implementation of QueryResultStream for testing
type testQueryResultStream struct {
items []*sdp.Item
errors []*sdp.QueryError
}
func (s *testQueryResultStream) SendItem(item *sdp.Item) {
s.items = append(s.items, item)
}
func (s *testQueryResultStream) SendError(err error) {
var qErr *sdp.QueryError
if errors.As(err, &qErr) {
s.errors = append(s.errors, qErr)
} else {
s.errors = append(s.errors, &sdp.QueryError{
ErrorType: sdp.QueryError_OTHER,
ErrorString: err.Error(),
})
}
}
// TestNotFoundCacheExpiry tests that not-found cache entries expire correctly
func TestNotFoundCacheExpiry(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getFuncCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
CacheDuration: 100 * time.Millisecond, // Short duration for testing
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
getFuncCalls++
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "not found",
}
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call - should cache not-found
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if getFuncCalls != 1 {
t.Errorf("Expected 1 GetFunc call, got %d", getFuncCalls)
}
// Immediate second call - should hit cache
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if getFuncCalls != 1 {
t.Errorf("Expected still 1 GetFunc call (cache hit), got %d", getFuncCalls)
}
// Wait for cache to expire
time.Sleep(150 * time.Millisecond)
// Third call after expiry - should invoke GetFunc again
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if getFuncCalls != 2 {
t.Errorf("Expected 2 GetFunc calls (cache expired), got %d", getFuncCalls)
}
}
// TestNotFoundCacheIgnoreCache tests that ignoreCache parameter bypasses not-found cache
func TestNotFoundCacheIgnoreCache(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getFuncCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
getFuncCalls++
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "not found",
}
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call with ignoreCache=false
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if getFuncCalls != 1 {
t.Errorf("Expected 1 GetFunc call, got %d", getFuncCalls)
}
// Second call with ignoreCache=true - should bypass cache
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", true)
if getFuncCalls != 2 {
t.Errorf("Expected 2 GetFunc calls (ignore cache), got %d", getFuncCalls)
}
// Third call with ignoreCache=false - should still hit cache from first call
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "test-query", false)
if getFuncCalls != 2 {
t.Errorf("Expected still 2 GetFunc calls (cache hit), got %d", getFuncCalls)
}
}
// TestNotFoundCacheDifferentQueries tests that different queries get separate cache entries
func TestNotFoundCacheDifferentQueries(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
getFuncCalls := 0
queriesReceived := make(map[string]int)
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapterV2[*MockInput, *MockOutput, *MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
getFuncCalls++
queriesReceived[query]++
return nil, &sdp.QueryError{
ErrorType: sdp.QueryError_NOTFOUND,
ErrorString: "not found",
}
},
ItemMapper: func(query *string, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
return &sdp.Item{
Type: "test-item",
UniqueAttribute: "name",
Attributes: &sdp.ItemAttributes{},
Scope: scope,
}, nil
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// Query for item1
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "item1", false)
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "item1", false) // Cache hit
// Query for item2
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "item2", false)
_, _ = adapter.Get(ctx, "123456789012.us-east-1", "item2", false) // Cache hit
// Should have called GetFunc once per unique query
if getFuncCalls != 2 {
t.Errorf("Expected 2 GetFunc calls (1 per unique query), got %d", getFuncCalls)
}
if queriesReceived["item1"] != 1 {
t.Errorf("Expected 1 call for item1, got %d", queriesReceived["item1"])
}
if queriesReceived["item2"] != 1 {
t.Errorf("Expected 1 call for item2, got %d", queriesReceived["item2"])
}
}
// TestGetListAdapter_ListItemMapperErrorNoNotFoundCache tests that when ListFunc returns items
// but ItemMapper fails for all of them, we don't incorrectly cache NOTFOUND. Items actually exist
// but couldn't be mapped, so NOTFOUND should not be cached.
func TestGetListAdapter_ListItemMapperErrorNoNotFoundCache(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
listCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapter[*MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
return nil, errors.New("should not be called in LIST test")
},
ListFunc: func(ctx context.Context, client *MockClient, scope string) ([]*MockAWSItem, error) {
listCalls++
// Return items that exist
return []*MockAWSItem{
{Name: "item1"},
{Name: "item2"},
}, nil
},
ItemMapper: func(query, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
// Simulate mapping failure for all items - this should NOT result in NOTFOUND caching
return nil, errors.New("mapping failed")
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call - ItemMapper fails for all items, should NOT cache NOTFOUND
items1, err1 := adapter.List(ctx, "123456789012.us-east-1", false)
if len(items1) != 0 {
t.Errorf("Expected 0 items (all mapping failed), got %d", len(items1))
}
if err1 != nil {
t.Errorf("Expected nil error (errors are silently ignored via continue), got %v", err1)
}
if listCalls != 1 {
t.Errorf("Expected 1 ListFunc call, got %d", listCalls)
}
// Second call - should NOT hit cache (NOTFOUND was not cached), should try again
items2, err2 := adapter.List(ctx, "123456789012.us-east-1", false)
if listCalls != 2 {
t.Errorf("Expected 2 ListFunc calls (no cache hit because NOTFOUND was not cached), got %d", listCalls)
}
if len(items2) != 0 {
t.Errorf("Expected 0 items, got %d", len(items2))
}
if err2 != nil {
t.Errorf("Expected nil error, got %v", err2)
}
}
// TestGetListAdapter_SearchCustomItemMapperErrorNoNotFoundCache tests that when SearchFunc returns items
// but ItemMapper fails for all of them, we don't incorrectly cache NOTFOUND. Items actually exist
// but couldn't be mapped, so NOTFOUND should not be cached.
func TestGetListAdapter_SearchCustomItemMapperErrorNoNotFoundCache(t *testing.T) {
ctx := context.Background()
cache := sdpcache.NewMemoryCache()
searchCalls := 0
type MockAWSItem struct {
Name string
}
adapter := &GetListAdapter[*MockAWSItem, *MockClient, *MockOptions]{
ItemType: "test-item",
cache: cache,
AccountID: "123456789012",
Region: "us-east-1",
GetFunc: func(ctx context.Context, client *MockClient, scope string, query string) (*MockAWSItem, error) {
return nil, errors.New("should not be called in SEARCH test")
},
ListFunc: func(ctx context.Context, client *MockClient, scope string) ([]*MockAWSItem, error) {
return nil, errors.New("should not be called in SEARCH test")
},
SearchFunc: func(ctx context.Context, client *MockClient, scope string, query string) ([]*MockAWSItem, error) {
searchCalls++
// Return items that exist
return []*MockAWSItem{
{Name: "item1"},
{Name: "item2"},
}, nil
},
ItemMapper: func(query, scope string, awsItem *MockAWSItem) (*sdp.Item, error) {
// Simulate mapping failure for all items - this should NOT result in NOTFOUND caching
return nil, errors.New("mapping failed")
},
AdapterMetadata: &sdp.AdapterMetadata{
Type: "test-item",
DescriptiveName: "Test Item",
SupportedQueryMethods: &sdp.AdapterSupportedQueryMethods{
Get: true,
List: true,
GetDescription: "Get a test item",
ListDescription: "List all test items",
},
},
}
// First call - ItemMapper fails for all items, should NOT cache NOTFOUND
items1, err1 := adapter.SearchCustom(ctx, "123456789012.us-east-1", "test-query", false)
if len(items1) != 0 {
t.Errorf("Expected 0 items (all mapping failed), got %d", len(items1))
}
if err1 != nil {
t.Errorf("Expected nil error (errors are silently ignored via continue), got %v", err1)
}
if searchCalls != 1 {
t.Errorf("Expected 1 SearchFunc call, got %d", searchCalls)
}
// Second call - should NOT hit cache (NOTFOUND was not cached), should try again
items2, err2 := adapter.SearchCustom(ctx, "123456789012.us-east-1", "test-query", false)
if searchCalls != 2 {
t.Errorf("Expected 2 SearchFunc calls (no cache hit because NOTFOUND was not cached), got %d", searchCalls)
}
if len(items2) != 0 {
t.Errorf("Expected 0 items, got %d", len(items2))
}
if err2 != nil {
t.Errorf("Expected nil error, got %v", err2)
}
}
================================================
FILE: aws-source/adapters/adapterhelpers_shared_tests.go
================================================
package adapters
import (
"context"
"fmt"
"log"
"testing"
"time"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/overmindtech/cli/go/sdp-go"
)
type Subnet struct {
ID *string
CIDR string
AvailabilityZone string
}
type VPCConfig struct {
// These are populated after Fetching
ID *string
// Subnets in this VPC
Subnets []*Subnet
cleanupFunctions []func()
}
var purposeKey = "Purpose"
var nameKey = "Name"
var tagValue = "automated-testing-" + time.Now().Format("2006-01-02T15:04:05.000Z")
var TestTags = []types.Tag{
{
Key: &purposeKey,
Value: &tagValue,
},
{
Key: &nameKey,
Value: &tagValue,
},
}
func (v *VPCConfig) Cleanup(f func()) {
v.cleanupFunctions = append(v.cleanupFunctions, f)
}
func (v *VPCConfig) RunCleanup() {
for len(v.cleanupFunctions) > 0 {
n := len(v.cleanupFunctions) - 1 // Top element
v.cleanupFunctions[n]()
v.cleanupFunctions = v.cleanupFunctions[:n] // Pop
}
}
// Fetch Fetches the VPC and subnets and registers cleanup actions for them
func (v *VPCConfig) Fetch(client *ec2.Client) error {
// manually configured VPC in eu-west-2
vpcid := "vpc-061f0bb58acec88ad"
v.ID = &vpcid // vpcOutput.Vpc.VpcId
filterName := "vpc-id"
subnetOutput, err := client.DescribeSubnets(
context.Background(),
&ec2.DescribeSubnetsInput{
Filters: []types.Filter{
{
Name: &filterName,
Values: []string{vpcid},
},
},
},
)
if err != nil {
return err
}
for _, subnet := range subnetOutput.Subnets {
v.Subnets = append(v.Subnets, &Subnet{
ID: subnet.SubnetId,
CIDR: *subnet.CidrBlock,
AvailabilityZone: *subnet.AvailabilityZone,
})
}
return nil
}
// CreateGateway Creates a new internet gateway for the duration of the test to save 40$ per month vs running it 24/7
func (v *VPCConfig) CreateGateway(client *ec2.Client) error {
var err error
// Create internet gateway and assign to VPC
var gatewayOutput *ec2.CreateInternetGatewayOutput
gatewayOutput, err = client.CreateInternetGateway(
context.Background(),
&ec2.CreateInternetGatewayInput{
TagSpecifications: []types.TagSpecification{
{
ResourceType: types.ResourceTypeInternetGateway,
Tags: TestTags,
},
},
},
)
if err != nil {
return err
}
internetGatewayId := gatewayOutput.InternetGateway.InternetGatewayId
v.Cleanup(func() {
del := func() error {
_, err := client.DeleteInternetGateway(
context.Background(),
&ec2.DeleteInternetGatewayInput{
InternetGatewayId: internetGatewayId,
},
)
return err
}
err := r
gitextract_qkwcrphn/
├── .github/
│ ├── e2eapply.tape
│ ├── e2eplan.tape
│ └── workflows/
│ ├── docker-release.yml
│ ├── finalize-copybara-sync.yml
│ ├── release.yml
│ ├── tag-on-merge.yml
│ └── tests.yml
├── .gitignore
├── .goreleaser.yaml
├── .terraform.lock.hcl
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── aws-source/
│ ├── .deadcode-ignore
│ ├── acceptance/
│ │ └── nats-server.conf
│ ├── adapters/
│ │ ├── adapterhelpers_always_get_source.go
│ │ ├── adapterhelpers_always_get_source_test.go
│ │ ├── adapterhelpers_describe_source.go
│ │ ├── adapterhelpers_describe_source_test.go
│ │ ├── adapterhelpers_get_list_adapter_v2.go
│ │ ├── adapterhelpers_get_list_adapter_v2_test.go
│ │ ├── adapterhelpers_get_list_source.go
│ │ ├── adapterhelpers_get_list_source_test.go
│ │ ├── adapterhelpers_notfound_cache_test.go
│ │ ├── adapterhelpers_shared_tests.go
│ │ ├── adapterhelpers_sources.go
│ │ ├── adapterhelpers_util.go
│ │ ├── adapterhelpers_util_test.go
│ │ ├── apigateway-api-key.go
│ │ ├── apigateway-api-key_test.go
│ │ ├── apigateway-authorizer.go
│ │ ├── apigateway-authorizer_test.go
│ │ ├── apigateway-deployment.go
│ │ ├── apigateway-deployment_test.go
│ │ ├── apigateway-domain-name.go
│ │ ├── apigateway-domain-name_test.go
│ │ ├── apigateway-integration.go
│ │ ├── apigateway-integration_test.go
│ │ ├── apigateway-method-response.go
│ │ ├── apigateway-method-response_test.go
│ │ ├── apigateway-method.go
│ │ ├── apigateway-method_test.go
│ │ ├── apigateway-model.go
│ │ ├── apigateway-model_test.go
│ │ ├── apigateway-resource.go
│ │ ├── apigateway-resource_test.go
│ │ ├── apigateway-rest-api.go
│ │ ├── apigateway-rest-api_test.go
│ │ ├── apigateway-stage.go
│ │ ├── apigateway-stage_test.go
│ │ ├── autoscaling-auto-scaling-group.go
│ │ ├── autoscaling-auto-scaling-group_test.go
│ │ ├── autoscaling-auto-scaling-policy.go
│ │ ├── autoscaling-auto-scaling-policy_test.go
│ │ ├── cloudfront-cache-policy.go
│ │ ├── cloudfront-cache-policy_test.go
│ │ ├── cloudfront-continuous-deployment-policy.go
│ │ ├── cloudfront-continuous-deployment-policy_test.go
│ │ ├── cloudfront-distribution.go
│ │ ├── cloudfront-distribution_test.go
│ │ ├── cloudfront-function.go
│ │ ├── cloudfront-function_test.go
│ │ ├── cloudfront-key-group.go
│ │ ├── cloudfront-key-group_test.go
│ │ ├── cloudfront-origin-access-control.go
│ │ ├── cloudfront-origin-access-control_test.go
│ │ ├── cloudfront-origin-request-policy.go
│ │ ├── cloudfront-origin-request-policy_test.go
│ │ ├── cloudfront-realtime-log-config.go
│ │ ├── cloudfront-realtime-log-config_test.go
│ │ ├── cloudfront-response-headers-policy.go
│ │ ├── cloudfront-response-headers-policy_test.go
│ │ ├── cloudfront-streaming-distribution.go
│ │ ├── cloudfront-streaming-distribution_test.go
│ │ ├── cloudfront.go
│ │ ├── cloudfront_test.go
│ │ ├── cloudwatch-alarm.go
│ │ ├── cloudwatch-alarm_test.go
│ │ ├── cloudwatch-instance-metric.go
│ │ ├── cloudwatch-instance-metric_integration_test.go
│ │ ├── cloudwatch-instance-metric_test.go
│ │ ├── cloudwatch_metric_links.go
│ │ ├── cloudwatch_metric_links_test.go
│ │ ├── directconnect-connection.go
│ │ ├── directconnect-connection_test.go
│ │ ├── directconnect-customer-metadata.go
│ │ ├── directconnect-customer-metadata_test.go
│ │ ├── directconnect-direct-connect-gateway-association-proposal.go
│ │ ├── directconnect-direct-connect-gateway-association-proposal_test.go
│ │ ├── directconnect-direct-connect-gateway-association.go
│ │ ├── directconnect-direct-connect-gateway-association_test.go
│ │ ├── directconnect-direct-connect-gateway-attachment.go
│ │ ├── directconnect-direct-connect-gateway-attachment_test.go
│ │ ├── directconnect-direct-connect-gateway.go
│ │ ├── directconnect-direct-connect-gateway_test.go
│ │ ├── directconnect-hosted-connection.go
│ │ ├── directconnect-hosted-connection_test.go
│ │ ├── directconnect-interconnect.go
│ │ ├── directconnect-interconnect_test.go
│ │ ├── directconnect-lag.go
│ │ ├── directconnect-lag_test.go
│ │ ├── directconnect-location.go
│ │ ├── directconnect-location_test.go
│ │ ├── directconnect-router-configuration.go
│ │ ├── directconnect-router-configuration_test.go
│ │ ├── directconnect-virtual-gateway.go
│ │ ├── directconnect-virtual-gateway_test.go
│ │ ├── directconnect-virtual-interface.go
│ │ ├── directconnect-virtual-interface_test.go
│ │ ├── directconnect.go
│ │ ├── directconnect_test.go
│ │ ├── dynamodb-backup.go
│ │ ├── dynamodb-backup_test.go
│ │ ├── dynamodb-table.go
│ │ ├── dynamodb-table_test.go
│ │ ├── dynamodb.go
│ │ ├── dynamodb_test.go
│ │ ├── ec2-address.go
│ │ ├── ec2-address_test.go
│ │ ├── ec2-capacity-reservation-fleet.go
│ │ ├── ec2-capacity-reservation-fleet_test.go
│ │ ├── ec2-capacity-reservation.go
│ │ ├── ec2-capacity-reservation_test.go
│ │ ├── ec2-egress-only-internet-gateway.go
│ │ ├── ec2-egress-only-internet-gateway_test.go
│ │ ├── ec2-iam-instance-profile-association.go
│ │ ├── ec2-iam-instance-profile-association_test.go
│ │ ├── ec2-image.go
│ │ ├── ec2-image_test.go
│ │ ├── ec2-instance-event-window.go
│ │ ├── ec2-instance-event-window_test.go
│ │ ├── ec2-instance-status.go
│ │ ├── ec2-instance-status_test.go
│ │ ├── ec2-instance.go
│ │ ├── ec2-instance_test.go
│ │ ├── ec2-internet-gateway.go
│ │ ├── ec2-internet-gateway_test.go
│ │ ├── ec2-key-pair.go
│ │ ├── ec2-key-pair_test.go
│ │ ├── ec2-launch-template-version.go
│ │ ├── ec2-launch-template-version_test.go
│ │ ├── ec2-launch-template.go
│ │ ├── ec2-launch-template_test.go
│ │ ├── ec2-nat-gateway.go
│ │ ├── ec2-nat-gateway_test.go
│ │ ├── ec2-network-acl.go
│ │ ├── ec2-network-acl_test.go
│ │ ├── ec2-network-interface-permission.go
│ │ ├── ec2-network-interface-permission_test.go
│ │ ├── ec2-network-interface.go
│ │ ├── ec2-network-interface_test.go
│ │ ├── ec2-placement-group.go
│ │ ├── ec2-placement-group_test.go
│ │ ├── ec2-reserved-instance.go
│ │ ├── ec2-reserved-instance_test.go
│ │ ├── ec2-route-table.go
│ │ ├── ec2-route-table_test.go
│ │ ├── ec2-security-group-rule.go
│ │ ├── ec2-security-group-rule_test.go
│ │ ├── ec2-security-group.go
│ │ ├── ec2-security-group_test.go
│ │ ├── ec2-snapshot.go
│ │ ├── ec2-snapshot_test.go
│ │ ├── ec2-subnet.go
│ │ ├── ec2-subnet_test.go
│ │ ├── ec2-transit-gateway-route-table-association.go
│ │ ├── ec2-transit-gateway-route-table-association_test.go
│ │ ├── ec2-transit-gateway-route-table-propagation.go
│ │ ├── ec2-transit-gateway-route-table-propagation_test.go
│ │ ├── ec2-transit-gateway-route-table.go
│ │ ├── ec2-transit-gateway-route-table_test.go
│ │ ├── ec2-transit-gateway-route.go
│ │ ├── ec2-transit-gateway-route_test.go
│ │ ├── ec2-volume-status.go
│ │ ├── ec2-volume-status_test.go
│ │ ├── ec2-volume.go
│ │ ├── ec2-volume_test.go
│ │ ├── ec2-vpc-endpoint.go
│ │ ├── ec2-vpc-endpoint_test.go
│ │ ├── ec2-vpc-peering-connection.go
│ │ ├── ec2-vpc-peering-connection_test.go
│ │ ├── ec2-vpc.go
│ │ ├── ec2-vpc_test.go
│ │ ├── ec2.go
│ │ ├── ec2_test.go
│ │ ├── ecs-capacity-provider.go
│ │ ├── ecs-capacity-provider_test.go
│ │ ├── ecs-cluster.go
│ │ ├── ecs-cluster_test.go
│ │ ├── ecs-container-instance.go
│ │ ├── ecs-container-instance_test.go
│ │ ├── ecs-service.go
│ │ ├── ecs-service_test.go
│ │ ├── ecs-task-definition.go
│ │ ├── ecs-task-definition_test.go
│ │ ├── ecs-task.go
│ │ ├── ecs-task_test.go
│ │ ├── ecs.go
│ │ ├── ecs_test.go
│ │ ├── efs-access-point.go
│ │ ├── efs-access-point_test.go
│ │ ├── efs-backup-policy.go
│ │ ├── efs-backup-policy_test.go
│ │ ├── efs-file-system.go
│ │ ├── efs-file-system_test.go
│ │ ├── efs-mount-target.go
│ │ ├── efs-mount-target_test.go
│ │ ├── efs-replication-configuration.go
│ │ ├── efs-replication-configuration_test.go
│ │ ├── efs.go
│ │ ├── efs_test.go
│ │ ├── eks-addon.go
│ │ ├── eks-addon_test.go
│ │ ├── eks-cluster.go
│ │ ├── eks-cluster_test.go
│ │ ├── eks-fargate-profile.go
│ │ ├── eks-fargate-profile_test.go
│ │ ├── eks-nodegroup.go
│ │ ├── eks-nodegroup_test.go
│ │ ├── eks.go
│ │ ├── eks_test.go
│ │ ├── elb-instance-health.go
│ │ ├── elb-instance-health_test.go
│ │ ├── elb-load-balancer.go
│ │ ├── elb-load-balancer_test.go
│ │ ├── elbv2-listener.go
│ │ ├── elbv2-listener_test.go
│ │ ├── elbv2-load-balancer.go
│ │ ├── elbv2-load-balancer_test.go
│ │ ├── elbv2-rule.go
│ │ ├── elbv2-rule_test.go
│ │ ├── elbv2-target-group.go
│ │ ├── elbv2-target-group_test.go
│ │ ├── elbv2-target-health.go
│ │ ├── elbv2-target-health_test.go
│ │ ├── elbv2.go
│ │ ├── elbv2_test.go
│ │ ├── iam-group.go
│ │ ├── iam-group_test.go
│ │ ├── iam-instance-profile.go
│ │ ├── iam-instance-profile_test.go
│ │ ├── iam-policy.go
│ │ ├── iam-policy_test.go
│ │ ├── iam-role.go
│ │ ├── iam-role_test.go
│ │ ├── iam-user.go
│ │ ├── iam-user_test.go
│ │ ├── iam.go
│ │ ├── iam_test.go
│ │ ├── integration/
│ │ │ ├── apigateway/
│ │ │ │ ├── apigateway_test.go
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── ec2/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── instance_test.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── ec2-transit-gateway/
│ │ │ │ ├── client.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ ├── transit_gateway_route_table_association_test.go
│ │ │ │ ├── transit_gateway_route_table_propagation_test.go
│ │ │ │ ├── transit_gateway_route_table_test.go
│ │ │ │ └── transit_gateway_route_test.go
│ │ │ ├── errors.go
│ │ │ ├── kms/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── kms_test.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── teardown.go
│ │ │ │ └── util.go
│ │ │ ├── networkmanager/
│ │ │ │ ├── create.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── find.go
│ │ │ │ ├── main_test.go
│ │ │ │ ├── networkmanager_test.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── tags.go
│ │ │ │ └── teardown.go
│ │ │ ├── ssm/
│ │ │ │ └── main_test.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ ├── kms-alias.go
│ │ ├── kms-alias_test.go
│ │ ├── kms-custom-key-store.go
│ │ ├── kms-custom-key-store_test.go
│ │ ├── kms-grant.go
│ │ ├── kms-grant_test.go
│ │ ├── kms-key-policy.go
│ │ ├── kms-key-policy_test.go
│ │ ├── kms-key.go
│ │ ├── kms-key_test.go
│ │ ├── kms.go
│ │ ├── lambda-event-source-mapping.go
│ │ ├── lambda-event-source-mapping_test.go
│ │ ├── lambda-function.go
│ │ ├── lambda-function_test.go
│ │ ├── lambda-layer-version.go
│ │ ├── lambda-layer-version_test.go
│ │ ├── lambda-layer.go
│ │ ├── lambda-layer_test.go
│ │ ├── lambda.go
│ │ ├── lambda_test.go
│ │ ├── main.go
│ │ ├── network-firewall-firewall-policy.go
│ │ ├── network-firewall-firewall-policy_test.go
│ │ ├── network-firewall-firewall.go
│ │ ├── network-firewall-firewall_test.go
│ │ ├── network-firewall-rule-group.go
│ │ ├── network-firewall-rule-group_test.go
│ │ ├── network-firewall-tls-inspection-configuration.go
│ │ ├── network-firewall-tls-inspection-configuration_test.go
│ │ ├── networkfirewall.go
│ │ ├── networkfirewall_test.go
│ │ ├── networkmanager-connect-attachment.go
│ │ ├── networkmanager-connect-attachment_test.go
│ │ ├── networkmanager-connect-peer-association.go
│ │ ├── networkmanager-connect-peer-association_test.go
│ │ ├── networkmanager-connect-peer.go
│ │ ├── networkmanager-connect-peer_test.go
│ │ ├── networkmanager-connection.go
│ │ ├── networkmanager-connection_test.go
│ │ ├── networkmanager-core-network-policy.go
│ │ ├── networkmanager-core-network-policy_test.go
│ │ ├── networkmanager-core-network.go
│ │ ├── networkmanager-core-network_test.go
│ │ ├── networkmanager-device.go
│ │ ├── networkmanager-device_test.go
│ │ ├── networkmanager-global-network.go
│ │ ├── networkmanager-global-network_test.go
│ │ ├── networkmanager-link-association.go
│ │ ├── networkmanager-link-association_test.go
│ │ ├── networkmanager-link.go
│ │ ├── networkmanager-link_test.go
│ │ ├── networkmanager-network-resource-relationship.go
│ │ ├── networkmanager-network-resource-relationship_test.go
│ │ ├── networkmanager-site-to-site-vpn-attachment.go
│ │ ├── networkmanager-site-to-site-vpn-attachment_test.go
│ │ ├── networkmanager-site.go
│ │ ├── networkmanager-site_test.go
│ │ ├── networkmanager-transit-gateway-connect-peer-association.go
│ │ ├── networkmanager-transit-gateway-connect-peer-association_test.go
│ │ ├── networkmanager-transit-gateway-peering.go
│ │ ├── networkmanager-transit-gateway-peering_test.go
│ │ ├── networkmanager-transit-gateway-registration.go
│ │ ├── networkmanager-transit-gateway-registration_test.go
│ │ ├── networkmanager-transit-gateway-route-table-attachment.go
│ │ ├── networkmanager-transit-gateway-route-table-attachment_test.go
│ │ ├── networkmanager-vpc-attachment.go
│ │ ├── networkmanager-vpc-attachment_test.go
│ │ ├── networkmanager.go
│ │ ├── networkmanager_test.go
│ │ ├── rds-db-cluster-parameter-group.go
│ │ ├── rds-db-cluster-parameter-group_test.go
│ │ ├── rds-db-cluster.go
│ │ ├── rds-db-cluster_test.go
│ │ ├── rds-db-instance.go
│ │ ├── rds-db-instance_test.go
│ │ ├── rds-db-parameter-group.go
│ │ ├── rds-db-parameter-group_test.go
│ │ ├── rds-db-subnet-group.go
│ │ ├── rds-db-subnet-group_test.go
│ │ ├── rds-option-group.go
│ │ ├── rds-option-group_test.go
│ │ ├── rds.go
│ │ ├── rds_test.go
│ │ ├── route53-health-check.go
│ │ ├── route53-health-check_test.go
│ │ ├── route53-hosted-zone.go
│ │ ├── route53-hosted-zone_test.go
│ │ ├── route53-resource-record-set.go
│ │ ├── route53-resource-record-set_test.go
│ │ ├── route53.go
│ │ ├── route53_test.go
│ │ ├── s3.go
│ │ ├── s3_test.go
│ │ ├── sns-data-protection-policy.go
│ │ ├── sns-data-protection-policy_test.go
│ │ ├── sns-endpoint.go
│ │ ├── sns-endpoint_test.go
│ │ ├── sns-platform-application.go
│ │ ├── sns-platform-application_test.go
│ │ ├── sns-subscription.go
│ │ ├── sns-subscription_test.go
│ │ ├── sns-topic.go
│ │ ├── sns-topic_test.go
│ │ ├── sns.go
│ │ ├── sqs-queue.go
│ │ ├── sqs-queue_test.go
│ │ ├── sqs.go
│ │ ├── ssm-parameter.go
│ │ ├── ssm-parameter_test.go
│ │ └── tracing.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ ├── docker-compose.yml
│ ├── main.go
│ ├── module/
│ │ ├── provider/
│ │ │ ├── .github/
│ │ │ │ └── workflows/
│ │ │ │ ├── finalize-copybara-sync.yml
│ │ │ │ ├── release.yml
│ │ │ │ └── tag-on-merge.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── LICENSE
│ │ │ ├── datasource_aws_external_id.go
│ │ │ ├── main.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ ├── resource_aws_source.go
│ │ │ └── terraform-registry-manifest.json
│ │ └── terraform/
│ │ ├── .github/
│ │ │ └── workflows/
│ │ │ ├── finalize-copybara-sync.yml
│ │ │ └── tag-on-merge.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── examples/
│ │ │ ├── multi-account/
│ │ │ │ └── main.tf
│ │ │ └── single-account/
│ │ │ └── main.tf
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── variables.tf
│ │ └── versions.tf
│ └── proc/
│ ├── proc.go
│ └── proc_test.go
├── cmd/
│ ├── auth_client.go
│ ├── auth_client_test.go
│ ├── bookmarks.go
│ ├── bookmarks_create_bookmark.go
│ ├── bookmarks_get_affected_bookmarks.go
│ ├── bookmarks_get_bookmark.go
│ ├── changes.go
│ ├── changes_end_change.go
│ ├── changes_get_change.go
│ ├── changes_get_change_test.go
│ ├── changes_get_signals.go
│ ├── changes_get_signals_test.go
│ ├── changes_list_changes.go
│ ├── changes_start_analysis.go
│ ├── changes_start_analysis_test.go
│ ├── changes_start_change.go
│ ├── changes_submit_plan.go
│ ├── changes_submit_plan_test.go
│ ├── changes_submit_signal.go
│ ├── changes_submit_signal_test.go
│ ├── explore.go
│ ├── explore_test.go
│ ├── flags.go
│ ├── flags_test.go
│ ├── integrations.go
│ ├── integrations_tfc.go
│ ├── invites.go
│ ├── invites_crud.go
│ ├── knowledge.go
│ ├── knowledge_dir_flag_test.go
│ ├── knowledge_list.go
│ ├── knowledge_list_test.go
│ ├── logging.go
│ ├── pterm.go
│ ├── repo.go
│ ├── repo_test.go
│ ├── request.go
│ ├── request_load.go
│ ├── request_query.go
│ ├── root.go
│ ├── root_test.go
│ ├── snapshots.go
│ ├── snapshots_create.go
│ ├── snapshots_get_snapshot.go
│ ├── terraform.go
│ ├── terraform_apply.go
│ ├── terraform_plan.go
│ ├── terraform_plan_test.go
│ ├── theme.go
│ ├── theme_darwin.go
│ ├── theme_linux.go
│ ├── theme_test.go
│ ├── theme_windows.go
│ ├── version_check.go
│ └── version_check_test.go
├── demos/
│ └── plan.tape
├── docs.overmind.tech/
│ └── docs/
│ └── sources/
│ ├── aws/
│ │ └── data/
│ │ ├── apigateway-api-key.json
│ │ ├── apigateway-authorizer.json
│ │ ├── apigateway-deployment.json
│ │ ├── apigateway-domain-name.json
│ │ ├── apigateway-integration.json
│ │ ├── apigateway-method-response.json
│ │ ├── apigateway-method.json
│ │ ├── apigateway-model.json
│ │ ├── apigateway-resource.json
│ │ ├── apigateway-rest-api.json
│ │ ├── apigateway-stage.json
│ │ ├── autoscaling-auto-scaling-group.json
│ │ ├── cloudfront-cache-policy.json
│ │ ├── cloudfront-continuous-deployment-policy.json
│ │ ├── cloudfront-distribution.json
│ │ ├── cloudfront-function.json
│ │ ├── cloudfront-key-group.json
│ │ ├── cloudfront-origin-access-control.json
│ │ ├── cloudfront-origin-request-policy.json
│ │ ├── cloudfront-realtime-log-config.json
│ │ ├── cloudfront-response-headers-policy.json
│ │ ├── cloudfront-streaming-distribution.json
│ │ ├── cloudwatch-alarm.json
│ │ ├── directconnect-connection.json
│ │ ├── directconnect-customer-metadata.json
│ │ ├── directconnect-direct-connect-gateway-association-proposal.json
│ │ ├── directconnect-direct-connect-gateway-association.json
│ │ ├── directconnect-direct-connect-gateway-attachment.json
│ │ ├── directconnect-direct-connect-gateway.json
│ │ ├── directconnect-hosted-connection.json
│ │ ├── directconnect-interconnect.json
│ │ ├── directconnect-lag.json
│ │ ├── directconnect-location.json
│ │ ├── directconnect-router-configuration.json
│ │ ├── directconnect-virtual-gateway.json
│ │ ├── directconnect-virtual-interface.json
│ │ ├── dynamodb-backup.json
│ │ ├── dynamodb-table.json
│ │ ├── ec2-address.json
│ │ ├── ec2-capacity-reservation-fleet.json
│ │ ├── ec2-capacity-reservation.json
│ │ ├── ec2-egress-only-internet-gateway.json
│ │ ├── ec2-iam-instance-profile-association.json
│ │ ├── ec2-image.json
│ │ ├── ec2-instance-event-window.json
│ │ ├── ec2-instance-status.json
│ │ ├── ec2-instance.json
│ │ ├── ec2-internet-gateway.json
│ │ ├── ec2-key-pair.json
│ │ ├── ec2-launch-template-version.json
│ │ ├── ec2-launch-template.json
│ │ ├── ec2-nat-gateway.json
│ │ ├── ec2-network-acl.json
│ │ ├── ec2-network-interface-permission.json
│ │ ├── ec2-network-interface.json
│ │ ├── ec2-placement-group.json
│ │ ├── ec2-reserved-instance.json
│ │ ├── ec2-route-table.json
│ │ ├── ec2-security-group-rule.json
│ │ ├── ec2-security-group.json
│ │ ├── ec2-snapshot.json
│ │ ├── ec2-subnet.json
│ │ ├── ec2-transit-gateway-route-table-association.json
│ │ ├── ec2-transit-gateway-route-table-propagation.json
│ │ ├── ec2-transit-gateway-route-table.json
│ │ ├── ec2-transit-gateway-route.json
│ │ ├── ec2-volume-status.json
│ │ ├── ec2-volume.json
│ │ ├── ec2-vpc-endpoint.json
│ │ ├── ec2-vpc-peering-connection.json
│ │ ├── ec2-vpc.json
│ │ ├── ecs-capacity-provider.json
│ │ ├── ecs-cluster.json
│ │ ├── ecs-container-instance.json
│ │ ├── ecs-service.json
│ │ ├── ecs-task-definition.json
│ │ ├── ecs-task.json
│ │ ├── efs-access-point.json
│ │ ├── efs-backup-policy.json
│ │ ├── efs-file-system.json
│ │ ├── efs-mount-target.json
│ │ ├── efs-replication-configuration.json
│ │ ├── eks-addon.json
│ │ ├── eks-cluster.json
│ │ ├── eks-fargate-profile.json
│ │ ├── eks-nodegroup.json
│ │ ├── elb-instance-health.json
│ │ ├── elb-load-balancer.json
│ │ ├── elbv2-listener.json
│ │ ├── elbv2-load-balancer.json
│ │ ├── elbv2-rule.json
│ │ ├── elbv2-target-group.json
│ │ ├── elbv2-target-health.json
│ │ ├── iam-group.json
│ │ ├── iam-instance-profile.json
│ │ ├── iam-policy.json
│ │ ├── iam-role.json
│ │ ├── iam-user.json
│ │ ├── kms-alias.json
│ │ ├── kms-custom-key-store.json
│ │ ├── kms-grant.json
│ │ ├── kms-key-policy.json
│ │ ├── kms-key.json
│ │ ├── lambda-event-source-mapping.json
│ │ ├── lambda-function.json
│ │ ├── lambda-layer-version.json
│ │ ├── lambda-layer.json
│ │ ├── network-firewall-firewall-policy.json
│ │ ├── network-firewall-firewall.json
│ │ ├── network-firewall-rule-group.json
│ │ ├── network-firewall-tls-inspection-configuration.json
│ │ ├── networkmanager-connect-attachment.json
│ │ ├── networkmanager-connect-peer-association.json
│ │ ├── networkmanager-connect-peer.json
│ │ ├── networkmanager-connection.json
│ │ ├── networkmanager-core-network-policy.json
│ │ ├── networkmanager-core-network.json
│ │ ├── networkmanager-device.json
│ │ ├── networkmanager-global-network.json
│ │ ├── networkmanager-link-association.json
│ │ ├── networkmanager-link.json
│ │ ├── networkmanager-network-resource-relationship.json
│ │ ├── networkmanager-site-to-site-vpn-attachment.json
│ │ ├── networkmanager-site.json
│ │ ├── networkmanager-transit-gateway-connect-peer-association.json
│ │ ├── networkmanager-transit-gateway-peering.json
│ │ ├── networkmanager-transit-gateway-registration.json
│ │ ├── networkmanager-transit-gateway-route-table-attachment.json
│ │ ├── networkmanager-vpc-attachment.json
│ │ ├── rds-db-cluster-parameter-group.json
│ │ ├── rds-db-cluster.json
│ │ ├── rds-db-instance.json
│ │ ├── rds-db-parameter-group.json
│ │ ├── rds-db-subnet-group.json
│ │ ├── rds-option-group.json
│ │ ├── route53-health-check.json
│ │ ├── route53-hosted-zone.json
│ │ ├── route53-resource-record-set.json
│ │ ├── s3-bucket.json
│ │ ├── sns-data-protection-policy.json
│ │ ├── sns-endpoint.json
│ │ ├── sns-platform-application.json
│ │ ├── sns-subscription.json
│ │ ├── sns-topic.json
│ │ ├── sqs-queue.json
│ │ └── ssm-parameter.json
│ ├── embed.go
│ ├── gcp/
│ │ └── data/
│ │ ├── gcp-ai-platform-batch-prediction-job.json
│ │ ├── gcp-ai-platform-custom-job.json
│ │ ├── gcp-ai-platform-endpoint.json
│ │ ├── gcp-ai-platform-model-deployment-monitoring-job.json
│ │ ├── gcp-ai-platform-model.json
│ │ ├── gcp-ai-platform-pipeline-job.json
│ │ ├── gcp-artifact-registry-docker-image.json
│ │ ├── gcp-big-query-data-transfer-transfer-config.json
│ │ ├── gcp-big-query-dataset.json
│ │ ├── gcp-big-query-routine.json
│ │ ├── gcp-big-query-table.json
│ │ ├── gcp-big-table-admin-app-profile.json
│ │ ├── gcp-big-table-admin-backup.json
│ │ ├── gcp-big-table-admin-cluster.json
│ │ ├── gcp-big-table-admin-instance.json
│ │ ├── gcp-big-table-admin-table.json
│ │ ├── gcp-certificate-manager-certificate.json
│ │ ├── gcp-cloud-billing-billing-info.json
│ │ ├── gcp-cloud-build-build.json
│ │ ├── gcp-cloud-functions-function.json
│ │ ├── gcp-cloud-kms-crypto-key-version.json
│ │ ├── gcp-cloud-kms-crypto-key.json
│ │ ├── gcp-cloud-kms-key-ring.json
│ │ ├── gcp-cloud-resource-manager-project.json
│ │ ├── gcp-cloud-resource-manager-tag-value.json
│ │ ├── gcp-compute-address.json
│ │ ├── gcp-compute-autoscaler.json
│ │ ├── gcp-compute-backend-service.json
│ │ ├── gcp-compute-disk.json
│ │ ├── gcp-compute-external-vpn-gateway.json
│ │ ├── gcp-compute-firewall.json
│ │ ├── gcp-compute-forwarding-rule.json
│ │ ├── gcp-compute-global-address.json
│ │ ├── gcp-compute-global-forwarding-rule.json
│ │ ├── gcp-compute-health-check.json
│ │ ├── gcp-compute-http-health-check.json
│ │ ├── gcp-compute-image.json
│ │ ├── gcp-compute-instance-group-manager.json
│ │ ├── gcp-compute-instance-group.json
│ │ ├── gcp-compute-instance-template.json
│ │ ├── gcp-compute-instance.json
│ │ ├── gcp-compute-instant-snapshot.json
│ │ ├── gcp-compute-machine-image.json
│ │ ├── gcp-compute-network-endpoint-group.json
│ │ ├── gcp-compute-network.json
│ │ ├── gcp-compute-node-group.json
│ │ ├── gcp-compute-node-template.json
│ │ ├── gcp-compute-project.json
│ │ ├── gcp-compute-public-delegated-prefix.json
│ │ ├── gcp-compute-region-commitment.json
│ │ ├── gcp-compute-regional-instance-group-manager.json
│ │ ├── gcp-compute-reservation.json
│ │ ├── gcp-compute-route.json
│ │ ├── gcp-compute-router.json
│ │ ├── gcp-compute-security-policy.json
│ │ ├── gcp-compute-snapshot.json
│ │ ├── gcp-compute-ssl-certificate.json
│ │ ├── gcp-compute-ssl-policy.json
│ │ ├── gcp-compute-subnetwork.json
│ │ ├── gcp-compute-target-http-proxy.json
│ │ ├── gcp-compute-target-https-proxy.json
│ │ ├── gcp-compute-target-pool.json
│ │ ├── gcp-compute-url-map.json
│ │ ├── gcp-compute-vpn-gateway.json
│ │ ├── gcp-compute-vpn-tunnel.json
│ │ ├── gcp-container-cluster.json
│ │ ├── gcp-container-node-pool.json
│ │ ├── gcp-dataflow-job.json
│ │ ├── gcp-dataform-repository.json
│ │ ├── gcp-dataplex-aspect-type.json
│ │ ├── gcp-dataplex-data-scan.json
│ │ ├── gcp-dataplex-entry-group.json
│ │ ├── gcp-dataproc-autoscaling-policy.json
│ │ ├── gcp-dataproc-cluster.json
│ │ ├── gcp-dns-managed-zone.json
│ │ ├── gcp-essential-contacts-contact.json
│ │ ├── gcp-file-instance.json
│ │ ├── gcp-iam-role.json
│ │ ├── gcp-iam-service-account-key.json
│ │ ├── gcp-iam-service-account.json
│ │ ├── gcp-logging-bucket.json
│ │ ├── gcp-logging-link.json
│ │ ├── gcp-logging-saved-query.json
│ │ ├── gcp-logging-sink.json
│ │ ├── gcp-monitoring-alert-policy.json
│ │ ├── gcp-monitoring-custom-dashboard.json
│ │ ├── gcp-monitoring-notification-channel.json
│ │ ├── gcp-orgpolicy-policy.json
│ │ ├── gcp-pub-sub-subscription.json
│ │ ├── gcp-pub-sub-topic.json
│ │ ├── gcp-redis-instance.json
│ │ ├── gcp-run-revision.json
│ │ ├── gcp-run-service.json
│ │ ├── gcp-secret-manager-secret.json
│ │ ├── gcp-security-center-management-security-center-service.json
│ │ ├── gcp-service-directory-endpoint.json
│ │ ├── gcp-service-usage-service.json
│ │ ├── gcp-spanner-database.json
│ │ ├── gcp-spanner-instance.json
│ │ ├── gcp-sql-admin-backup-run.json
│ │ ├── gcp-sql-admin-backup.json
│ │ ├── gcp-sql-admin-instance.json
│ │ ├── gcp-storage-bucket-iam-policy.json
│ │ ├── gcp-storage-bucket.json
│ │ └── gcp-storage-transfer-transfer-job.json
│ ├── k8s/
│ │ └── data/
│ │ ├── ClusterRole.json
│ │ ├── ClusterRoleBinding.json
│ │ ├── ConfigMap.json
│ │ ├── CronJob.json
│ │ ├── DaemonSet.json
│ │ ├── Deployment.json
│ │ ├── EndpointSlice.json
│ │ ├── Endpoints.json
│ │ ├── HorizontalPodAutoscaler.json
│ │ ├── Ingress.json
│ │ ├── Job.json
│ │ ├── LimitRange.json
│ │ ├── NetworkPolicy.json
│ │ ├── Node.json
│ │ ├── PersistentVolume.json
│ │ ├── PersistentVolumeClaim.json
│ │ ├── Pod.json
│ │ ├── PodDisruptionBudget.json
│ │ ├── PriorityClass.json
│ │ ├── ReplicaSet.json
│ │ ├── ReplicationController.json
│ │ ├── ResourceQuota.json
│ │ ├── Role.json
│ │ ├── RoleBinding.json
│ │ ├── Secret.json
│ │ ├── Service.json
│ │ ├── ServiceAccount.json
│ │ ├── StatefulSet.json
│ │ ├── StorageClass.json
│ │ └── VolumeAttachment.json
│ └── stdlib/
│ └── data/
│ ├── certificate.json
│ ├── dns.json
│ ├── http.json
│ ├── ip.json
│ ├── rdap-asn.json
│ ├── rdap-domain.json
│ ├── rdap-entity.json
│ ├── rdap-ip-network.json
│ └── rdap-nameserver.json
├── examples/
│ └── create-bookmark.json
├── go/
│ ├── audit/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── auth/
│ │ ├── auth.go
│ │ ├── auth_client.go
│ │ ├── auth_test.go
│ │ ├── context_aware_auth_test.go
│ │ ├── gcpauth.go
│ │ ├── mcpoauth.go
│ │ ├── mcpoauth_test.go
│ │ ├── middleware.go
│ │ ├── middleware_test.go
│ │ ├── nats.go
│ │ ├── nats_test.go
│ │ └── tracing.go
│ ├── cliauth/
│ │ ├── cliauth.go
│ │ └── cliauth_test.go
│ ├── discovery/
│ │ ├── adapter.go
│ │ ├── adapter_test.go
│ │ ├── adapterhost.go
│ │ ├── adapterhost_bench_test.go
│ │ ├── adapterhost_test.go
│ │ ├── cmd.go
│ │ ├── cmd_test.go
│ │ ├── doc.go
│ │ ├── engine.go
│ │ ├── engine_initerror_test.go
│ │ ├── engine_test.go
│ │ ├── enginerequests.go
│ │ ├── enginerequests_test.go
│ │ ├── execute_query_trace_test.go
│ │ ├── getfindmutex.go
│ │ ├── getfindmutex_test.go
│ │ ├── heartbeat.go
│ │ ├── heartbeat_test.go
│ │ ├── item_tests.go
│ │ ├── logs.go
│ │ ├── logs_test.go
│ │ ├── main_test.go
│ │ ├── nats_shared_test.go
│ │ ├── nats_watcher.go
│ │ ├── nats_watcher_test.go
│ │ ├── nil_publisher.go
│ │ ├── performance_test.go
│ │ ├── querytracker.go
│ │ ├── querytracker_test.go
│ │ ├── shared_test.go
│ │ └── tracing.go
│ ├── logging/
│ │ ├── logging.go
│ │ └── logging_test.go
│ ├── sdp-go/
│ │ ├── .gitignore
│ │ ├── account.go
│ │ ├── account.pb.go
│ │ ├── apikey.go
│ │ ├── apikeys.pb.go
│ │ ├── area51.pb.go
│ │ ├── auth0support.pb.go
│ │ ├── bookmarks.go
│ │ ├── bookmarks.pb.go
│ │ ├── cached_entry.pb.go
│ │ ├── changes.go
│ │ ├── changes.pb.go
│ │ ├── changes_test.go
│ │ ├── changetimeline.go
│ │ ├── changetimeline_test.go
│ │ ├── cli.pb.go
│ │ ├── compare.go
│ │ ├── config.pb.go
│ │ ├── connection.go
│ │ ├── connection_test.go
│ │ ├── encoder_test.go
│ │ ├── errors.go
│ │ ├── gateway.go
│ │ ├── gateway.pb.go
│ │ ├── gateway_test.go
│ │ ├── genhandler.go
│ │ ├── graph/
│ │ │ ├── main.go
│ │ │ └── main_test.go
│ │ ├── handler_cancelquery.go
│ │ ├── handler_gatewayresponse.go
│ │ ├── handler_natsgetlogrecordsrequest.go
│ │ ├── handler_natsgetlogrecordsresponse.go
│ │ ├── handler_query.go
│ │ ├── handler_queryresponse.go
│ │ ├── host_trust.go
│ │ ├── host_trust_test.go
│ │ ├── instance_detect.go
│ │ ├── invites.pb.go
│ │ ├── items.go
│ │ ├── items.pb.go
│ │ ├── items_test.go
│ │ ├── link_extract.go
│ │ ├── link_extract_test.go
│ │ ├── logs.go
│ │ ├── logs.pb.go
│ │ ├── logs_test.go
│ │ ├── progress.go
│ │ ├── progress_test.go
│ │ ├── proto_clone_test.go
│ │ ├── responses.go
│ │ ├── responses.pb.go
│ │ ├── revlink.pb.go
│ │ ├── sdpconnect/
│ │ │ ├── account.connect.go
│ │ │ ├── apikeys.connect.go
│ │ │ ├── area51.connect.go
│ │ │ ├── auth0support.connect.go
│ │ │ ├── bookmarks.connect.go
│ │ │ ├── changes.connect.go
│ │ │ ├── cli.connect.go
│ │ │ ├── config.connect.go
│ │ │ ├── invites.connect.go
│ │ │ ├── logs.connect.go
│ │ │ ├── revlink.connect.go
│ │ │ ├── signal.connect.go
│ │ │ └── snapshots.connect.go
│ │ ├── sdpws/
│ │ │ ├── client.go
│ │ │ ├── client_test.go
│ │ │ ├── messagehandler.go
│ │ │ └── utils.go
│ │ ├── signal.pb.go
│ │ ├── signals.go
│ │ ├── snapshots.go
│ │ ├── snapshots.pb.go
│ │ ├── test_utils.go
│ │ ├── test_utils_test.go
│ │ ├── tracing.go
│ │ ├── tracing_test.go
│ │ ├── util.go
│ │ ├── util.pb.go
│ │ ├── util_test.go
│ │ ├── validation.go
│ │ └── validation_test.go
│ ├── sdpcache/
│ │ ├── bolt.go
│ │ ├── boltstore.go
│ │ ├── boltstore_test.go
│ │ ├── cache.go
│ │ ├── cache_benchmark_test.go
│ │ ├── cache_contract_test.go
│ │ ├── cache_stuck_test.go
│ │ ├── cache_test.go
│ │ ├── item_generator_test.go
│ │ ├── lookup_coordinator.go
│ │ ├── memory.go
│ │ ├── memory_test.go
│ │ ├── noop_cache_test.go
│ │ ├── pending.go
│ │ ├── purger.go
│ │ ├── sharded.go
│ │ └── sharded_test.go
│ └── tracing/
│ ├── deferlog.go
│ ├── header_carrier.go
│ ├── main.go
│ ├── main_test.go
│ ├── memory.go
│ └── memory_test.go
├── go.mod
├── go.sum
├── gon-amd64.json
├── gon-arm64.json
├── k8s-source/
│ ├── acceptance/
│ │ └── nats-server.conf
│ ├── adapters/
│ │ ├── clusterrole.go
│ │ ├── clusterrole_test.go
│ │ ├── clusterrolebinding.go
│ │ ├── clusterrolebinding_test.go
│ │ ├── configmap.go
│ │ ├── configmap_test.go
│ │ ├── cronjob.go
│ │ ├── cronjob_test.go
│ │ ├── daemonset.go
│ │ ├── daemonset_test.go
│ │ ├── deployment.go
│ │ ├── deployment_test.go
│ │ ├── endpoints.go
│ │ ├── endpoints_test.go
│ │ ├── endpointslice.go
│ │ ├── endpointslice_test.go
│ │ ├── generic_source.go
│ │ ├── generic_source_test.go
│ │ ├── horizontalpodautoscaler.go
│ │ ├── horizontalpodautoscaler_test.go
│ │ ├── ingress.go
│ │ ├── ingress_test.go
│ │ ├── job.go
│ │ ├── job_test.go
│ │ ├── limitrange.go
│ │ ├── limitrange_test.go
│ │ ├── main.go
│ │ ├── networkpolicy.go
│ │ ├── networkpolicy_test.go
│ │ ├── node.go
│ │ ├── node_test.go
│ │ ├── persistentvolume.go
│ │ ├── persistentvolume_test.go
│ │ ├── persistentvolumeclaim.go
│ │ ├── persistentvolumeclaim_test.go
│ │ ├── poddisruptionbudget.go
│ │ ├── poddisruptionbudget_test.go
│ │ ├── pods.go
│ │ ├── pods_test.go
│ │ ├── priorityclass.go
│ │ ├── priorityclass_test.go
│ │ ├── replicaset.go
│ │ ├── replicaset_test.go
│ │ ├── replicationcontroller.go
│ │ ├── replicationcontroller_test.go
│ │ ├── resourcequota.go
│ │ ├── resourcequota_test.go
│ │ ├── role.go
│ │ ├── role_test.go
│ │ ├── rolebinding.go
│ │ ├── rolebinding_test.go
│ │ ├── secret.go
│ │ ├── secret_test.go
│ │ ├── service.go
│ │ ├── service_test.go
│ │ ├── serviceaccount.go
│ │ ├── serviceaccount_test.go
│ │ ├── shared_test.go
│ │ ├── shared_util.go
│ │ ├── shared_util_test.go
│ │ ├── statefulset.go
│ │ ├── statefulset_test.go
│ │ ├── storageclass.go
│ │ ├── storageclass_test.go
│ │ ├── volumeattachment.go
│ │ └── volumeattachment_test.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ ├── config.json
│ ├── cr.sh
│ ├── deployments/
│ │ └── overmind-kube-source/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── templates/
│ │ │ ├── NOTES.txt
│ │ │ ├── _helpers.tpl
│ │ │ ├── clusterrole.yaml
│ │ │ ├── clusterrolebinding.yaml
│ │ │ ├── configmap.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── poddisruptionbudget.yaml
│ │ │ ├── secret.yaml
│ │ │ └── serviceaccount.yaml
│ │ └── values.yaml
│ ├── main.go
│ └── proc/
│ └── proc.go
├── knowledge/
│ ├── discover.go
│ └── discover_test.go
├── main.go
├── main.tf
├── sources/
│ ├── aws/
│ │ ├── apigateway-api-key.go
│ │ ├── apigateway-stage.go
│ │ ├── base.go
│ │ ├── errors.go
│ │ ├── shared/
│ │ │ ├── item-types.go
│ │ │ └── models.go
│ │ └── validation_test.go
│ ├── azure/
│ │ ├── README.MD
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── clients/
│ │ │ ├── application-gateways-client.go
│ │ │ ├── application-security-groups-client.go
│ │ │ ├── availability-sets-client.go
│ │ │ ├── batch-accounts-client.go
│ │ │ ├── batch-application-client.go
│ │ │ ├── batch-application-package-client.go
│ │ │ ├── batch-pool-client.go
│ │ │ ├── batch-private-endpoint-connection-client.go
│ │ │ ├── blob-containers-client.go
│ │ │ ├── capacity-reservation-groups-client.go
│ │ │ ├── capacity-reservations-client.go
│ │ │ ├── compute-disk-access-private-endpoint-connection-client.go
│ │ │ ├── dbforpostgresql-configurations-client.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator-client.go
│ │ │ ├── dbforpostgresql-flexible-server-backup-client.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection-client.go
│ │ │ ├── dbforpostgresql-flexible-server-replica-client.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint-client.go
│ │ │ ├── ddos-protection-plans-client.go
│ │ │ ├── dedicated-host-groups-client.go
│ │ │ ├── dedicated-hosts-client.go
│ │ │ ├── default-security-rules-client.go
│ │ │ ├── disk-accesses-client.go
│ │ │ ├── disk-encryption-sets-client.go
│ │ │ ├── disks-client.go
│ │ │ ├── documentdb-database-accounts-client.go
│ │ │ ├── documentdb-private-endpoint-connection-client.go
│ │ │ ├── elastic-san-client.go
│ │ │ ├── elastic-san-volume-client.go
│ │ │ ├── elastic-san-volume-group-client.go
│ │ │ ├── elastic-san-volume-snapshot-client.go
│ │ │ ├── encryption-scopes-client.go
│ │ │ ├── federated-identity-credentials-client.go
│ │ │ ├── fileshares-client.go
│ │ │ ├── flow-logs-client.go
│ │ │ ├── galleries-client.go
│ │ │ ├── gallery-application-versions-client.go
│ │ │ ├── gallery-applications-client.go
│ │ │ ├── gallery-images-client.go
│ │ │ ├── images-client.go
│ │ │ ├── interface-ip-configurations-client.go
│ │ │ ├── ip-groups-client.go
│ │ │ ├── keyvault-key-client.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection-client.go
│ │ │ ├── load-balancer-backend-address-pools-client.go
│ │ │ ├── load-balancer-frontend-ip-configurations-client.go
│ │ │ ├── load-balancer-probes-client.go
│ │ │ ├── load-balancers-client.go
│ │ │ ├── local-network-gateways-client.go
│ │ │ ├── maintenance-configuration-client.go
│ │ │ ├── managed-hsms-client.go
│ │ │ ├── nat-gateways-client.go
│ │ │ ├── network-interfaces-client.go
│ │ │ ├── network-private-endpoint-client.go
│ │ │ ├── network-security-groups-client.go
│ │ │ ├── network-watchers-client.go
│ │ │ ├── operational-insights-workspace-client.go
│ │ │ ├── pager.go
│ │ │ ├── pager_mocks.go
│ │ │ ├── postgresql-databases-client.go
│ │ │ ├── postgresql-flexible-server-firewall-rule-client.go
│ │ │ ├── postgresql-flexible-servers-client.go
│ │ │ ├── private-dns-zones-client.go
│ │ │ ├── private-link-services-client.go
│ │ │ ├── proximity-placement-groups-client.go
│ │ │ ├── public-ip-addresses.go
│ │ │ ├── public-ip-prefixes-client.go
│ │ │ ├── queues-client.go
│ │ │ ├── record-sets-client.go
│ │ │ ├── role-assignments-client.go
│ │ │ ├── role-definitions-client.go
│ │ │ ├── route-tables-client.go
│ │ │ ├── routes-client.go
│ │ │ ├── secrets-client.go
│ │ │ ├── security-rules-client.go
│ │ │ ├── shared-gallery-images-client.go
│ │ │ ├── snapshots-client.go
│ │ │ ├── sql-database-schemas-client.go
│ │ │ ├── sql-databases-client.go
│ │ │ ├── sql-elastic-pool-client.go
│ │ │ ├── sql-failover-groups-client.go
│ │ │ ├── sql-server-firewall-rule-client.go
│ │ │ ├── sql-server-keys-client.go
│ │ │ ├── sql-server-private-endpoint-connection-client.go
│ │ │ ├── sql-server-virtual-network-rule-client.go
│ │ │ ├── sql-servers-client.go
│ │ │ ├── storage-accounts-client.go
│ │ │ ├── storage-private-endpoint-connection-client.go
│ │ │ ├── subnets-client.go
│ │ │ ├── tables-client.go
│ │ │ ├── user-assigned-identities-client.go
│ │ │ ├── vaults-client.go
│ │ │ ├── virtual-machine-extensions-client.go
│ │ │ ├── virtual-machine-run-commands-client.go
│ │ │ ├── virtual-machine-scale-sets-client.go
│ │ │ ├── virtual-machines-client.go
│ │ │ ├── virtual-network-gateway-connections-client.go
│ │ │ ├── virtual-network-gateways-client.go
│ │ │ ├── virtual-network-links-client.go
│ │ │ ├── virtual-network-peerings-client.go
│ │ │ ├── virtual-networks-client.go
│ │ │ └── zones-client.go
│ │ ├── cmd/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── docs/
│ │ │ ├── federated-credentials.md
│ │ │ ├── testing-federated-auth.md
│ │ │ └── usage.md
│ │ ├── integration-tests/
│ │ │ ├── README.md
│ │ │ ├── authorization-role-assignment_test.go
│ │ │ ├── authorization-role-definition_test.go
│ │ │ ├── batch-batch-accounts_test.go
│ │ │ ├── batch-batch-application-package_test.go
│ │ │ ├── batch-private-endpoint-connection_test.go
│ │ │ ├── compute-availability-set_test.go
│ │ │ ├── compute-capacity-reservation-group_test.go
│ │ │ ├── compute-dedicated-host-group_test.go
│ │ │ ├── compute-disk-access_test.go
│ │ │ ├── compute-disk-encryption-set_test.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-gallery-application-version_test.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-proximity-placement-group_test.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-virtual-machine-extension_test.go
│ │ │ ├── compute-virtual-machine-run-command_test.go
│ │ │ ├── compute-virtual-machine-scale-set_test.go
│ │ │ ├── compute-virtual-machine_test.go
│ │ │ ├── dbforpostgresql-database_test.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator_test.go
│ │ │ ├── dbforpostgresql-flexible-server-backup_test.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration_test.go
│ │ │ ├── dbforpostgresql-flexible-server-replica_test.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint_test.go
│ │ │ ├── dbforpostgresql-flexible-server_test.go
│ │ │ ├── documentdb-database-accounts_test.go
│ │ │ ├── elastic-san-volume_test.go
│ │ │ ├── helpers_test.go
│ │ │ ├── keyvault-managed-hsm_test.go
│ │ │ ├── keyvault-secret_test.go
│ │ │ ├── keyvault-vault_test.go
│ │ │ ├── keyvault_helpers_test.go
│ │ │ ├── main_test.go
│ │ │ ├── maintenance-maintenance-configuration_test.go
│ │ │ ├── managedidentity-federated-identity-credential_test.go
│ │ │ ├── managedidentity-user-assigned-identity_test.go
│ │ │ ├── network-application-gateway_test.go
│ │ │ ├── network-dns-virtual-network-link_test.go
│ │ │ ├── network-flow-log_test.go
│ │ │ ├── network-ip-group_test.go
│ │ │ ├── network-load-balancer-backend-address-pool_test.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration_test.go
│ │ │ ├── network-load-balancer-probe_test.go
│ │ │ ├── network-load-balancer_test.go
│ │ │ ├── network-local-network-gateway_test.go
│ │ │ ├── network-network-interface-ip-configuration_test.go
│ │ │ ├── network-network-interface_test.go
│ │ │ ├── network-network-security-group_test.go
│ │ │ ├── network-network-watcher_test.go
│ │ │ ├── network-private-link-service_test.go
│ │ │ ├── network-public-ip-address_test.go
│ │ │ ├── network-route-table_test.go
│ │ │ ├── network-virtual-network-gateway-connection_test.go
│ │ │ ├── network-virtual-network_test.go
│ │ │ ├── network-zone_test.go
│ │ │ ├── operational-insights-workspace_test.go
│ │ │ ├── sql-database-schema_test.go
│ │ │ ├── sql-database_test.go
│ │ │ ├── sql-server-failover-group_test.go
│ │ │ ├── sql-server-key_test.go
│ │ │ ├── sql-server_test.go
│ │ │ ├── storage-account_test.go
│ │ │ ├── storage-blob-container_test.go
│ │ │ ├── storage-fileshare_test.go
│ │ │ ├── storage-queues_test.go
│ │ │ └── storage-table_test.go
│ │ ├── main.go
│ │ ├── manual/
│ │ │ ├── README.md
│ │ │ ├── adapters.go
│ │ │ ├── authorization-role-assignment.go
│ │ │ ├── authorization-role-assignment_test.go
│ │ │ ├── authorization-role-definition.go
│ │ │ ├── authorization-role-definition_test.go
│ │ │ ├── batch-batch-accounts.go
│ │ │ ├── batch-batch-accounts_test.go
│ │ │ ├── batch-batch-application-package.go
│ │ │ ├── batch-batch-application-package_test.go
│ │ │ ├── batch-batch-application.go
│ │ │ ├── batch-batch-application_test.go
│ │ │ ├── batch-batch-pool.go
│ │ │ ├── batch-batch-pool_test.go
│ │ │ ├── batch-private-endpoint-connection.go
│ │ │ ├── batch-private-endpoint-connection_test.go
│ │ │ ├── compute-availability-set.go
│ │ │ ├── compute-availability-set_test.go
│ │ │ ├── compute-capacity-reservation-group.go
│ │ │ ├── compute-capacity-reservation-group_test.go
│ │ │ ├── compute-capacity-reservation.go
│ │ │ ├── compute-capacity-reservation_test.go
│ │ │ ├── compute-dedicated-host-group.go
│ │ │ ├── compute-dedicated-host-group_test.go
│ │ │ ├── compute-dedicated-host.go
│ │ │ ├── compute-dedicated-host_test.go
│ │ │ ├── compute-disk-access-private-endpoint-connection.go
│ │ │ ├── compute-disk-access-private-endpoint-connection_test.go
│ │ │ ├── compute-disk-access.go
│ │ │ ├── compute-disk-access_test.go
│ │ │ ├── compute-disk-encryption-set.go
│ │ │ ├── compute-disk-encryption-set_test.go
│ │ │ ├── compute-disk.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-gallery-application-version.go
│ │ │ ├── compute-gallery-application-version_test.go
│ │ │ ├── compute-gallery-application.go
│ │ │ ├── compute-gallery-application_test.go
│ │ │ ├── compute-gallery-image.go
│ │ │ ├── compute-gallery-image_test.go
│ │ │ ├── compute-gallery.go
│ │ │ ├── compute-gallery_test.go
│ │ │ ├── compute-image.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-proximity-placement-group.go
│ │ │ ├── compute-proximity-placement-group_test.go
│ │ │ ├── compute-shared-gallery-image.go
│ │ │ ├── compute-shared-gallery-image_test.go
│ │ │ ├── compute-snapshot.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-virtual-machine-extension.go
│ │ │ ├── compute-virtual-machine-extension_test.go
│ │ │ ├── compute-virtual-machine-run-command.go
│ │ │ ├── compute-virtual-machine-run-command_test.go
│ │ │ ├── compute-virtual-machine-scale-set.go
│ │ │ ├── compute-virtual-machine-scale-set_test.go
│ │ │ ├── compute-virtual-machine.go
│ │ │ ├── compute-virtual-machine_test.go
│ │ │ ├── dbforpostgresql-database.go
│ │ │ ├── dbforpostgresql-database_test.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator.go
│ │ │ ├── dbforpostgresql-flexible-server-administrator_test.go
│ │ │ ├── dbforpostgresql-flexible-server-backup.go
│ │ │ ├── dbforpostgresql-flexible-server-backup_test.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration.go
│ │ │ ├── dbforpostgresql-flexible-server-configuration_test.go
│ │ │ ├── dbforpostgresql-flexible-server-firewall-rule.go
│ │ │ ├── dbforpostgresql-flexible-server-firewall-rule_test.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection.go
│ │ │ ├── dbforpostgresql-flexible-server-private-endpoint-connection_test.go
│ │ │ ├── dbforpostgresql-flexible-server-replica.go
│ │ │ ├── dbforpostgresql-flexible-server-replica_test.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint.go
│ │ │ ├── dbforpostgresql-flexible-server-virtual-endpoint_test.go
│ │ │ ├── dbforpostgresql-flexible-server.go
│ │ │ ├── dbforpostgresql-flexible-server_test.go
│ │ │ ├── dns_links.go
│ │ │ ├── documentdb-database-accounts.go
│ │ │ ├── documentdb-database-accounts_test.go
│ │ │ ├── documentdb-private-endpoint-connection.go
│ │ │ ├── documentdb-private-endpoint-connection_test.go
│ │ │ ├── elastic-san-volume-group.go
│ │ │ ├── elastic-san-volume-group_test.go
│ │ │ ├── elastic-san-volume-snapshot.go
│ │ │ ├── elastic-san-volume-snapshot_test.go
│ │ │ ├── elastic-san-volume.go
│ │ │ ├── elastic-san-volume_test.go
│ │ │ ├── elastic-san.go
│ │ │ ├── elastic-san_test.go
│ │ │ ├── keyvault-key.go
│ │ │ ├── keyvault-key_test.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection.go
│ │ │ ├── keyvault-managed-hsm-private-endpoint-connection_test.go
│ │ │ ├── keyvault-managed-hsm.go
│ │ │ ├── keyvault-managed-hsm_test.go
│ │ │ ├── keyvault-secret.go
│ │ │ ├── keyvault-secret_test.go
│ │ │ ├── keyvault-vault.go
│ │ │ ├── keyvault-vault_test.go
│ │ │ ├── links_helpers.go
│ │ │ ├── maintenance-maintenance-configuration.go
│ │ │ ├── maintenance-maintenance-configuration_test.go
│ │ │ ├── managedidentity-federated-identity-credential.go
│ │ │ ├── managedidentity-federated-identity-credential_test.go
│ │ │ ├── managedidentity-user-assigned-identity.go
│ │ │ ├── managedidentity-user-assigned-identity_test.go
│ │ │ ├── network-application-gateway.go
│ │ │ ├── network-application-gateway_test.go
│ │ │ ├── network-application-security-group.go
│ │ │ ├── network-application-security-group_test.go
│ │ │ ├── network-ddos-protection-plan.go
│ │ │ ├── network-ddos-protection-plan_test.go
│ │ │ ├── network-default-security-rule.go
│ │ │ ├── network-default-security-rule_test.go
│ │ │ ├── network-dns-record-set.go
│ │ │ ├── network-dns-record-set_test.go
│ │ │ ├── network-dns-virtual-network-link.go
│ │ │ ├── network-dns-virtual-network-link_test.go
│ │ │ ├── network-flow-log.go
│ │ │ ├── network-flow-log_test.go
│ │ │ ├── network-ip-group.go
│ │ │ ├── network-ip-group_test.go
│ │ │ ├── network-load-balancer-backend-address-pool.go
│ │ │ ├── network-load-balancer-backend-address-pool_test.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration.go
│ │ │ ├── network-load-balancer-frontend-ip-configuration_test.go
│ │ │ ├── network-load-balancer-probe.go
│ │ │ ├── network-load-balancer-probe_test.go
│ │ │ ├── network-load-balancer.go
│ │ │ ├── network-load-balancer_test.go
│ │ │ ├── network-local-network-gateway.go
│ │ │ ├── network-local-network-gateway_test.go
│ │ │ ├── network-nat-gateway.go
│ │ │ ├── network-nat-gateway_test.go
│ │ │ ├── network-network-interface-ip-configuration.go
│ │ │ ├── network-network-interface-ip-configuration_test.go
│ │ │ ├── network-network-interface.go
│ │ │ ├── network-network-interface_test.go
│ │ │ ├── network-network-security-group.go
│ │ │ ├── network-network-security-group_test.go
│ │ │ ├── network-network-watcher.go
│ │ │ ├── network-network-watcher_test.go
│ │ │ ├── network-private-dns-zone.go
│ │ │ ├── network-private-dns-zone_test.go
│ │ │ ├── network-private-endpoint.go
│ │ │ ├── network-private-endpoint_test.go
│ │ │ ├── network-private-link-service.go
│ │ │ ├── network-private-link-service_test.go
│ │ │ ├── network-public-ip-address.go
│ │ │ ├── network-public-ip-address_test.go
│ │ │ ├── network-public-ip-prefix.go
│ │ │ ├── network-public-ip-prefix_test.go
│ │ │ ├── network-route-table.go
│ │ │ ├── network-route-table_test.go
│ │ │ ├── network-route.go
│ │ │ ├── network-route_test.go
│ │ │ ├── network-security-rule.go
│ │ │ ├── network-security-rule_test.go
│ │ │ ├── network-subnet.go
│ │ │ ├── network-subnet_test.go
│ │ │ ├── network-virtual-network-gateway-connection.go
│ │ │ ├── network-virtual-network-gateway-connection_test.go
│ │ │ ├── network-virtual-network-gateway.go
│ │ │ ├── network-virtual-network-gateway_test.go
│ │ │ ├── network-virtual-network-peering.go
│ │ │ ├── network-virtual-network-peering_test.go
│ │ │ ├── network-virtual-network.go
│ │ │ ├── network-virtual-network_test.go
│ │ │ ├── network-zone.go
│ │ │ ├── network-zone_test.go
│ │ │ ├── operational-insights-workspace.go
│ │ │ ├── operational-insights-workspace_test.go
│ │ │ ├── sql-database-schema.go
│ │ │ ├── sql-database-schema_test.go
│ │ │ ├── sql-database.go
│ │ │ ├── sql-database_test.go
│ │ │ ├── sql-elastic-pool.go
│ │ │ ├── sql-elastic-pool_test.go
│ │ │ ├── sql-server-failover-group.go
│ │ │ ├── sql-server-failover-group_test.go
│ │ │ ├── sql-server-firewall-rule.go
│ │ │ ├── sql-server-firewall-rule_test.go
│ │ │ ├── sql-server-key.go
│ │ │ ├── sql-server-key_test.go
│ │ │ ├── sql-server-private-endpoint-connection.go
│ │ │ ├── sql-server-private-endpoint-connection_test.go
│ │ │ ├── sql-server-virtual-network-rule.go
│ │ │ ├── sql-server-virtual-network-rule_test.go
│ │ │ ├── sql-server.go
│ │ │ ├── sql-server_test.go
│ │ │ ├── storage-account.go
│ │ │ ├── storage-account_test.go
│ │ │ ├── storage-blob-container.go
│ │ │ ├── storage-blob-container_test.go
│ │ │ ├── storage-encryption-scope.go
│ │ │ ├── storage-encryption-scope_test.go
│ │ │ ├── storage-fileshare.go
│ │ │ ├── storage-fileshare_test.go
│ │ │ ├── storage-private-endpoint-connection.go
│ │ │ ├── storage-private-endpoint-connection_test.go
│ │ │ ├── storage-queues.go
│ │ │ ├── storage-queues_test.go
│ │ │ ├── storage-table.go
│ │ │ └── storage-table_test.go
│ │ ├── proc/
│ │ │ ├── proc.go
│ │ │ └── proc_test.go
│ │ ├── setup_helper_script.sh
│ │ └── shared/
│ │ ├── adapter-meta.go
│ │ ├── azure-http-client.go
│ │ ├── base.go
│ │ ├── credentials.go
│ │ ├── errors.go
│ │ ├── item-types.go
│ │ ├── mocks/
│ │ │ ├── mock_application_gateways_client.go
│ │ │ ├── mock_application_security_groups_client.go
│ │ │ ├── mock_availability_sets_client.go
│ │ │ ├── mock_batch_accounts_client.go
│ │ │ ├── mock_batch_application_client.go
│ │ │ ├── mock_batch_application_package_client.go
│ │ │ ├── mock_batch_pool_client.go
│ │ │ ├── mock_batch_private_endpoint_connection_client.go
│ │ │ ├── mock_blob_containers_client.go
│ │ │ ├── mock_capacity_reservation_groups_client.go
│ │ │ ├── mock_capacity_reservations_client.go
│ │ │ ├── mock_compute_disk_access_private_endpoint_connection_client.go
│ │ │ ├── mock_dbforpostgresql_configurations_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_administrator_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_backup_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_private_endpoint_connection_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_replica_client.go
│ │ │ ├── mock_dbforpostgresql_flexible_server_virtual_endpoint_client.go
│ │ │ ├── mock_ddos_protection_plans_client.go
│ │ │ ├── mock_dedicated_host_groups_client.go
│ │ │ ├── mock_dedicated_hosts_client.go
│ │ │ ├── mock_default_security_rules_client.go
│ │ │ ├── mock_disk_accesses_client.go
│ │ │ ├── mock_disk_encryption_sets_client.go
│ │ │ ├── mock_disks_client.go
│ │ │ ├── mock_documentdb_database_accounts_client.go
│ │ │ ├── mock_documentdb_private_endpoint_connection_client.go
│ │ │ ├── mock_elastic_san_client.go
│ │ │ ├── mock_elastic_san_volume_client.go
│ │ │ ├── mock_elastic_san_volume_group_client.go
│ │ │ ├── mock_elastic_san_volume_snapshot_client.go
│ │ │ ├── mock_encryption_scopes_client.go
│ │ │ ├── mock_federated_identity_credentials_client.go
│ │ │ ├── mock_file_shares_client.go
│ │ │ ├── mock_flow_logs_client.go
│ │ │ ├── mock_galleries_client.go
│ │ │ ├── mock_gallery_application_versions_client.go
│ │ │ ├── mock_gallery_applications_client.go
│ │ │ ├── mock_gallery_images_client.go
│ │ │ ├── mock_images_client.go
│ │ │ ├── mock_interface_ip_configurations_client.go
│ │ │ ├── mock_ip_groups_client.go
│ │ │ ├── mock_keyvault_key_client.go
│ │ │ ├── mock_keyvault_managed_hsm_private_endpoint_connection_client.go
│ │ │ ├── mock_load_balancer_backend_address_pools_client.go
│ │ │ ├── mock_load_balancer_frontend_ip_configurations_client.go
│ │ │ ├── mock_load_balancer_probes_client.go
│ │ │ ├── mock_load_balancers_client.go
│ │ │ ├── mock_local_network_gateways_client.go
│ │ │ ├── mock_maintenance_configuration_client.go
│ │ │ ├── mock_managed_hsms_client.go
│ │ │ ├── mock_nat_gateways_client.go
│ │ │ ├── mock_network_interfaces_client.go
│ │ │ ├── mock_network_private_endpoint_client.go
│ │ │ ├── mock_network_security_groups_client.go
│ │ │ ├── mock_network_watchers_client.go
│ │ │ ├── mock_operational_insights_workspace_client.go
│ │ │ ├── mock_postgresql_databases_client.go
│ │ │ ├── mock_postgresql_flexible_server_firewall_rule_client.go
│ │ │ ├── mock_postgresql_flexible_servers_client.go
│ │ │ ├── mock_private_dns_zones_client.go
│ │ │ ├── mock_private_link_services_client.go
│ │ │ ├── mock_proximity_placement_groups_client.go
│ │ │ ├── mock_public_ip_addresses_client.go
│ │ │ ├── mock_public_ip_prefixes_client.go
│ │ │ ├── mock_queues_client.go
│ │ │ ├── mock_record_sets_client.go
│ │ │ ├── mock_role_assignments_client.go
│ │ │ ├── mock_role_definitions_client.go
│ │ │ ├── mock_route_tables_client.go
│ │ │ ├── mock_routes_client.go
│ │ │ ├── mock_secrets_client.go
│ │ │ ├── mock_security_rules_client.go
│ │ │ ├── mock_shared_gallery_images_client.go
│ │ │ ├── mock_snapshots_client.go
│ │ │ ├── mock_sql_database_schemas_client.go
│ │ │ ├── mock_sql_databases_client.go
│ │ │ ├── mock_sql_elastic_pool_client.go
│ │ │ ├── mock_sql_failover_groups_client.go
│ │ │ ├── mock_sql_server_firewall_rule_client.go
│ │ │ ├── mock_sql_server_keys_client.go
│ │ │ ├── mock_sql_server_private_endpoint_connection_client.go
│ │ │ ├── mock_sql_server_virtual_network_rule_client.go
│ │ │ ├── mock_sql_servers_client.go
│ │ │ ├── mock_storage_accounts_client.go
│ │ │ ├── mock_storage_accounts_pager.go
│ │ │ ├── mock_storage_private_endpoint_connection_client.go
│ │ │ ├── mock_subnets_client.go
│ │ │ ├── mock_tables_client.go
│ │ │ ├── mock_user_assigned_identities_client.go
│ │ │ ├── mock_vaults_client.go
│ │ │ ├── mock_virtual_machine_extensions_client.go
│ │ │ ├── mock_virtual_machine_run_commands_client.go
│ │ │ ├── mock_virtual_machine_scale_sets_client.go
│ │ │ ├── mock_virtual_machines_client.go
│ │ │ ├── mock_virtual_machines_pager.go
│ │ │ ├── mock_virtual_network_gateway_connections_client.go
│ │ │ ├── mock_virtual_network_gateways_client.go
│ │ │ ├── mock_virtual_network_links_client.go
│ │ │ ├── mock_virtual_network_peerings_client.go
│ │ │ ├── mock_virtual_networks_client.go
│ │ │ ├── mock_zones_client.go
│ │ │ └── pager_helpers.go
│ │ ├── models.go
│ │ ├── resource_id_item_type.go
│ │ ├── resource_id_item_type_test.go
│ │ ├── scope.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── example/
│ │ ├── base.go
│ │ ├── custom_searchable_listable.go
│ │ ├── errors.go
│ │ ├── metadata_test.go
│ │ ├── mocks/
│ │ │ └── mock_external_api_client.go
│ │ ├── shared/
│ │ │ └── models.go
│ │ ├── standard_searchable_listable.go
│ │ ├── standard_searchable_listable_test.go
│ │ └── validation_test.go
│ ├── gcp/
│ │ ├── README.md
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── cmd/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── dynamic/
│ │ │ ├── README.md
│ │ │ ├── adapter-listable.go
│ │ │ ├── adapter-searchable-listable.go
│ │ │ ├── adapter-searchable.go
│ │ │ ├── adapter.go
│ │ │ ├── adapter_test.go
│ │ │ ├── adapters/
│ │ │ │ ├── ai-platform-batch-prediction-job.go
│ │ │ │ ├── ai-platform-batch-prediction-job_test.go
│ │ │ │ ├── ai-platform-custom-job.go
│ │ │ │ ├── ai-platform-custom-job_test.go
│ │ │ │ ├── ai-platform-endpoint.go
│ │ │ │ ├── ai-platform-endpoint_test.go
│ │ │ │ ├── ai-platform-model-deployment-monitoring-job.go
│ │ │ │ ├── ai-platform-model-deployment-monitoring-job_test.go
│ │ │ │ ├── ai-platform-model.go
│ │ │ │ ├── ai-platform-model_test.go
│ │ │ │ ├── ai-platform-pipeline-job.go
│ │ │ │ ├── ai-platform-pipeline-job_test.go
│ │ │ │ ├── artifact-registry-docker-image.go
│ │ │ │ ├── artifact-registry-docker-image_test.go
│ │ │ │ ├── artifact-registry-repository.go
│ │ │ │ ├── big-query-data-transfer-transfer-config.go
│ │ │ │ ├── big-query-data-transfer-transfer-config_test.go
│ │ │ │ ├── big-table-admin-app-profile.go
│ │ │ │ ├── big-table-admin-app-profile_test.go
│ │ │ │ ├── big-table-admin-backup.go
│ │ │ │ ├── big-table-admin-backup_test.go
│ │ │ │ ├── big-table-admin-cluster.go
│ │ │ │ ├── big-table-admin-cluster_test.go
│ │ │ │ ├── big-table-admin-instance.go
│ │ │ │ ├── big-table-admin-instance_test.go
│ │ │ │ ├── big-table-admin-table.go
│ │ │ │ ├── big-table-admin-table_test.go
│ │ │ │ ├── cloud-billing-billing-info.go
│ │ │ │ ├── cloud-billing-billing-info_test.go
│ │ │ │ ├── cloud-build-build.go
│ │ │ │ ├── cloud-build-build_test.go
│ │ │ │ ├── cloud-resource-manager-project.go
│ │ │ │ ├── cloud-resource-manager-project_test.go
│ │ │ │ ├── cloud-resource-manager-tag-key.go
│ │ │ │ ├── cloud-resource-manager-tag-key_test.go
│ │ │ │ ├── cloud-resource-manager-tag-value.go
│ │ │ │ ├── cloud-resource-manager-tag-value_test.go
│ │ │ │ ├── cloudfunctions-function.go
│ │ │ │ ├── cloudfunctions-function_test.go
│ │ │ │ ├── compute-accelerator-type.go
│ │ │ │ ├── compute-disk-type.go
│ │ │ │ ├── compute-external-vpn-gateway.go
│ │ │ │ ├── compute-external-vpn-gateway_test.go
│ │ │ │ ├── compute-firewall.go
│ │ │ │ ├── compute-firewall_test.go
│ │ │ │ ├── compute-global-address.go
│ │ │ │ ├── compute-global-address_test.go
│ │ │ │ ├── compute-global-forwarding-rule.go
│ │ │ │ ├── compute-global-forwarding-rule_test.go
│ │ │ │ ├── compute-http-health-check.go
│ │ │ │ ├── compute-http-health-check_test.go
│ │ │ │ ├── compute-instance-template.go
│ │ │ │ ├── compute-instance-template_test.go
│ │ │ │ ├── compute-license.go
│ │ │ │ ├── compute-network-endpoint-group.go
│ │ │ │ ├── compute-network-endpoint-group_test.go
│ │ │ │ ├── compute-network.go
│ │ │ │ ├── compute-network_test.go
│ │ │ │ ├── compute-project.go
│ │ │ │ ├── compute-project_test.go
│ │ │ │ ├── compute-public-delegated-prefix.go
│ │ │ │ ├── compute-public-delegated-prefix_test.go
│ │ │ │ ├── compute-region-commitment.go
│ │ │ │ ├── compute-region-commitment_test.go
│ │ │ │ ├── compute-resource-policy.go
│ │ │ │ ├── compute-route.go
│ │ │ │ ├── compute-route_test.go
│ │ │ │ ├── compute-router.go
│ │ │ │ ├── compute-router_test.go
│ │ │ │ ├── compute-ssl-certificate.go
│ │ │ │ ├── compute-ssl-certificate_test.go
│ │ │ │ ├── compute-ssl-policy.go
│ │ │ │ ├── compute-ssl-policy_test.go
│ │ │ │ ├── compute-storage-pool.go
│ │ │ │ ├── compute-subnetwork.go
│ │ │ │ ├── compute-subnetwork_test.go
│ │ │ │ ├── compute-target-http-proxy.go
│ │ │ │ ├── compute-target-http-proxy_test.go
│ │ │ │ ├── compute-target-https-proxy.go
│ │ │ │ ├── compute-target-https-proxy_test.go
│ │ │ │ ├── compute-target-pool.go
│ │ │ │ ├── compute-target-pool_test.go
│ │ │ │ ├── compute-url-map.go
│ │ │ │ ├── compute-url-map_test.go
│ │ │ │ ├── compute-vpn-gateway.go
│ │ │ │ ├── compute-vpn-gateway_test.go
│ │ │ │ ├── compute-vpn-tunnel.go
│ │ │ │ ├── compute-vpn-tunnel_test.go
│ │ │ │ ├── container-cluster.go
│ │ │ │ ├── container-cluster_test.go
│ │ │ │ ├── container-node-pool.go
│ │ │ │ ├── container-node-pool_test.go
│ │ │ │ ├── dataflow-job.go
│ │ │ │ ├── dataflow-job_test.go
│ │ │ │ ├── dataform-repository.go
│ │ │ │ ├── dataform-repository_test.go
│ │ │ │ ├── dataplex-aspect-type.go
│ │ │ │ ├── dataplex-aspect-type_test.go
│ │ │ │ ├── dataplex-data-scan.go
│ │ │ │ ├── dataplex-data-scan_test.go
│ │ │ │ ├── dataplex-entry-group.go
│ │ │ │ ├── dataplex-entry-group_test.go
│ │ │ │ ├── dataproc-auto-scaling-policy.go
│ │ │ │ ├── dataproc-auto-scaling-policy_test.go
│ │ │ │ ├── dataproc-cluster.go
│ │ │ │ ├── dataproc-cluster_test.go
│ │ │ │ ├── dns-managed-zone.go
│ │ │ │ ├── dns-managed-zone_test.go
│ │ │ │ ├── essential-contacts-contact.go
│ │ │ │ ├── essential-contacts-contact_test.go
│ │ │ │ ├── eventarc-trigger.go
│ │ │ │ ├── eventarc-trigger_test.go
│ │ │ │ ├── file-instance.go
│ │ │ │ ├── file-instance_test.go
│ │ │ │ ├── iam-role.go
│ │ │ │ ├── iam-role_test.go
│ │ │ │ ├── logging-bucket.go
│ │ │ │ ├── logging-bucket_test.go
│ │ │ │ ├── logging-link.go
│ │ │ │ ├── logging-link_test.go
│ │ │ │ ├── logging-saved-query.go
│ │ │ │ ├── logging-saved-query_test.go
│ │ │ │ ├── models.go
│ │ │ │ ├── monitoring-alert-policy.go
│ │ │ │ ├── monitoring-alert-policy_test.go
│ │ │ │ ├── monitoring-custom-dashboard.go
│ │ │ │ ├── monitoring-custom-dashboard_test.go
│ │ │ │ ├── monitoring-notification-channel.go
│ │ │ │ ├── monitoring-notification-channel_test.go
│ │ │ │ ├── orgpolicy-policy.go
│ │ │ │ ├── orgpolicy-policy_test.go
│ │ │ │ ├── pubsub-subscription.go
│ │ │ │ ├── pubsub-subscription_test.go
│ │ │ │ ├── pubsub-topic.go
│ │ │ │ ├── pubsub-topic_test.go
│ │ │ │ ├── redis-instance.go
│ │ │ │ ├── redis-instance_test.go
│ │ │ │ ├── run-revision.go
│ │ │ │ ├── run-revision_test.go
│ │ │ │ ├── run-service.go
│ │ │ │ ├── run-service_test.go
│ │ │ │ ├── run-worker-pool.go
│ │ │ │ ├── secret-manager-secret.go
│ │ │ │ ├── secret-manager-secret_test.go
│ │ │ │ ├── security-center-management-security-center-service.go
│ │ │ │ ├── security-center-management-security-center-service_test.go
│ │ │ │ ├── service-directory-endpoint.go
│ │ │ │ ├── service-directory-endpoint_test.go
│ │ │ │ ├── service-directory-service.go
│ │ │ │ ├── service-usage-service.go
│ │ │ │ ├── service-usage-service_test.go
│ │ │ │ ├── spanner-backup.go
│ │ │ │ ├── spanner-database.go
│ │ │ │ ├── spanner-database_test.go
│ │ │ │ ├── spanner-instance-config.go
│ │ │ │ ├── spanner-instance.go
│ │ │ │ ├── spanner-instance_test.go
│ │ │ │ ├── sql-admin-backup-run.go
│ │ │ │ ├── sql-admin-backup-run_test.go
│ │ │ │ ├── sql-admin-backup.go
│ │ │ │ ├── sql-admin-backup_test.go
│ │ │ │ ├── sql-admin-instance.go
│ │ │ │ ├── sql-admin-instance_test.go
│ │ │ │ ├── storage-bucket.go
│ │ │ │ ├── storage-bucket_test.go
│ │ │ │ ├── storage-transfer-transfer-job.go
│ │ │ │ └── storage-transfer-transfer-job_test.go
│ │ │ ├── adapters.go
│ │ │ ├── adapters_test.go
│ │ │ ├── ai-tools/
│ │ │ │ ├── README.md
│ │ │ │ ├── build.sh
│ │ │ │ ├── generate-adapter-ticket-cmd/
│ │ │ │ │ └── main.go
│ │ │ │ └── generate-test-ticket-cmd/
│ │ │ │ └── main.go
│ │ │ ├── errors.go
│ │ │ ├── shared.go
│ │ │ ├── shared_test.go
│ │ │ └── testing.go
│ │ ├── integration-tests/
│ │ │ ├── README.md
│ │ │ ├── big-query-model_test.go
│ │ │ ├── compute-address_test.go
│ │ │ ├── compute-autoscaler_test.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-forwarding-rule_test.go
│ │ │ ├── compute-healthcheck_test.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-instance-group-manager_test.go
│ │ │ ├── compute-instance-group_test.go
│ │ │ ├── compute-instance_test.go
│ │ │ ├── compute-instant-snapshot_test.go
│ │ │ ├── compute-machine-image_test.go
│ │ │ ├── compute-network_test.go
│ │ │ ├── compute-node-group_test.go
│ │ │ ├── compute-reservation_test.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── compute-subnetwork_test.go
│ │ │ ├── computer-instance-template_test.go
│ │ │ ├── kms_vs_asset_inventory_test.go
│ │ │ ├── main_test.go
│ │ │ ├── network-tags_test.go
│ │ │ ├── service-account-impersonation_test.go
│ │ │ ├── spanner-database_test.go
│ │ │ └── spanner-instance_test.go
│ │ ├── main.go
│ │ ├── manual/
│ │ │ ├── README.md
│ │ │ ├── adapters.go
│ │ │ ├── big-query-dataset.go
│ │ │ ├── big-query-dataset_test.go
│ │ │ ├── big-query-model.go
│ │ │ ├── big-query-model_test.go
│ │ │ ├── big-query-routine.go
│ │ │ ├── big-query-routine_test.go
│ │ │ ├── big-query-table.go
│ │ │ ├── big-query-table_test.go
│ │ │ ├── certificate-manager-certificate.go
│ │ │ ├── certificate-manager-certificate_test.go
│ │ │ ├── cloud-kms-crypto-key-version.go
│ │ │ ├── cloud-kms-crypto-key-version_test.go
│ │ │ ├── cloud-kms-crypto-key.go
│ │ │ ├── cloud-kms-crypto-key_test.go
│ │ │ ├── cloud-kms-key-ring.go
│ │ │ ├── cloud-kms-key-ring_test.go
│ │ │ ├── compute-address.go
│ │ │ ├── compute-address_test.go
│ │ │ ├── compute-autoscaler.go
│ │ │ ├── compute-autoscaler_test.go
│ │ │ ├── compute-backend-service.go
│ │ │ ├── compute-backend-service_test.go
│ │ │ ├── compute-disk.go
│ │ │ ├── compute-disk_test.go
│ │ │ ├── compute-forwarding-rule.go
│ │ │ ├── compute-forwarding-rule_test.go
│ │ │ ├── compute-healthcheck.go
│ │ │ ├── compute-healthcheck_test.go
│ │ │ ├── compute-image.go
│ │ │ ├── compute-image_test.go
│ │ │ ├── compute-instance-group-manager-shared.go
│ │ │ ├── compute-instance-group-manager.go
│ │ │ ├── compute-instance-group-manager_test.go
│ │ │ ├── compute-instance-group.go
│ │ │ ├── compute-instance-group_test.go
│ │ │ ├── compute-instance.go
│ │ │ ├── compute-instance_test.go
│ │ │ ├── compute-instant-snapshot.go
│ │ │ ├── compute-instant-snapshot_test.go
│ │ │ ├── compute-machine-image.go
│ │ │ ├── compute-machine-image_test.go
│ │ │ ├── compute-node-group.go
│ │ │ ├── compute-node-group_test.go
│ │ │ ├── compute-node-template.go
│ │ │ ├── compute-node-template_test.go
│ │ │ ├── compute-region-instance-group-manager.go
│ │ │ ├── compute-region-instance-group-manager_test.go
│ │ │ ├── compute-reservation.go
│ │ │ ├── compute-reservation_test.go
│ │ │ ├── compute-security-policy.go
│ │ │ ├── compute-security-policy_test.go
│ │ │ ├── compute-snapshot.go
│ │ │ ├── compute-snapshot_test.go
│ │ │ ├── iam-service-account-key.go
│ │ │ ├── iam-service-account-key_test.go
│ │ │ ├── iam-service-account.go
│ │ │ ├── iam-service-account_test.go
│ │ │ ├── logging-sink.go
│ │ │ ├── logging-sink_test.go
│ │ │ ├── storage-bucket-iam-policy.go
│ │ │ └── storage-bucket-iam-policy_test.go
│ │ ├── proc/
│ │ │ ├── proc.go
│ │ │ └── proc_test.go
│ │ ├── setup/
│ │ │ ├── README.md
│ │ │ ├── scripts/
│ │ │ │ ├── overmind-gcp-roles.sh
│ │ │ │ ├── overmind-gcp-source-permission-check.sh
│ │ │ │ ├── overmind-gcp-source-setup-impersonation.sh
│ │ │ │ └── overmind-gcp-source-setup.sh
│ │ │ └── tutorial.md
│ │ └── shared/
│ │ ├── adapter-meta.go
│ │ ├── adapter-meta_test.go
│ │ ├── base.go
│ │ ├── big-query-clients.go
│ │ ├── certificate-manager-clients.go
│ │ ├── compute-clients.go
│ │ ├── cross_project_linking_test.go
│ │ ├── errors.go
│ │ ├── gcp-http-client.go
│ │ ├── iam-clients.go
│ │ ├── init_test.go
│ │ ├── item-types.go
│ │ ├── kms-asset-loader.go
│ │ ├── link-rules.go
│ │ ├── linker.go
│ │ ├── linker_test.go
│ │ ├── location_info.go
│ │ ├── location_info_test.go
│ │ ├── logging-clients.go
│ │ ├── manual-adapter-links.go
│ │ ├── manual-adapter-links_test.go
│ │ ├── mocks/
│ │ │ ├── mock_big_query_dataset_client.go
│ │ │ ├── mock_certificate_manager_certificate_client.go
│ │ │ ├── mock_compute_instance_client.go
│ │ │ ├── mock_iam_clients.go
│ │ │ └── mock_logging_config_client.go
│ │ ├── models.go
│ │ ├── network-security-clients.go
│ │ ├── predefined-roles.go
│ │ ├── storage-iam.go
│ │ ├── terraform-mappings.go
│ │ ├── terraform-mappings_test.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── shared/
│ │ ├── base.go
│ │ ├── shared.go
│ │ ├── testing.go
│ │ ├── util.go
│ │ └── util_test.go
│ ├── snapshot/
│ │ ├── README.md
│ │ ├── adapters/
│ │ │ ├── adapter.go
│ │ │ ├── adapter_test.go
│ │ │ ├── catalog.go
│ │ │ ├── index.go
│ │ │ ├── index_test.go
│ │ │ ├── loader.go
│ │ │ ├── loader_test.go
│ │ │ └── main.go
│ │ ├── build/
│ │ │ └── package/
│ │ │ └── Dockerfile
│ │ ├── cmd/
│ │ │ └── root.go
│ │ └── main.go
│ ├── stdlib/
│ │ ├── items.go
│ │ └── shared/
│ │ └── models.go
│ ├── transformer.go
│ └── transformer_test.go
├── stdlib-source/
│ ├── adapters/
│ │ ├── certificate.go
│ │ ├── certificate_test.go
│ │ ├── dns.go
│ │ ├── dns_test.go
│ │ ├── http.go
│ │ ├── http_test.go
│ │ ├── ip.go
│ │ ├── ip_cache.go
│ │ ├── ip_cache_test.go
│ │ ├── ip_test.go
│ │ ├── main.go
│ │ ├── main_test.go
│ │ ├── rdap-asn.go
│ │ ├── rdap-asn_test.go
│ │ ├── rdap-domain.go
│ │ ├── rdap-domain_test.go
│ │ ├── rdap-entity.go
│ │ ├── rdap-entity_test.go
│ │ ├── rdap-ip-network.go
│ │ ├── rdap-ip-network_test.go
│ │ ├── rdap-nameserver.go
│ │ ├── rdap-nameserver_test.go
│ │ └── test/
│ │ ├── data.go
│ │ ├── testdog.go
│ │ ├── testfood.go
│ │ ├── testgroup.go
│ │ ├── testhobby.go
│ │ ├── testlocation.go
│ │ ├── testperson.go
│ │ └── testregion.go
│ ├── build/
│ │ └── package/
│ │ └── Dockerfile
│ ├── cmd/
│ │ └── root.go
│ └── main.go
└── tfutils/
├── aws_config.go
├── aws_config_test.go
├── azure_config.go
├── azure_config_test.go
├── gcp_config.go
├── gcp_config_test.go
├── plan.go
├── plan_mapper.go
├── plan_mapper_test.go
├── repo_to_scope.go
├── repo_to_scope_test.go
└── testdata/
├── binary-plan.tfplan
├── config_from_provider/
│ ├── ca-bundle.crt
│ └── test.tf
├── invalid_vars.tfvars
├── plan.json
├── providers.tf
├── state.json
├── subfolder/
│ └── more_providers.tf
├── test_vars.tfvars
└── tfvars.json
Showing preview only (1,476K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (13870 symbols across 1463 files)
FILE: aws-source/adapters/adapterhelpers_always_get_source.go
type MaxParallel (line 19) | type MaxParallel
method Value (line 22) | func (m MaxParallel) Value() int {
type AlwaysGetAdapter (line 36) | type AlwaysGetAdapter struct
method cacheDuration (line 86) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Validate (line 95) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Type (line 121) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Name (line 125) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Metadata (line 129) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Scopes (line 135) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Get (line 141) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method ListStream (line 186) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method listInternal (line 226) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method SearchStream (line 307) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method SearchCustom (line 339) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method SearchARN (line 405) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
method Weight (line 453) | func (s *AlwaysGetAdapter[ListInput, ListOutput, GetInput, GetOutput, Cl...
FILE: aws-source/adapters/adapterhelpers_always_get_source_test.go
function TestMaxParallel (line 15) | func TestMaxParallel(t *testing.T) {
function TestAlwaysGetSourceType (line 23) | func TestAlwaysGetSourceType(t *testing.T) {
function TestAlwaysGetSourceName (line 33) | func TestAlwaysGetSourceName(t *testing.T) {
function TestAlwaysGetSourceScopes (line 43) | func TestAlwaysGetSourceScopes(t *testing.T) {
function TestAlwaysGetSourceGet (line 54) | func TestAlwaysGetSourceGet(t *testing.T) {
function TestAlwaysGetSourceList (line 123) | func TestAlwaysGetSourceList(t *testing.T) {
function TestAlwaysGetSourceSearch (line 253) | func TestAlwaysGetSourceSearch(t *testing.T) {
function TestAlwaysGetSourceCaching (line 477) | func TestAlwaysGetSourceCaching(t *testing.T) {
FILE: aws-source/adapters/adapterhelpers_describe_source.go
constant DefaultCacheDuration (line 19) | DefaultCacheDuration = 5 * time.Minute
type DescribeOnlyAdapter (line 25) | type DescribeOnlyAdapter struct
method cacheDuration (line 102) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) cach...
method Validate (line 112) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Vali...
method Paginated (line 133) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Pagi...
method Type (line 137) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Type...
method Name (line 141) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Name...
method Metadata (line 145) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Meta...
method Scopes (line 151) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Scop...
method Get (line 162) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Get(...
method ListStream (line 265) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) List...
method SearchStream (line 324) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Sear...
method searchARN (line 340) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) sear...
method searchCustom (line 383) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) sear...
method processError (line 413) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) proc...
method describe (line 431) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) desc...
method Weight (line 518) | func (s *DescribeOnlyAdapter[Input, Output, ClientStruct, Options]) Weig...
FILE: aws-source/adapters/adapterhelpers_describe_source_test.go
function TestType (line 16) | func TestType(t *testing.T) {
function TestName (line 27) | func TestName(t *testing.T) {
function TestScopes (line 39) | func TestScopes(t *testing.T) {
function TestGet (line 57) | func TestGet(t *testing.T) {
function TestSearchARN (line 242) | func TestSearchARN(t *testing.T) {
function TestSearchCustom (line 278) | func TestSearchCustom(t *testing.T) {
function TestNoInputMapper (line 350) | func TestNoInputMapper(t *testing.T) {
function TestNoOutputMapper (line 384) | func TestNoOutputMapper(t *testing.T) {
function TestNoDescribeFunc (line 419) | func TestNoDescribeFunc(t *testing.T) {
function TestFailingInputMapper (line 456) | func TestFailingInputMapper(t *testing.T) {
function TestFailingOutputMapper (line 507) | func TestFailingOutputMapper(t *testing.T) {
function TestFailingDescribeFunc (line 556) | func TestFailingDescribeFunc(t *testing.T) {
type TestPaginator (line 607) | type TestPaginator struct
method HasMorePages (line 615) | func (t *TestPaginator) HasMorePages() bool {
method NextPage (line 622) | func (t *TestPaginator) NextPage(context.Context, ...func(struct{})) (...
function TestPaginated (line 628) | func TestPaginated(t *testing.T) {
function TestDescribeOnlySourceCaching (line 682) | func TestDescribeOnlySourceCaching(t *testing.T) {
function TestListCachingZeroItems (line 857) | func TestListCachingZeroItems(t *testing.T) {
FILE: aws-source/adapters/adapterhelpers_get_list_adapter_v2.go
type GetListAdapterV2 (line 18) | type GetListAdapterV2 struct
method cacheDuration (line 70) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Validate (line 79) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Type (line 105) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Name (line 109) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Metadata (line 113) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Scopes (line 119) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method hasScope (line 132) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method Get (line 145) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method ListStream (line 196) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
method SearchStream (line 321) | func (s *GetListAdapterV2[ListInput, ListOutput, AWSItem, ClientStruct, ...
FILE: aws-source/adapters/adapterhelpers_get_list_adapter_v2_test.go
function TestGetListAdapterV2Type (line 15) | func TestGetListAdapterV2Type(t *testing.T) {
function TestGetListAdapterV2Name (line 25) | func TestGetListAdapterV2Name(t *testing.T) {
function TestGetListAdapterV2Scopes (line 35) | func TestGetListAdapterV2Scopes(t *testing.T) {
function TestGetListAdapterV2Get (line 46) | func TestGetListAdapterV2Get(t *testing.T) {
function TestGetListAdapterV2ListStream (line 115) | func TestGetListAdapterV2ListStream(t *testing.T) {
type MockPaginator (line 223) | type MockPaginator struct
method HasMorePages (line 229) | func (p *MockPaginator) HasMorePages() bool {
method NextPage (line 233) | func (p *MockPaginator) NextPage(ctx context.Context, opts ...func(str...
function TestListFuncPaginatorBuilder (line 242) | func TestListFuncPaginatorBuilder(t *testing.T) {
function TestGetListAdapterV2Caching (line 294) | func TestGetListAdapterV2Caching(t *testing.T) {
function TestGetListAdapterV2_ListExtractorErrorNoNotFoundCache (line 414) | func TestGetListAdapterV2_ListExtractorErrorNoNotFoundCache(t *testing.T) {
FILE: aws-source/adapters/adapterhelpers_get_list_source.go
type GetListAdapter (line 17) | type GetListAdapter struct
method cacheDuration (line 51) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) cacheDuration()...
method Validate (line 60) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Validate() error {
method Type (line 78) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Type() string {
method Name (line 82) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Name() string {
method Metadata (line 86) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Metadata() *sdp...
method Scopes (line 92) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Scopes() []stri...
method hasScope (line 105) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) hasScope(scope ...
method Get (line 118) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Get(ctx context...
method List (line 169) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) List(ctx contex...
method Search (line 243) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Search(ctx cont...
method SearchARN (line 260) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) SearchARN(ctx c...
method SearchCustom (line 305) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) SearchCustom(ct...
method Weight (line 361) | func (s *GetListAdapter[AWSItem, ClientStruct, Options]) Weight() int {
FILE: aws-source/adapters/adapterhelpers_get_list_source_test.go
function TestGetListSourceType (line 14) | func TestGetListSourceType(t *testing.T) {
function TestGetListSourceName (line 24) | func TestGetListSourceName(t *testing.T) {
function TestGetListSourceScopes (line 34) | func TestGetListSourceScopes(t *testing.T) {
function TestGetListSourceGet (line 45) | func TestGetListSourceGet(t *testing.T) {
function TestGetListSourceList (line 123) | func TestGetListSourceList(t *testing.T) {
function TestGetListSourceSearch (line 208) | func TestGetListSourceSearch(t *testing.T) {
function TestGetListSourceCaching (line 251) | func TestGetListSourceCaching(t *testing.T) {
FILE: aws-source/adapters/adapterhelpers_notfound_cache_test.go
function TestGetListAdapterV2_GetNotFoundCaching (line 14) | func TestGetListAdapterV2_GetNotFoundCaching(t *testing.T) {
function TestGetListAdapterV2_ListNotFoundCaching (line 88) | func TestGetListAdapterV2_ListNotFoundCaching(t *testing.T) {
function TestGetListAdapter_GetNotFoundCaching (line 165) | func TestGetListAdapter_GetNotFoundCaching(t *testing.T) {
function TestGetListAdapter_ListNotFoundCaching (line 237) | func TestGetListAdapter_ListNotFoundCaching(t *testing.T) {
function TestAlwaysGetAdapter_GetNotFoundCaching (line 305) | func TestAlwaysGetAdapter_GetNotFoundCaching(t *testing.T) {
function TestDescribeOnlyAdapter_ListNotFoundCaching (line 375) | func TestDescribeOnlyAdapter_ListNotFoundCaching(t *testing.T) {
type MockClient (line 440) | type MockClient struct
type MockInput (line 441) | type MockInput struct
type MockOutput (line 442) | type MockOutput struct
type MockGetInput (line 443) | type MockGetInput struct
type MockGetOutput (line 444) | type MockGetOutput struct
type MockOptions (line 445) | type MockOptions struct
type testQueryResultStream (line 448) | type testQueryResultStream struct
method SendItem (line 453) | func (s *testQueryResultStream) SendItem(item *sdp.Item) {
method SendError (line 457) | func (s *testQueryResultStream) SendError(err error) {
function TestNotFoundCacheExpiry (line 470) | func TestNotFoundCacheExpiry(t *testing.T) {
function TestNotFoundCacheIgnoreCache (line 535) | func TestNotFoundCacheIgnoreCache(t *testing.T) {
function TestNotFoundCacheDifferentQueries (line 596) | func TestNotFoundCacheDifferentQueries(t *testing.T) {
function TestGetListAdapter_ListItemMapperErrorNoNotFoundCache (line 664) | func TestGetListAdapter_ListItemMapperErrorNoNotFoundCache(t *testing.T) {
function TestGetListAdapter_SearchCustomItemMapperErrorNoNotFoundCache (line 735) | func TestGetListAdapter_SearchCustomItemMapperErrorNoNotFoundCache(t *te...
FILE: aws-source/adapters/adapterhelpers_shared_tests.go
type Subnet (line 15) | type Subnet struct
type VPCConfig (line 21) | type VPCConfig struct
method Cleanup (line 45) | func (v *VPCConfig) Cleanup(f func()) {
method RunCleanup (line 49) | func (v *VPCConfig) RunCleanup() {
method Fetch (line 60) | func (v *VPCConfig) Fetch(client *ec2.Client) error {
method CreateGateway (line 93) | func (v *VPCConfig) CreateGateway(client *ec2.Client) error {
function retry (line 170) | func retry(attempts int, sleep time.Duration, f func() error) (err error) {
type QueryTest (line 184) | type QueryTest struct
type QueryTests (line 191) | type QueryTests
method Execute (line 193) | func (i QueryTests) Execute(t *testing.T, item *sdp.Item) {
function lirMatches (line 211) | func lirMatches(test QueryTest, req *sdp.Query) bool {
function CheckQuery (line 219) | func CheckQuery(t *testing.T, item *sdp.Query, itemName string, expected...
FILE: aws-source/adapters/adapterhelpers_sources.go
constant DefaultMaxResultsPerPage (line 5) | DefaultMaxResultsPerPage = 100
type ClientStructType (line 13) | type ClientStructType
type InputType (line 18) | type InputType
type OutputType (line 24) | type OutputType
type OptionsType (line 29) | type OptionsType
type AWSItemType (line 33) | type AWSItemType
type Paginator (line 39) | type Paginator interface
FILE: aws-source/adapters/adapterhelpers_util.go
function FormatScope (line 31) | func FormatScope(accountID, region string) string {
function ParseScope (line 44) | func ParseScope(scope string) (string, string, error) {
function CanRetry (line 57) | func CanRetry(err *sdp.QueryError) bool {
type ARN (line 72) | type ARN struct
method ResourceID (line 80) | func (a *ARN) ResourceID() string {
method Type (line 95) | func (a *ARN) Type() string {
method IAMWildcardMatches (line 114) | func (a *ARN) IAMWildcardMatches(arn string) bool {
method ContainsWildcard (line 160) | func (a *ARN) ContainsWildcard() bool {
function ParseARN (line 168) | func ParseARN(arnString string) (*ARN, error) {
function GetPartitionDNSSuffix (line 193) | func GetPartitionDNSSuffix(partition string) string {
function GetAllAWSPartitionDNSSuffixes (line 203) | func GetAllAWSPartitionDNSSuffixes() []string {
function WrapAWSError (line 219) | func WrapAWSError(err error) *sdp.QueryError {
function HandleTagsError (line 239) | func HandleTagsError(ctx context.Context, err error) map[string]string {
type E2ETest (line 261) | type E2ETest struct
method Run (line 283) | func (e E2ETest) Run(t *testing.T) {
function GetAutoConfig (line 456) | func GetAutoConfig(t *testing.T) (aws.Config, string, string) {
function ToAttributesWithExclude (line 491) | func ToAttributesWithExclude(i any, exclusions ...string) (*sdp.ItemAttr...
FILE: aws-source/adapters/adapterhelpers_util_test.go
function TestParseARN (line 7) | func TestParseARN(t *testing.T) {
function TestIAMWildcardMatches (line 131) | func TestIAMWildcardMatches(t *testing.T) {
function TestGetPartitionDNSSuffix (line 260) | func TestGetPartitionDNSSuffix(t *testing.T) {
FILE: aws-source/adapters/apigateway-api-key.go
function convertGetApiKeyOutputToApiKey (line 15) | func convertGetApiKeyOutputToApiKey(output *apigateway.GetApiKeyOutput) ...
function apiKeyListFunc (line 27) | func apiKeyListFunc(ctx context.Context, client *apigateway.Client, _ st...
function apiKeyOutputMapper (line 41) | func apiKeyOutputMapper(scope string, awsItem *types.ApiKey) (*sdp.Item,...
function NewAPIGatewayApiKeyAdapter (line 75) | func NewAPIGatewayApiKeyAdapter(client *apigateway.Client, accountID str...
FILE: aws-source/adapters/apigateway-api-key_test.go
function TestApiKeyOutputMapper (line 14) | func TestApiKeyOutputMapper(t *testing.T) {
function TestNewAPIGatewayApiKeyAdapter (line 46) | func TestNewAPIGatewayApiKeyAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-authorizer.go
function convertGetAuthorizerOutputToAuthorizer (line 16) | func convertGetAuthorizerOutputToAuthorizer(output *apigateway.GetAuthor...
function authorizerOutputMapper (line 31) | func authorizerOutputMapper(query, scope string, awsItem *types.Authoriz...
function NewAPIGatewayAuthorizerAdapter (line 56) | func NewAPIGatewayAuthorizerAdapter(client *apigateway.Client, accountID...
FILE: aws-source/adapters/apigateway-authorizer_test.go
function TestAuthorizerOutputMapper (line 14) | func TestAuthorizerOutputMapper(t *testing.T) {
function TestNewAPIGatewayAuthorizerAdapter (line 49) | func TestNewAPIGatewayAuthorizerAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-deployment.go
function convertGetDeploymentOutputToDeployment (line 16) | func convertGetDeploymentOutputToDeployment(output *apigateway.GetDeploy...
function deploymentOutputMapper (line 25) | func deploymentOutputMapper(query, scope string, awsItem *types.Deployme...
function NewAPIGatewayDeploymentAdapter (line 61) | func NewAPIGatewayDeploymentAdapter(client *apigateway.Client, accountID...
FILE: aws-source/adapters/apigateway-deployment_test.go
function TestDeploymentOutputMapper (line 14) | func TestDeploymentOutputMapper(t *testing.T) {
function TestNewAPIGatewayDeploymentAdapter (line 49) | func TestNewAPIGatewayDeploymentAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-domain-name.go
function convertGetDomainNameOutputToDomainName (line 14) | func convertGetDomainNameOutputToDomainName(output *apigateway.GetDomain...
function domainNameOutputMapper (line 36) | func domainNameOutputMapper(_, scope string, awsItem *types.DomainName) ...
function NewAPIGatewayDomainNameAdapter (line 151) | func NewAPIGatewayDomainNameAdapter(client *apigateway.Client, accountID...
FILE: aws-source/adapters/apigateway-domain-name_test.go
function TestDomainNameOutputMapper (line 44) | func TestDomainNameOutputMapper(t *testing.T) {
function TestNewAPIGatewayDomainNameAdapter (line 121) | func TestNewAPIGatewayDomainNameAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-integration.go
type apiGatewayIntegrationGetter (line 15) | type apiGatewayIntegrationGetter interface
function apiGatewayIntegrationGetFunc (line 19) | func apiGatewayIntegrationGetFunc(ctx context.Context, client apiGateway...
function NewAPIGatewayIntegrationAdapter (line 80) | func NewAPIGatewayIntegrationAdapter(client apiGatewayIntegrationGetter,...
FILE: aws-source/adapters/apigateway-integration_test.go
type mockAPIGatewayIntegrationClient (line 16) | type mockAPIGatewayIntegrationClient struct
method GetIntegration (line 18) | func (m *mockAPIGatewayIntegrationClient) GetIntegration(ctx context.C...
function TestApiGatewayIntegrationGetFunc (line 37) | func TestApiGatewayIntegrationGetFunc(t *testing.T) {
function TestNewAPIGatewayIntegrationAdapter (line 76) | func TestNewAPIGatewayIntegrationAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-method-response.go
function apiGatewayMethodResponseGetFunc (line 13) | func apiGatewayMethodResponseGetFunc(ctx context.Context, client apigate...
function NewAPIGatewayMethodResponseAdapter (line 64) | func NewAPIGatewayMethodResponseAdapter(client apigatewayClient, account...
FILE: aws-source/adapters/apigateway-method-response_test.go
method GetMethodResponse (line 15) | func (m *mockAPIGatewayClient) GetMethodResponse(ctx context.Context, pa...
function TestApiGatewayMethodResponseGetFunc (line 24) | func TestApiGatewayMethodResponseGetFunc(t *testing.T) {
function TestNewAPIGatewayMethodResponseAdapter (line 58) | func TestNewAPIGatewayMethodResponseAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-method.go
type apigatewayClient (line 13) | type apigatewayClient interface
function apiGatewayMethodGetFunc (line 18) | func apiGatewayMethodGetFunc(ctx context.Context, client apigatewayClien...
function NewAPIGatewayMethodAdapter (line 105) | func NewAPIGatewayMethodAdapter(client apigatewayClient, accountID strin...
FILE: aws-source/adapters/apigateway-method_test.go
type mockAPIGatewayClient (line 16) | type mockAPIGatewayClient struct
method GetMethod (line 18) | func (m *mockAPIGatewayClient) GetMethod(ctx context.Context, params *...
function TestApiGatewayGetFunc (line 53) | func TestApiGatewayGetFunc(t *testing.T) {
function TestNewAPIGatewayMethodAdapter (line 100) | func TestNewAPIGatewayMethodAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-model.go
function convertGetModelOutputToModel (line 15) | func convertGetModelOutputToModel(output *apigateway.GetModelOutput) *ty...
function modelOutputMapper (line 25) | func modelOutputMapper(query, scope string, awsItem *types.Model) (*sdp....
function NewAPIGatewayModelAdapter (line 57) | func NewAPIGatewayModelAdapter(client *apigateway.Client, accountID stri...
FILE: aws-source/adapters/apigateway-model_test.go
function TestModelOutputMapper (line 14) | func TestModelOutputMapper(t *testing.T) {
function TestNewAPIGatewayModelAdapter (line 44) | func TestNewAPIGatewayModelAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-resource.go
function convertGetResourceOutputToResource (line 15) | func convertGetResourceOutputToResource(output *apigateway.GetResourceOu...
function resourceOutputMapper (line 27) | func resourceOutputMapper(query, scope string, awsItem *types.Resource) ...
function NewAPIGatewayResourceAdapter (line 75) | func NewAPIGatewayResourceAdapter(client *apigateway.Client, accountID s...
FILE: aws-source/adapters/apigateway-resource_test.go
function TestResourceOutputMapper (line 84) | func TestResourceOutputMapper(t *testing.T) {
function TestNewAPIGatewayResourceAdapter (line 165) | func TestNewAPIGatewayResourceAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-rest-api.go
function convertGetRestApiOutputToRestApi (line 18) | func convertGetRestApiOutputToRestApi(output *apigateway.GetRestApiOutpu...
function restApiListFunc (line 37) | func restApiListFunc(ctx context.Context, client *apigateway.Client, _ s...
function restApiOutputMapper (line 51) | func restApiOutputMapper(scope string, awsItem *types.RestApi) (*sdp.Ite...
function NewAPIGatewayRestApiAdapter (line 164) | func NewAPIGatewayRestApiAdapter(client *apigateway.Client, accountID st...
FILE: aws-source/adapters/apigateway-rest-api_test.go
function TestRestApiOutputMapper (line 38) | func TestRestApiOutputMapper(t *testing.T) {
function TestNewAPIGatewayRestApiAdapter (line 119) | func TestNewAPIGatewayRestApiAdapter(t *testing.T) {
FILE: aws-source/adapters/apigateway-stage.go
function convertGetStageOutputToStage (line 15) | func convertGetStageOutputToStage(output *apigateway.GetStageOutput) *ty...
function stageOutputMapper (line 37) | func stageOutputMapper(query, scope string, awsItem *types.Stage) (*sdp....
function NewAPIGatewayStageAdapter (line 83) | func NewAPIGatewayStageAdapter(client *apigateway.Client, accountID stri...
FILE: aws-source/adapters/apigateway-stage_test.go
function TestStageOutputMapper (line 14) | func TestStageOutputMapper(t *testing.T) {
function TestNewAPIGatewayStageAdapter (line 65) | func TestNewAPIGatewayStageAdapter(t *testing.T) {
FILE: aws-source/adapters/autoscaling-auto-scaling-group.go
function autoScalingGroupOutputMapper (line 13) | func autoScalingGroupOutputMapper(_ context.Context, _ *autoscaling.Clie...
function NewAutoScalingGroupAdapter (line 159) | func NewAutoScalingGroupAdapter(client *autoscaling.Client, accountID st...
FILE: aws-source/adapters/autoscaling-auto-scaling-group_test.go
function TestAutoScalingGroupOutputMapper (line 14) | func TestAutoScalingGroupOutputMapper(t *testing.T) {
function TestAutoScalingGroupInputMapperSearch (line 227) | func TestAutoScalingGroupInputMapperSearch(t *testing.T) {
FILE: aws-source/adapters/autoscaling-auto-scaling-policy.go
function scalingPolicyOutputMapper (line 14) | func scalingPolicyOutputMapper(_ context.Context, _ *autoscaling.Client,...
function parseResourceLabelLinks (line 116) | func parseResourceLabelLinks(resourceLabel string, scope string) []*sdp....
function NewAutoScalingPolicyAdapter (line 156) | func NewAutoScalingPolicyAdapter(client *autoscaling.Client, accountID s...
FILE: aws-source/adapters/autoscaling-auto-scaling-policy_test.go
function TestScalingPolicyOutputMapper (line 13) | func TestScalingPolicyOutputMapper(t *testing.T) {
function TestParseResourceLabelLinks (line 248) | func TestParseResourceLabelLinks(t *testing.T) {
function TestScalingPolicyInputMapperSearch (line 361) | func TestScalingPolicyInputMapperSearch(t *testing.T) {
function TestScalingPolicyInputMapperGet (line 465) | func TestScalingPolicyInputMapperGet(t *testing.T) {
FILE: aws-source/adapters/cloudfront-cache-policy.go
function cachePolicyListFunc (line 13) | func cachePolicyListFunc(ctx context.Context, client CloudFrontClient, s...
function NewCloudfrontCachePolicyAdapter (line 40) | func NewCloudfrontCachePolicyAdapter(client CloudFrontClient, accountID ...
FILE: aws-source/adapters/cloudfront-cache-policy_test.go
method ListCachePolicies (line 56) | func (t TestCloudFrontClient) ListCachePolicies(ctx context.Context, par...
method GetCachePolicy (line 69) | func (t TestCloudFrontClient) GetCachePolicy(ctx context.Context, params...
function TestCachePolicyListFunc (line 75) | func TestCachePolicyListFunc(t *testing.T) {
function TestNewCloudfrontCachePolicyAdapter (line 87) | func TestNewCloudfrontCachePolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-continuous-deployment-policy.go
function continuousDeploymentPolicyItemMapper (line 13) | func continuousDeploymentPolicyItemMapper(_, scope string, awsItem *type...
function NewCloudfrontContinuousDeploymentPolicyAdapter (line 45) | func NewCloudfrontContinuousDeploymentPolicyAdapter(client *cloudfront.C...
FILE: aws-source/adapters/cloudfront-continuous-deployment-policy_test.go
function TestContinuousDeploymentPolicyItemMapper (line 12) | func TestContinuousDeploymentPolicyItemMapper(t *testing.T) {
function TestNewCloudfrontContinuousDeploymentPolicyAdapter (line 61) | func TestNewCloudfrontContinuousDeploymentPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-distribution.go
function distributionGetFunc (line 15) | func distributionGetFunc(ctx context.Context, client CloudFrontClient, s...
function NewCloudfrontDistributionAdapter (line 460) | func NewCloudfrontDistributionAdapter(client CloudFrontClient, accountID...
FILE: aws-source/adapters/cloudfront-distribution_test.go
method GetDistribution (line 14) | func (t TestCloudFrontClient) GetDistribution(ctx context.Context, param...
method ListDistributions (line 343) | func (t TestCloudFrontClient) ListDistributions(ctx context.Context, par...
function TestDistributionGetFunc (line 356) | func TestDistributionGetFunc(t *testing.T) {
function TestNewCloudfrontDistributionAdapter (line 498) | func TestNewCloudfrontDistributionAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-function.go
function functionItemMapper (line 13) | func functionItemMapper(_, scope string, awsItem *types.FunctionSummary)...
function NewCloudfrontCloudfrontFunctionAdapter (line 30) | func NewCloudfrontCloudfrontFunctionAdapter(client *cloudfront.Client, a...
FILE: aws-source/adapters/cloudfront-function_test.go
function TestFunctionItemMapper (line 11) | func TestFunctionItemMapper(t *testing.T) {
function TestNewCloudfrontCloudfrontFunctionAdapter (line 38) | func TestNewCloudfrontCloudfrontFunctionAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-key-group.go
function KeyGroupItemMapper (line 13) | func KeyGroupItemMapper(_, scope string, awsItem *types.KeyGroup) (*sdp....
function NewCloudfrontKeyGroupAdapter (line 30) | func NewCloudfrontKeyGroupAdapter(client *cloudfront.Client, accountID s...
FILE: aws-source/adapters/cloudfront-key-group_test.go
function TestKeyGroupItemMapper (line 11) | func TestKeyGroupItemMapper(t *testing.T) {
function TestNewCloudfrontKeyGroupAdapter (line 35) | func TestNewCloudfrontKeyGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-origin-access-control.go
function originAccessControlListFunc (line 13) | func originAccessControlListFunc(ctx context.Context, client *cloudfront...
function originAccessControlItemMapper (line 41) | func originAccessControlItemMapper(_, scope string, awsItem *types.Origi...
function NewCloudfrontOriginAccessControlAdapter (line 58) | func NewCloudfrontOriginAccessControlAdapter(client *cloudfront.Client, ...
FILE: aws-source/adapters/cloudfront-origin-access-control_test.go
function TestOriginAccessControlItemMapper (line 11) | func TestOriginAccessControlItemMapper(t *testing.T) {
function TestNewCloudfrontOriginAccessControlAdapter (line 34) | func TestNewCloudfrontOriginAccessControlAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-origin-request-policy.go
function originRequestPolicyItemMapper (line 13) | func originRequestPolicyItemMapper(_, scope string, awsItem *types.Origi...
function NewCloudfrontOriginRequestPolicyAdapter (line 30) | func NewCloudfrontOriginRequestPolicyAdapter(client *cloudfront.Client, ...
FILE: aws-source/adapters/cloudfront-origin-request-policy_test.go
function TestOriginRequestPolicyItemMapper (line 11) | func TestOriginRequestPolicyItemMapper(t *testing.T) {
function TestNewCloudfrontOriginRequestPolicyAdapter (line 53) | func TestNewCloudfrontOriginRequestPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-realtime-log-config.go
function realtimeLogConfigsItemMapper (line 13) | func realtimeLogConfigsItemMapper(_, scope string, awsItem *types.Realti...
function NewCloudfrontRealtimeLogConfigsAdapter (line 60) | func NewCloudfrontRealtimeLogConfigsAdapter(client *cloudfront.Client, a...
FILE: aws-source/adapters/cloudfront-realtime-log-config_test.go
function TestRealtimeLogConfigsItemMapper (line 12) | func TestRealtimeLogConfigsItemMapper(t *testing.T) {
function TestNewCloudfrontRealtimeLogConfigsAdapter (line 59) | func TestNewCloudfrontRealtimeLogConfigsAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-response-headers-policy.go
function ResponseHeadersPolicyItemMapper (line 13) | func ResponseHeadersPolicyItemMapper(_, scope string, awsItem *types.Res...
function NewCloudfrontResponseHeadersPolicyAdapter (line 30) | func NewCloudfrontResponseHeadersPolicyAdapter(client *cloudfront.Client...
FILE: aws-source/adapters/cloudfront-response-headers-policy_test.go
function TestResponseHeadersPolicyItemMapper (line 11) | func TestResponseHeadersPolicyItemMapper(t *testing.T) {
function TestNewCloudfrontResponseHeadersPolicyAdapter (line 90) | func TestNewCloudfrontResponseHeadersPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront-streaming-distribution.go
function streamingDistributionGetFunc (line 13) | func streamingDistributionGetFunc(ctx context.Context, client CloudFront...
function NewCloudfrontStreamingDistributionAdapter (line 133) | func NewCloudfrontStreamingDistributionAdapter(client CloudFrontClient, ...
FILE: aws-source/adapters/cloudfront-streaming-distribution_test.go
method GetStreamingDistribution (line 14) | func (t TestCloudFrontClient) GetStreamingDistribution(ctx context.Conte...
method ListStreamingDistributions (line 70) | func (t TestCloudFrontClient) ListStreamingDistributions(ctx context.Con...
function TestStreamingDistributionGetFunc (line 83) | func TestStreamingDistributionGetFunc(t *testing.T) {
function TestNewCloudfrontStreamingDistributionAdapter (line 110) | func TestNewCloudfrontStreamingDistributionAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudfront.go
function cloudfrontTagsToMap (line 11) | func cloudfrontTagsToMap(tags *types.Tags) map[string]string {
type CloudFrontClient (line 27) | type CloudFrontClient interface
FILE: aws-source/adapters/cloudfront_test.go
type TestCloudFrontClient (line 24) | type TestCloudFrontClient struct
method ListTagsForResource (line 11) | func (c TestCloudFrontClient) ListTagsForResource(ctx context.Context,...
function CloudfrontGetAutoConfig (line 26) | func CloudfrontGetAutoConfig(t *testing.T) (*cloudfront.Client, string, ...
FILE: aws-source/adapters/cloudwatch-alarm.go
type CloudwatchClient (line 15) | type CloudwatchClient interface
function ToQueryString (line 22) | func ToQueryString(input *cloudwatch.DescribeAlarmsForMetricInput) (stri...
function fromQueryString (line 33) | func fromQueryString(query string) (*cloudwatch.DescribeAlarmsForMetricI...
function cloudwatchTagsToMap (line 44) | func cloudwatchTagsToMap(tags []types.Tag) map[string]string {
type Alarm (line 54) | type Alarm struct
function alarmOutputMapper (line 59) | func alarmOutputMapper(ctx context.Context, client CloudwatchClient, sco...
function NewCloudwatchAlarmAdapter (line 179) | func NewCloudwatchAlarmAdapter(client *cloudwatch.Client, accountID stri...
function actionToLink (line 289) | func actionToLink(action string) (*sdp.LinkedItemQuery, error) {
FILE: aws-source/adapters/cloudwatch-alarm_test.go
type testCloudwatchClient (line 16) | type testCloudwatchClient struct
method ListTagsForResource (line 18) | func (c testCloudwatchClient) ListTagsForResource(ctx context.Context,...
method DescribeAlarms (line 29) | func (c testCloudwatchClient) DescribeAlarms(ctx context.Context, para...
method DescribeAlarmsForMetric (line 33) | func (c testCloudwatchClient) DescribeAlarmsForMetric(ctx context.Cont...
function TestAlarmOutputMapper (line 37) | func TestAlarmOutputMapper(t *testing.T) {
type testCloudwatchClientWithTagError (line 159) | type testCloudwatchClientWithTagError struct
method ListTagsForResource (line 161) | func (c testCloudwatchClientWithTagError) ListTagsForResource(ctx cont...
method DescribeAlarms (line 165) | func (c testCloudwatchClientWithTagError) DescribeAlarms(ctx context.C...
method DescribeAlarmsForMetric (line 169) | func (c testCloudwatchClientWithTagError) DescribeAlarmsForMetric(ctx ...
function TestAlarmOutputMapperWithTagError (line 177) | func TestAlarmOutputMapperWithTagError(t *testing.T) {
function TestNewCloudwatchAlarmAdapter (line 218) | func TestNewCloudwatchAlarmAdapter(t *testing.T) {
FILE: aws-source/adapters/cloudwatch-instance-metric.go
type CloudwatchMetricClient (line 18) | type CloudwatchMetricClient interface
function validateInstanceID (line 44) | func validateInstanceID(instanceID string) error {
function formatBytes (line 58) | func formatBytes(bytes float64) string {
function formatBytesPerSecond (line 81) | func formatBytesPerSecond(bytesPerSec float64) string {
function formatOpsPerSecond (line 86) | func formatOpsPerSecond(opsPerSec float64) string {
function formatMetricValue (line 97) | func formatMetricValue(metricName string, value float64) string {
function metricOutputMapper (line 122) | func metricOutputMapper(ctx context.Context, client CloudwatchMetricClie...
type CloudwatchInstanceMetricAdapter (line 181) | type CloudwatchInstanceMetricAdapter struct
method cacheDuration (line 192) | func (a *CloudwatchInstanceMetricAdapter) cacheDuration() time.Duration {
method Type (line 200) | func (a *CloudwatchInstanceMetricAdapter) Type() string {
method Name (line 205) | func (a *CloudwatchInstanceMetricAdapter) Name() string {
method Metadata (line 210) | func (a *CloudwatchInstanceMetricAdapter) Metadata() *sdp.AdapterMetad...
method Scopes (line 215) | func (a *CloudwatchInstanceMetricAdapter) Scopes() []string {
method Get (line 220) | func (a *CloudwatchInstanceMetricAdapter) Get(ctx context.Context, sco...
method List (line 318) | func (a *CloudwatchInstanceMetricAdapter) List(ctx context.Context, sc...
method Search (line 325) | func (a *CloudwatchInstanceMetricAdapter) Search(ctx context.Context, ...
method Weight (line 335) | func (a *CloudwatchInstanceMetricAdapter) Weight() int {
constant defaultMetricCacheDuration (line 190) | defaultMetricCacheDuration = 15 * time.Minute
function NewCloudwatchInstanceMetricAdapter (line 340) | func NewCloudwatchInstanceMetricAdapter(client *cloudwatch.Client, accou...
FILE: aws-source/adapters/cloudwatch-instance-metric_integration_test.go
function TestCloudwatchInstanceMetricIntegration (line 17) | func TestCloudwatchInstanceMetricIntegration(t *testing.T) {
FILE: aws-source/adapters/cloudwatch-instance-metric_test.go
type testCloudwatchMetricClient (line 16) | type testCloudwatchMetricClient struct
method GetMetricData (line 18) | func (c testCloudwatchMetricClient) GetMetricData(ctx context.Context,...
type testCloudwatchMetricClientEmpty (line 46) | type testCloudwatchMetricClientEmpty struct
method GetMetricData (line 48) | func (c testCloudwatchMetricClientEmpty) GetMetricData(ctx context.Con...
type testCloudwatchMetricClientWithCallCount (line 56) | type testCloudwatchMetricClientWithCallCount struct
method GetMetricData (line 60) | func (c *testCloudwatchMetricClientWithCallCount) GetMetricData(ctx co...
function TestValidateInstanceID (line 88) | func TestValidateInstanceID(t *testing.T) {
function TestMetricOutputMapper (line 152) | func TestMetricOutputMapper(t *testing.T) {
function TestMetricOutputMapperNoData (line 236) | func TestMetricOutputMapperNoData(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterGet (line 264) | func TestCloudwatchInstanceMetricAdapterGet(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterGetWrongScope (line 297) | func TestCloudwatchInstanceMetricAdapterGetWrongScope(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterGetInvalidQuery (line 314) | func TestCloudwatchInstanceMetricAdapterGetInvalidQuery(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterList (line 344) | func TestCloudwatchInstanceMetricAdapterList(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterScopes (line 365) | func TestCloudwatchInstanceMetricAdapterScopes(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterMetadata (line 381) | func TestCloudwatchInstanceMetricAdapterMetadata(t *testing.T) {
function TestNewCloudwatchInstanceMetricAdapter (line 397) | func TestNewCloudwatchInstanceMetricAdapter(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterCaching (line 412) | func TestCloudwatchInstanceMetricAdapterCaching(t *testing.T) {
function TestCloudwatchInstanceMetricAdapterIgnoreCache (line 458) | func TestCloudwatchInstanceMetricAdapterIgnoreCache(t *testing.T) {
type testCloudwatchMetricClientError (line 491) | type testCloudwatchMetricClientError struct
method GetMetricData (line 493) | func (c testCloudwatchMetricClientError) GetMetricData(ctx context.Con...
function TestCloudwatchInstanceMetricAdapterErrorCaching (line 497) | func TestCloudwatchInstanceMetricAdapterErrorCaching(t *testing.T) {
FILE: aws-source/adapters/cloudwatch_metric_links.go
function SuggestedQuery (line 23) | func SuggestedQuery(namespace string, scope string, dimensions []types.D...
function getDimension (line 242) | func getDimension(name string, dimensions []types.Dimension) *types.Dime...
FILE: aws-source/adapters/cloudwatch_metric_links_test.go
function TestSuggestedQuery (line 9) | func TestSuggestedQuery(t *testing.T) {
FILE: aws-source/adapters/directconnect-connection.go
function directconnectConnectionOutputMapper (line 12) | func directconnectConnectionOutputMapper(_ context.Context, _ *directcon...
function NewDirectConnectConnectionAdapter (line 78) | func NewDirectConnectConnectionAdapter(client *directconnect.Client, acc...
FILE: aws-source/adapters/directconnect-connection_test.go
function TestDirectconnectConnectionOutputMapper (line 14) | func TestDirectconnectConnectionOutputMapper(t *testing.T) {
function TestNewDirectConnectConnectionAdapter (line 91) | func TestNewDirectConnectConnectionAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-customer-metadata.go
function customerMetadataOutputMapper (line 12) | func customerMetadataOutputMapper(_ context.Context, _ *directconnect.Cl...
function NewDirectConnectCustomerMetadataAdapter (line 34) | func NewDirectConnectCustomerMetadataAdapter(client *directconnect.Clien...
FILE: aws-source/adapters/directconnect-customer-metadata_test.go
function TestCustomerMetadataOutputMapper (line 13) | func TestCustomerMetadataOutputMapper(t *testing.T) {
function TestNewDirectConnectCustomerMetadataAdapter (line 39) | func TestNewDirectConnectCustomerMetadataAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-direct-connect-gateway-association-proposal.go
function directConnectGatewayAssociationProposalOutputMapper (line 13) | func directConnectGatewayAssociationProposalOutputMapper(_ context.Conte...
function NewDirectConnectGatewayAssociationProposalAdapter (line 46) | func NewDirectConnectGatewayAssociationProposalAdapter(client *directcon...
FILE: aws-source/adapters/directconnect-direct-connect-gateway-association-proposal_test.go
function TestDirectConnectGatewayAssociationProposalOutputMapper (line 16) | func TestDirectConnectGatewayAssociationProposalOutputMapper(t *testing....
function TestNewDirectConnectGatewayAssociationProposalAdapter (line 76) | func TestNewDirectConnectGatewayAssociationProposalAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-direct-connect-gateway-association.go
constant directConnectGatewayIDVirtualGatewayIDFormat (line 15) | directConnectGatewayIDVirtualGatewayIDFormat = "direct_connect_gateway_i...
constant virtualGatewayIDFormat (line 16) | virtualGatewayIDFormat = "virtual_gateway_id"
function directConnectGatewayAssociationOutputMapper (line 19) | func directConnectGatewayAssociationOutputMapper(_ context.Context, _ *d...
function NewDirectConnectGatewayAssociationAdapter (line 70) | func NewDirectConnectGatewayAssociationAdapter(client *directconnect.Cli...
function parseDirectConnectGatewayAssociationGetInputQuery (line 140) | func parseDirectConnectGatewayAssociationGetInputQuery(query string) (st...
FILE: aws-source/adapters/directconnect-direct-connect-gateway-association_test.go
function TestDirectConnectGatewayAssociationOutputMapper_Health_OK (line 14) | func TestDirectConnectGatewayAssociationOutputMapper_Health_OK(t *testin...
function TestDirectConnectGatewayAssociationOutputMapper_Health_Error (line 66) | func TestDirectConnectGatewayAssociationOutputMapper_Health_Error(t *tes...
function TestNewDirectConnectGatewayAssociationAdapter (line 119) | func TestNewDirectConnectGatewayAssociationAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-direct-connect-gateway-attachment.go
function directConnectGatewayAttachmentOutputMapper (line 14) | func directConnectGatewayAttachmentOutputMapper(_ context.Context, _ *di...
function NewDirectConnectGatewayAttachmentAdapter (line 73) | func NewDirectConnectGatewayAttachmentAdapter(client *directconnect.Clie...
function parseGatewayIDVirtualInterfaceID (line 127) | func parseGatewayIDVirtualInterfaceID(query string) (string, string, err...
FILE: aws-source/adapters/directconnect-direct-connect-gateway-attachment_test.go
function TestDirectConnectGatewayAttachmentOutputMapper_Health_OK (line 14) | func TestDirectConnectGatewayAttachmentOutputMapper_Health_OK(t *testing...
function TestDirectConnectGatewayAttachmentOutputMapper_Health_Error (line 66) | func TestDirectConnectGatewayAttachmentOutputMapper_Health_Error(t *test...
function TestNewDirectConnectGatewayAttachmentAdapter (line 119) | func TestNewDirectConnectGatewayAttachmentAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-direct-connect-gateway.go
function directConnectGatewayOutputMapper (line 14) | func directConnectGatewayOutputMapper(ctx context.Context, cli *directco...
function directconnectARN (line 72) | func directconnectARN(region, accountID, gatewayID string) string {
function NewDirectConnectGatewayAdapter (line 77) | func NewDirectConnectGatewayAdapter(client *directconnect.Client, accoun...
FILE: aws-source/adapters/directconnect-direct-connect-gateway_test.go
function TestDirectConnectGatewayOutputMapper_Health_OK (line 14) | func TestDirectConnectGatewayOutputMapper_Health_OK(t *testing.T) {
function TestDirectConnectGatewayOutputMapper_Health_ERROR (line 47) | func TestDirectConnectGatewayOutputMapper_Health_ERROR(t *testing.T) {
function TestNewDirectConnectGatewayAdapter (line 81) | func TestNewDirectConnectGatewayAdapter(t *testing.T) {
function Test_arn (line 94) | func Test_arn(t *testing.T) {
FILE: aws-source/adapters/directconnect-hosted-connection.go
function hostedConnectionOutputMapper (line 12) | func hostedConnectionOutputMapper(_ context.Context, _ *directconnect.Cl...
function NewDirectConnectHostedConnectionAdapter (line 77) | func NewDirectConnectHostedConnectionAdapter(client *directconnect.Clien...
FILE: aws-source/adapters/directconnect-hosted-connection_test.go
function TestHostedConnectionOutputMapper (line 14) | func TestHostedConnectionOutputMapper(t *testing.T) {
function TestNewDirectConnectHostedConnectionAdapter (line 91) | func TestNewDirectConnectHostedConnectionAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-interconnect.go
function interconnectOutputMapper (line 14) | func interconnectOutputMapper(_ context.Context, _ *directconnect.Client...
function NewDirectConnectInterconnectAdapter (line 98) | func NewDirectConnectInterconnectAdapter(client *directconnect.Client, a...
FILE: aws-source/adapters/directconnect-interconnect_test.go
function TestInterconnectOutputMapper (line 14) | func TestInterconnectOutputMapper(t *testing.T) {
function TestInterconnectHealth (line 88) | func TestInterconnectHealth(t *testing.T) {
function TestNewDirectConnectInterconnectAdapter (line 150) | func TestNewDirectConnectInterconnectAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-lag.go
function lagOutputMapper (line 14) | func lagOutputMapper(_ context.Context, _ *directconnect.Client, scope s...
function NewDirectConnectLagAdapter (line 90) | func NewDirectConnectLagAdapter(client *directconnect.Client, accountID ...
FILE: aws-source/adapters/directconnect-lag_test.go
function TestLagHealth (line 15) | func TestLagHealth(t *testing.T) {
function TestLagOutputMapper (line 77) | func TestLagOutputMapper(t *testing.T) {
function TestNewDirectConnectLagAdapter (line 168) | func TestNewDirectConnectLagAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-location.go
function locationOutputMapper (line 12) | func locationOutputMapper(_ context.Context, _ *directconnect.Client, sc...
function NewDirectConnectLocationAdapter (line 34) | func NewDirectConnectLocationAdapter(client *directconnect.Client, accou...
FILE: aws-source/adapters/directconnect-location_test.go
function TestLocationOutputMapper (line 13) | func TestLocationOutputMapper(t *testing.T) {
function TestNewDirectConnectLocationAdapter (line 43) | func TestNewDirectConnectLocationAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-router-configuration.go
function routerConfigurationOutputMapper (line 12) | func routerConfigurationOutputMapper(_ context.Context, _ *directconnect...
function NewDirectConnectRouterConfigurationAdapter (line 45) | func NewDirectConnectRouterConfigurationAdapter(client *directconnect.Cl...
FILE: aws-source/adapters/directconnect-router-configuration_test.go
function TestRouterConfigurationOutputMapper (line 14) | func TestRouterConfigurationOutputMapper(t *testing.T) {
function TestNewDirectConnectRouterConfigurationAdapter (line 58) | func TestNewDirectConnectRouterConfigurationAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-virtual-gateway.go
function virtualGatewayOutputMapper (line 12) | func virtualGatewayOutputMapper(_ context.Context, _ *directconnect.Clie...
function NewDirectConnectVirtualGatewayAdapter (line 34) | func NewDirectConnectVirtualGatewayAdapter(client *directconnect.Client,...
FILE: aws-source/adapters/directconnect-virtual-gateway_test.go
function TestVirtualGatewayOutputMapper (line 13) | func TestVirtualGatewayOutputMapper(t *testing.T) {
function TestNewDirectConnectVirtualGatewayAdapter (line 39) | func TestNewDirectConnectVirtualGatewayAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect-virtual-interface.go
constant gatewayIDVirtualInterfaceIDFormat (line 13) | gatewayIDVirtualInterfaceIDFormat = "gateway_id/virtual_interface_id"
function virtualInterfaceOutputMapper (line 15) | func virtualInterfaceOutputMapper(_ context.Context, _ *directconnect.Cl...
function NewDirectConnectVirtualInterfaceAdapter (line 108) | func NewDirectConnectVirtualInterfaceAdapter(client *directconnect.Clien...
FILE: aws-source/adapters/directconnect-virtual-interface_test.go
function TestVirtualInterfaceOutputMapper (line 16) | func TestVirtualInterfaceOutputMapper(t *testing.T) {
function TestNewDirectConnectVirtualInterfaceAdapter (line 91) | func TestNewDirectConnectVirtualInterfaceAdapter(t *testing.T) {
FILE: aws-source/adapters/directconnect.go
function directconnectTagsToMap (line 11) | func directconnectTagsToMap(tags []types.Tag) map[string]string {
function arnToTags (line 23) | func arnToTags(ctx context.Context, cli *directconnect.Client, resourceA...
FILE: aws-source/adapters/directconnect_test.go
function directconnectGetAutoConfig (line 8) | func directconnectGetAutoConfig(t *testing.T) (*directconnect.Client, st...
FILE: aws-source/adapters/dynamodb-backup.go
function backupGetFunc (line 13) | func backupGetFunc(ctx context.Context, client Client, scope string, inp...
function NewDynamoDBBackupAdapter (line 69) | func NewDynamoDBBackupAdapter(client Client, accountID string, region st...
type ListBackupsPaginator (line 145) | type ListBackupsPaginator struct
method HasMorePages (line 167) | func (p *ListBackupsPaginator) HasMorePages() bool {
method NextPage (line 172) | func (p *ListBackupsPaginator) NextPage(ctx context.Context, optFns .....
function NewListBackupsPaginator (line 153) | func NewListBackupsPaginator(client Client, params *dynamodb.ListBackups...
FILE: aws-source/adapters/dynamodb-backup_test.go
method DescribeBackup (line 14) | func (t *DynamoDBTestClient) DescribeBackup(ctx context.Context, params ...
method ListBackups (line 72) | func (t *DynamoDBTestClient) ListBackups(ctx context.Context, params *dy...
function TestBackupGetFunc (line 90) | func TestBackupGetFunc(t *testing.T) {
function TestNewDynamoDBBackupAdapter (line 113) | func TestNewDynamoDBBackupAdapter(t *testing.T) {
FILE: aws-source/adapters/dynamodb-table.go
function tableGetFunc (line 13) | func tableGetFunc(ctx context.Context, client Client, scope string, inpu...
function NewDynamoDBTableAdapter (line 138) | func NewDynamoDBTableAdapter(client Client, accountID string, region str...
FILE: aws-source/adapters/dynamodb-table_test.go
method DescribeTable (line 14) | func (t *DynamoDBTestClient) DescribeTable(context.Context, *dynamodb.De...
method ListTables (line 146) | func (t *DynamoDBTestClient) ListTables(context.Context, *dynamodb.ListT...
method DescribeKinesisStreamingDestination (line 154) | func (t *DynamoDBTestClient) DescribeKinesisStreamingDestination(ctx con...
method ListTagsOfResource (line 166) | func (t *DynamoDBTestClient) ListTagsOfResource(context.Context, *dynamo...
function TestTableGetFunc (line 178) | func TestTableGetFunc(t *testing.T) {
function TestNewDynamoDBTableAdapter (line 223) | func TestNewDynamoDBTableAdapter(t *testing.T) {
FILE: aws-source/adapters/dynamodb.go
type Client (line 9) | type Client interface
FILE: aws-source/adapters/dynamodb_test.go
type DynamoDBTestClient (line 3) | type DynamoDBTestClient struct
FILE: aws-source/adapters/ec2-address.go
function addressInputMapperGet (line 14) | func addressInputMapperGet(scope, query string) (*ec2.DescribeAddressesI...
function addressInputMapperList (line 23) | func addressInputMapperList(scope string) (*ec2.DescribeAddressesInput, ...
function addressOutputMapper (line 28) | func addressOutputMapper(_ context.Context, _ *ec2.Client, scope string,...
function NewEC2AddressAdapter (line 124) | func NewEC2AddressAdapter(client *ec2.Client, accountID string, region s...
FILE: aws-source/adapters/ec2-address_test.go
function TestAddressInputMapperGet (line 14) | func TestAddressInputMapperGet(t *testing.T) {
function TestAddressInputMapperList (line 30) | func TestAddressInputMapperList(t *testing.T) {
function TestAddressOutputMapper (line 42) | func TestAddressOutputMapper(t *testing.T) {
function TestNewEC2AddressAdapter (line 122) | func TestNewEC2AddressAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-capacity-reservation-fleet.go
function capacityReservationFleetOutputMapper (line 13) | func capacityReservationFleetOutputMapper(_ context.Context, _ *ec2.Clie...
function NewEC2CapacityReservationFleetAdapter (line 71) | func NewEC2CapacityReservationFleetAdapter(client *ec2.Client, accountID...
FILE: aws-source/adapters/ec2-capacity-reservation-fleet_test.go
function TestCapacityReservationFleetOutputMapper (line 13) | func TestCapacityReservationFleetOutputMapper(t *testing.T) {
function TestNewEC2CapacityReservationFleetAdapter (line 72) | func TestNewEC2CapacityReservationFleetAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-capacity-reservation.go
function capacityReservationOutputMapper (line 12) | func capacityReservationOutputMapper(_ context.Context, _ *ec2.Client, s...
function NewEC2CapacityReservationAdapter (line 73) | func NewEC2CapacityReservationAdapter(client *ec2.Client, accountID stri...
FILE: aws-source/adapters/ec2-capacity-reservation_test.go
function TestCapacityReservationOutputMapper (line 14) | func TestCapacityReservationOutputMapper(t *testing.T) {
function TestNewEC2CapacityReservationAdapter (line 93) | func TestNewEC2CapacityReservationAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-egress-only-internet-gateway.go
function egressOnlyInternetGatewayInputMapperGet (line 12) | func egressOnlyInternetGatewayInputMapperGet(scope string, query string)...
function egressOnlyInternetGatewayInputMapperList (line 20) | func egressOnlyInternetGatewayInputMapperList(scope string) (*ec2.Descri...
function egressOnlyInternetGatewayOutputMapper (line 24) | func egressOnlyInternetGatewayOutputMapper(_ context.Context, _ *ec2.Cli...
function NewEC2EgressOnlyInternetGatewayAdapter (line 67) | func NewEC2EgressOnlyInternetGatewayAdapter(client *ec2.Client, accountI...
FILE: aws-source/adapters/ec2-egress-only-internet-gateway_test.go
function TestEgressOnlyInternetGatewayInputMapperGet (line 14) | func TestEgressOnlyInternetGatewayInputMapperGet(t *testing.T) {
function TestEgressOnlyInternetGatewayInputMapperList (line 30) | func TestEgressOnlyInternetGatewayInputMapperList(t *testing.T) {
function TestEgressOnlyInternetGatewayOutputMapper (line 42) | func TestEgressOnlyInternetGatewayOutputMapper(t *testing.T) {
function TestNewEC2EgressOnlyInternetGatewayAdapter (line 90) | func TestNewEC2EgressOnlyInternetGatewayAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-iam-instance-profile-association.go
function iamInstanceProfileAssociationOutputMapper (line 12) | func iamInstanceProfileAssociationOutputMapper(_ context.Context, _ *ec2...
function NewEC2IamInstanceProfileAssociationAdapter (line 60) | func NewEC2IamInstanceProfileAssociationAdapter(client *ec2.Client, acco...
FILE: aws-source/adapters/ec2-iam-instance-profile-association_test.go
function TestIamInstanceProfileAssociationOutputMapper (line 14) | func TestIamInstanceProfileAssociationOutputMapper(t *testing.T) {
function TestNewEC2IamInstanceProfileAssociationAdapter (line 68) | func TestNewEC2IamInstanceProfileAssociationAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-image.go
function imageInputMapperGet (line 15) | func imageInputMapperGet(scope string, query string) (*ec2.DescribeImage...
function imageInputMapperList (line 25) | func imageInputMapperList(scope string) (*ec2.DescribeImagesInput, error) {
function imageOutputMapper (line 35) | func imageOutputMapper(_ context.Context, _ *ec2.Client, scope string, _...
function NewEC2ImageAdapter (line 65) | func NewEC2ImageAdapter(client *ec2.Client, accountID string, region str...
FILE: aws-source/adapters/ec2-image_test.go
function TestImageInputMapperGet (line 13) | func TestImageInputMapperGet(t *testing.T) {
function TestImageInputMapperList (line 29) | func TestImageInputMapperList(t *testing.T) {
function TestImageOutputMapper (line 42) | func TestImageOutputMapper(t *testing.T) {
function TestNewEC2ImageAdapter (line 108) | func TestNewEC2ImageAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-instance-event-window.go
function instanceEventWindowInputMapperGet (line 12) | func instanceEventWindowInputMapperGet(scope, query string) (*ec2.Descri...
function instanceEventWindowInputMapperList (line 20) | func instanceEventWindowInputMapperList(scope string) (*ec2.DescribeInst...
function instanceEventWindowOutputMapper (line 24) | func instanceEventWindowOutputMapper(_ context.Context, _ *ec2.Client, s...
function NewEC2InstanceEventWindowAdapter (line 76) | func NewEC2InstanceEventWindowAdapter(client *ec2.Client, accountID stri...
FILE: aws-source/adapters/ec2-instance-event-window_test.go
function TestInstanceEventWindowInputMapperGet (line 14) | func TestInstanceEventWindowInputMapperGet(t *testing.T) {
function TestInstanceEventWindowInputMapperList (line 30) | func TestInstanceEventWindowInputMapperList(t *testing.T) {
function TestInstanceEventWindowOutputMapper (line 42) | func TestInstanceEventWindowOutputMapper(t *testing.T) {
function TestNewEC2InstanceEventWindowAdapter (line 110) | func TestNewEC2InstanceEventWindowAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-instance-status.go
function instanceStatusInputMapperGet (line 13) | func instanceStatusInputMapperGet(scope, query string) (*ec2.DescribeIns...
function instanceStatusInputMapperList (line 21) | func instanceStatusInputMapperList(scope string) (*ec2.DescribeInstanceS...
function instanceStatusOutputMapper (line 25) | func instanceStatusOutputMapper(_ context.Context, _ *ec2.Client, scope ...
function NewEC2InstanceStatusAdapter (line 75) | func NewEC2InstanceStatusAdapter(client *ec2.Client, accountID string, r...
FILE: aws-source/adapters/ec2-instance-status_test.go
function TestInstanceStatusInputMapperGet (line 14) | func TestInstanceStatusInputMapperGet(t *testing.T) {
function TestInstanceStatusInputMapperList (line 30) | func TestInstanceStatusInputMapperList(t *testing.T) {
function TestInstanceStatusOutputMapper (line 42) | func TestInstanceStatusOutputMapper(t *testing.T) {
function TestNewEC2InstanceStatusAdapter (line 107) | func TestNewEC2InstanceStatusAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-instance.go
function instanceInputMapperGet (line 23) | func instanceInputMapperGet(scope, query string) (*ec2.DescribeInstances...
function instanceInputMapperList (line 31) | func instanceInputMapperList(scope string) (*ec2.DescribeInstancesInput,...
function instanceOutputMapper (line 35) | func instanceOutputMapper(_ context.Context, _ *ec2.Client, scope string...
function NewEC2InstanceAdapter (line 351) | func NewEC2InstanceAdapter(client *ec2.Client, accountID string, region ...
FILE: aws-source/adapters/ec2-instance_test.go
function TestInstanceInputMapperGet (line 14) | func TestInstanceInputMapperGet(t *testing.T) {
function TestInstanceInputMapperList (line 30) | func TestInstanceInputMapperList(t *testing.T) {
function TestInstanceOutputMapper (line 42) | func TestInstanceOutputMapper(t *testing.T) {
function TestNewEC2InstanceAdapter (line 352) | func TestNewEC2InstanceAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-internet-gateway.go
function internetGatewayInputMapperGet (line 12) | func internetGatewayInputMapperGet(scope string, query string) (*ec2.Des...
function internetGatewayInputMapperList (line 20) | func internetGatewayInputMapperList(scope string) (*ec2.DescribeInternet...
function internetGatewayOutputMapper (line 24) | func internetGatewayOutputMapper(_ context.Context, _ *ec2.Client, scope...
function NewEC2InternetGatewayAdapter (line 68) | func NewEC2InternetGatewayAdapter(client *ec2.Client, accountID string, ...
FILE: aws-source/adapters/ec2-internet-gateway_test.go
function TestInternetGatewayInputMapperGet (line 14) | func TestInternetGatewayInputMapperGet(t *testing.T) {
function TestInternetGatewayInputMapperList (line 30) | func TestInternetGatewayInputMapperList(t *testing.T) {
function TestInternetGatewayOutputMapper (line 42) | func TestInternetGatewayOutputMapper(t *testing.T) {
function TestNewEC2InternetGatewayAdapter (line 97) | func TestNewEC2InternetGatewayAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-key-pair.go
function keyPairInputMapperGet (line 12) | func keyPairInputMapperGet(scope string, query string) (*ec2.DescribeKey...
function keyPairInputMapperList (line 20) | func keyPairInputMapperList(scope string) (*ec2.DescribeKeyPairsInput, e...
function keyPairOutputMapper (line 24) | func keyPairOutputMapper(_ context.Context, _ *ec2.Client, scope string,...
function NewEC2KeyPairAdapter (line 54) | func NewEC2KeyPairAdapter(client *ec2.Client, accountID string, region s...
FILE: aws-source/adapters/ec2-key-pair_test.go
function TestKeyPairInputMapperGet (line 13) | func TestKeyPairInputMapperGet(t *testing.T) {
function TestKeyPairInputMapperList (line 29) | func TestKeyPairInputMapperList(t *testing.T) {
function TestKeyPairOutputMapper (line 41) | func TestKeyPairOutputMapper(t *testing.T) {
function TestNewEC2KeyPairAdapter (line 74) | func TestNewEC2KeyPairAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-launch-template-version.go
function launchTemplateVersionInputMapperGet (line 15) | func launchTemplateVersionInputMapperGet(scope string, query string) (*e...
function launchTemplateVersionInputMapperList (line 31) | func launchTemplateVersionInputMapperList(scope string) (*ec2.DescribeLa...
function launchTemplateVersionOutputMapper (line 40) | func launchTemplateVersionOutputMapper(_ context.Context, _ *ec2.Client,...
function NewEC2LaunchTemplateVersionAdapter (line 225) | func NewEC2LaunchTemplateVersionAdapter(client *ec2.Client, accountID st...
FILE: aws-source/adapters/ec2-launch-template-version_test.go
function TestLaunchTemplateVersionInputMapperGet (line 14) | func TestLaunchTemplateVersionInputMapperGet(t *testing.T) {
function TestLaunchTemplateVersionInputMapperList (line 34) | func TestLaunchTemplateVersionInputMapperList(t *testing.T) {
function TestLaunchTemplateVersionOutputMapper (line 46) | func TestLaunchTemplateVersionOutputMapper(t *testing.T) {
function TestNewEC2LaunchTemplateVersionAdapter (line 205) | func TestNewEC2LaunchTemplateVersionAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-launch-template.go
function launchTemplateInputMapperGet (line 12) | func launchTemplateInputMapperGet(scope string, query string) (*ec2.Desc...
function launchTemplateInputMapperList (line 20) | func launchTemplateInputMapperList(scope string) (*ec2.DescribeLaunchTem...
function launchTemplateOutputMapper (line 24) | func launchTemplateOutputMapper(_ context.Context, _ *ec2.Client, scope ...
function NewEC2LaunchTemplateAdapter (line 54) | func NewEC2LaunchTemplateAdapter(client *ec2.Client, accountID string, r...
FILE: aws-source/adapters/ec2-launch-template_test.go
function TestLaunchTemplateInputMapperGet (line 13) | func TestLaunchTemplateInputMapperGet(t *testing.T) {
function TestLaunchTemplateInputMapperList (line 29) | func TestLaunchTemplateInputMapperList(t *testing.T) {
function TestLaunchTemplateOutputMapper (line 41) | func TestLaunchTemplateOutputMapper(t *testing.T) {
function TestNewEC2LaunchTemplateAdapter (line 68) | func TestNewEC2LaunchTemplateAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-nat-gateway.go
function natGatewayInputMapperGet (line 12) | func natGatewayInputMapperGet(scope string, query string) (*ec2.Describe...
function natGatewayInputMapperList (line 20) | func natGatewayInputMapperList(scope string) (*ec2.DescribeNatGatewaysIn...
function natGatewayOutputMapper (line 24) | func natGatewayOutputMapper(_ context.Context, _ *ec2.Client, scope stri...
function NewEC2NatGatewayAdapter (line 111) | func NewEC2NatGatewayAdapter(client *ec2.Client, accountID string, regio...
FILE: aws-source/adapters/ec2-nat-gateway_test.go
function TestNatGatewayInputMapperGet (line 14) | func TestNatGatewayInputMapperGet(t *testing.T) {
function TestNatGatewayInputMapperList (line 30) | func TestNatGatewayInputMapperList(t *testing.T) {
function TestNatGatewayOutputMapper (line 42) | func TestNatGatewayOutputMapper(t *testing.T) {
function TestNewEC2NatGatewayAdapter (line 151) | func TestNewEC2NatGatewayAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-network-acl.go
function networkAclInputMapperGet (line 12) | func networkAclInputMapperGet(scope string, query string) (*ec2.Describe...
function networkAclInputMapperList (line 20) | func networkAclInputMapperList(scope string) (*ec2.DescribeNetworkAclsIn...
function networkAclOutputMapper (line 24) | func networkAclOutputMapper(_ context.Context, _ *ec2.Client, scope stri...
function NewEC2NetworkAclAdapter (line 78) | func NewEC2NetworkAclAdapter(client *ec2.Client, accountID string, regio...
FILE: aws-source/adapters/ec2-network-acl_test.go
function TestNetworkAclInputMapperGet (line 14) | func TestNetworkAclInputMapperGet(t *testing.T) {
function TestNetworkAclInputMapperList (line 30) | func TestNetworkAclInputMapperList(t *testing.T) {
function TestNetworkAclOutputMapper (line 42) | func TestNetworkAclOutputMapper(t *testing.T) {
function TestNewEC2NetworkAclAdapter (line 133) | func TestNewEC2NetworkAclAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-network-interface-permission.go
function networkInterfacePermissionInputMapperGet (line 12) | func networkInterfacePermissionInputMapperGet(scope string, query string...
function networkInterfacePermissionInputMapperList (line 20) | func networkInterfacePermissionInputMapperList(scope string) (*ec2.Descr...
function networkInterfacePermissionOutputMapper (line 24) | func networkInterfacePermissionOutputMapper(_ context.Context, _ *ec2.Cl...
function NewEC2NetworkInterfacePermissionAdapter (line 64) | func NewEC2NetworkInterfacePermissionAdapter(client *ec2.Client, account...
FILE: aws-source/adapters/ec2-network-interface-permission_test.go
function TestNetworkInterfacePermissionInputMapperGet (line 14) | func TestNetworkInterfacePermissionInputMapperGet(t *testing.T) {
function TestNetworkInterfacePermissionInputMapperList (line 30) | func TestNetworkInterfacePermissionInputMapperList(t *testing.T) {
function TestNetworkInterfacePermissionOutputMapper (line 42) | func TestNetworkInterfacePermissionOutputMapper(t *testing.T) {
function TestNewEC2NetworkInterfacePermissionAdapter (line 90) | func TestNewEC2NetworkInterfacePermissionAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-network-interface.go
function networkInterfaceInputMapperGet (line 15) | func networkInterfaceInputMapperGet(scope string, query string) (*ec2.De...
function networkInterfaceInputMapperList (line 23) | func networkInterfaceInputMapperList(scope string) (*ec2.DescribeNetwork...
function networkInterfaceInputMapperSearch (line 27) | func networkInterfaceInputMapperSearch(_ context.Context, _ *ec2.Client,...
function networkInterfaceOutputMapper (line 66) | func networkInterfaceOutputMapper(_ context.Context, _ *ec2.Client, scop...
function NewEC2NetworkInterfaceAdapter (line 227) | func NewEC2NetworkInterfaceAdapter(client *ec2.Client, accountID string,...
FILE: aws-source/adapters/ec2-network-interface_test.go
function TestNetworkInterfaceInputMapperGet (line 14) | func TestNetworkInterfaceInputMapperGet(t *testing.T) {
function TestNetworkInterfaceInputMapperList (line 30) | func TestNetworkInterfaceInputMapperList(t *testing.T) {
function TestNetworkInterfaceInputMapperSearch (line 42) | func TestNetworkInterfaceInputMapperSearch(t *testing.T) {
function TestNetworkInterfaceOutputMapper (line 124) | func TestNetworkInterfaceOutputMapper(t *testing.T) {
function TestNewEC2NetworkInterfaceAdapter (line 282) | func TestNewEC2NetworkInterfaceAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-placement-group.go
function placementGroupInputMapperGet (line 12) | func placementGroupInputMapperGet(scope string, query string) (*ec2.Desc...
function placementGroupInputMapperList (line 20) | func placementGroupInputMapperList(scope string) (*ec2.DescribePlacement...
function placementGroupOutputMapper (line 24) | func placementGroupOutputMapper(_ context.Context, _ *ec2.Client, scope ...
function NewEC2PlacementGroupAdapter (line 54) | func NewEC2PlacementGroupAdapter(client *ec2.Client, accountID string, r...
FILE: aws-source/adapters/ec2-placement-group_test.go
function TestPlacementGroupInputMapperGet (line 13) | func TestPlacementGroupInputMapperGet(t *testing.T) {
function TestPlacementGroupInputMapperList (line 29) | func TestPlacementGroupInputMapperList(t *testing.T) {
function TestPlacementGroupOutputMapper (line 41) | func TestPlacementGroupOutputMapper(t *testing.T) {
function TestNewEC2PlacementGroupAdapter (line 75) | func TestNewEC2PlacementGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-reserved-instance.go
function reservedInstanceInputMapperGet (line 12) | func reservedInstanceInputMapperGet(scope, query string) (*ec2.DescribeR...
function reservedInstanceInputMapperList (line 20) | func reservedInstanceInputMapperList(scope string) (*ec2.DescribeReserve...
function reservedInstanceOutputMapper (line 24) | func reservedInstanceOutputMapper(_ context.Context, _ *ec2.Client, scop...
function NewEC2ReservedInstanceAdapter (line 52) | func NewEC2ReservedInstanceAdapter(client *ec2.Client, accountID string,...
FILE: aws-source/adapters/ec2-reserved-instance_test.go
function TestReservedInstanceInputMapperGet (line 13) | func TestReservedInstanceInputMapperGet(t *testing.T) {
function TestReservedInstanceInputMapperList (line 29) | func TestReservedInstanceInputMapperList(t *testing.T) {
function TestReservedInstanceOutputMapper (line 41) | func TestReservedInstanceOutputMapper(t *testing.T) {
function TestNewEC2ReservedInstanceAdapter (line 97) | func TestNewEC2ReservedInstanceAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-route-table.go
function routeTableInputMapperGet (line 13) | func routeTableInputMapperGet(scope string, query string) (*ec2.Describe...
function routeTableInputMapperList (line 21) | func routeTableInputMapperList(scope string) (*ec2.DescribeRouteTablesIn...
function routeTableOutputMapper (line 25) | func routeTableOutputMapper(_ context.Context, _ *ec2.Client, scope stri...
function NewEC2RouteTableAdapter (line 195) | func NewEC2RouteTableAdapter(client *ec2.Client, accountID string, regio...
FILE: aws-source/adapters/ec2-route-table_test.go
function TestRouteTableInputMapperGet (line 14) | func TestRouteTableInputMapperGet(t *testing.T) {
function TestRouteTableInputMapperList (line 30) | func TestRouteTableInputMapperList(t *testing.T) {
function TestRouteTableOutputMapper (line 42) | func TestRouteTableOutputMapper(t *testing.T) {
function TestNewEC2RouteTableAdapter (line 198) | func TestNewEC2RouteTableAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-security-group-rule.go
function securityGroupRuleInputMapperGet (line 12) | func securityGroupRuleInputMapperGet(scope string, query string) (*ec2.D...
function securityGroupRuleInputMapperList (line 20) | func securityGroupRuleInputMapperList(scope string) (*ec2.DescribeSecuri...
function securityGroupRuleOutputMapper (line 24) | func securityGroupRuleOutputMapper(_ context.Context, _ *ec2.Client, sco...
function NewEC2SecurityGroupRuleAdapter (line 78) | func NewEC2SecurityGroupRuleAdapter(client *ec2.Client, accountID string...
FILE: aws-source/adapters/ec2-security-group-rule_test.go
function TestSecurityGroupRuleInputMapperGet (line 14) | func TestSecurityGroupRuleInputMapperGet(t *testing.T) {
function TestSecurityGroupRuleInputMapperList (line 30) | func TestSecurityGroupRuleInputMapperList(t *testing.T) {
function TestSecurityGroupRuleOutputMapper (line 42) | func TestSecurityGroupRuleOutputMapper(t *testing.T) {
function TestNewEC2SecurityGroupRuleAdapter (line 111) | func TestNewEC2SecurityGroupRuleAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-security-group.go
function securityGroupInputMapperGet (line 13) | func securityGroupInputMapperGet(scope string, query string) (*ec2.Descr...
function securityGroupInputMapperList (line 21) | func securityGroupInputMapperList(scope string) (*ec2.DescribeSecurityGr...
function securityGroupOutputMapper (line 25) | func securityGroupOutputMapper(_ context.Context, _ *ec2.Client, scope s...
function NewEC2SecurityGroupAdapter (line 83) | func NewEC2SecurityGroupAdapter(client *ec2.Client, accountID string, re...
function extractLinkedSecurityGroups (line 129) | func extractLinkedSecurityGroups(permissions []types.IpPermission, scope...
FILE: aws-source/adapters/ec2-security-group_test.go
function TestSecurityGroupInputMapperGet (line 14) | func TestSecurityGroupInputMapperGet(t *testing.T) {
function TestSecurityGroupInputMapperList (line 30) | func TestSecurityGroupInputMapperList(t *testing.T) {
function TestSecurityGroupOutputMapper (line 42) | func TestSecurityGroupOutputMapper(t *testing.T) {
function TestNewEC2SecurityGroupAdapter (line 121) | func TestNewEC2SecurityGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-snapshot.go
function snapshotInputMapperGet (line 12) | func snapshotInputMapperGet(scope string, query string) (*ec2.DescribeSn...
function snapshotInputMapperList (line 20) | func snapshotInputMapperList(scope string) (*ec2.DescribeSnapshotsInput,...
function snapshotOutputMapper (line 30) | func snapshotOutputMapper(_ context.Context, _ *ec2.Client, scope string...
function NewEC2SnapshotAdapter (line 74) | func NewEC2SnapshotAdapter(client *ec2.Client, accountID string, region ...
FILE: aws-source/adapters/ec2-snapshot_test.go
function TestSnapshotInputMapperGet (line 14) | func TestSnapshotInputMapperGet(t *testing.T) {
function TestSnapshotInputMapperList (line 30) | func TestSnapshotInputMapperList(t *testing.T) {
function TestSnapshotOutputMapper (line 42) | func TestSnapshotOutputMapper(t *testing.T) {
function TestNewEC2SnapshotAdapter (line 94) | func TestNewEC2SnapshotAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-subnet.go
function subnetInputMapperGet (line 12) | func subnetInputMapperGet(scope string, query string) (*ec2.DescribeSubn...
function subnetInputMapperList (line 20) | func subnetInputMapperList(scope string) (*ec2.DescribeSubnetsInput, err...
function subnetOutputMapper (line 24) | func subnetOutputMapper(_ context.Context, _ *ec2.Client, scope string, ...
function NewEC2SubnetAdapter (line 65) | func NewEC2SubnetAdapter(client *ec2.Client, accountID string, region st...
FILE: aws-source/adapters/ec2-subnet_test.go
function TestSubnetInputMapperGet (line 14) | func TestSubnetInputMapperGet(t *testing.T) {
function TestSubnetInputMapperList (line 30) | func TestSubnetInputMapperList(t *testing.T) {
function TestSubnetOutputMapper (line 42) | func TestSubnetOutputMapper(t *testing.T) {
function TestNewEC2SubnetAdapter (line 114) | func TestNewEC2SubnetAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-transit-gateway-route-table-association.go
type transitGatewayRouteTableAssociationItem (line 22) | type transitGatewayRouteTableAssociationItem struct
constant associationIDSep (line 27) | associationIDSep = "|"
function transitGatewayRouteTableAssociationID (line 29) | func transitGatewayRouteTableAssociationID(routeTableID, attachmentID st...
function parseCompositeID (line 35) | func parseCompositeID(query, sep string) (string, string) {
function parseAssociationQuery (line 43) | func parseAssociationQuery(query string) (routeTableID, attachmentID str...
function getTransitGatewayRouteTableAssociation (line 53) | func getTransitGatewayRouteTableAssociation(ctx context.Context, client ...
function listTransitGatewayRouteTableAssociations (line 79) | func listTransitGatewayRouteTableAssociations(ctx context.Context, clien...
function searchTransitGatewayRouteTableAssociations (line 115) | func searchTransitGatewayRouteTableAssociations(ctx context.Context, cli...
function transitGatewayRouteTableAssociationItemMapper (line 136) | func transitGatewayRouteTableAssociationItemMapper(query, scope string, ...
function NewEC2TransitGatewayRouteTableAssociationAdapter (line 225) | func NewEC2TransitGatewayRouteTableAssociationAdapter(client *ec2.Client...
FILE: aws-source/adapters/ec2-transit-gateway-route-table-association_test.go
function TestParseAssociationQuery (line 10) | func TestParseAssociationQuery(t *testing.T) {
function TestTransitGatewayRouteTableAssociationItemMapper (line 32) | func TestTransitGatewayRouteTableAssociationItemMapper(t *testing.T) {
function TestNewEC2TransitGatewayRouteTableAssociationAdapter (line 58) | func TestNewEC2TransitGatewayRouteTableAssociationAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-transit-gateway-route-table-propagation.go
type transitGatewayRouteTablePropagationItem (line 20) | type transitGatewayRouteTablePropagationItem struct
constant propagationIDSep (line 25) | propagationIDSep = "|"
function transitGatewayRouteTablePropagationID (line 27) | func transitGatewayRouteTablePropagationID(routeTableID, attachmentID st...
function parsePropagationQuery (line 31) | func parsePropagationQuery(query string) (routeTableID, attachmentID str...
function getTransitGatewayRouteTablePropagation (line 41) | func getTransitGatewayRouteTablePropagation(ctx context.Context, client ...
function listTransitGatewayRouteTablePropagations (line 67) | func listTransitGatewayRouteTablePropagations(ctx context.Context, clien...
function searchTransitGatewayRouteTablePropagations (line 102) | func searchTransitGatewayRouteTablePropagations(ctx context.Context, cli...
function transitGatewayRouteTablePropagationItemMapper (line 123) | func transitGatewayRouteTablePropagationItemMapper(query, scope string, ...
function NewEC2TransitGatewayRouteTablePropagationAdapter (line 222) | func NewEC2TransitGatewayRouteTablePropagationAdapter(client *ec2.Client...
FILE: aws-source/adapters/ec2-transit-gateway-route-table-propagation_test.go
function TestParsePropagationQuery (line 10) | func TestParsePropagationQuery(t *testing.T) {
function TestTransitGatewayRouteTablePropagationItemMapper (line 32) | func TestTransitGatewayRouteTablePropagationItemMapper(t *testing.T) {
function TestNewEC2TransitGatewayRouteTablePropagationAdapter (line 54) | func TestNewEC2TransitGatewayRouteTablePropagationAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-transit-gateway-route-table.go
function transitGatewayRouteTableInputMapperGet (line 16) | func transitGatewayRouteTableInputMapperGet(scope string, query string) ...
function transitGatewayRouteTableInputMapperList (line 24) | func transitGatewayRouteTableInputMapperList(scope string) (*ec2.Describ...
function transitGatewayRouteTableOutputMapper (line 28) | func transitGatewayRouteTableOutputMapper(_ context.Context, _ *ec2.Clie...
function NewEC2TransitGatewayRouteTableAdapter (line 84) | func NewEC2TransitGatewayRouteTableAdapter(client *ec2.Client, accountID...
FILE: aws-source/adapters/ec2-transit-gateway-route-table_test.go
function TestTransitGatewayRouteTableInputMapperGet (line 14) | func TestTransitGatewayRouteTableInputMapperGet(t *testing.T) {
function TestTransitGatewayRouteTableInputMapperList (line 30) | func TestTransitGatewayRouteTableInputMapperList(t *testing.T) {
function TestTransitGatewayRouteTableOutputMapper (line 42) | func TestTransitGatewayRouteTableOutputMapper(t *testing.T) {
function TestNewEC2TransitGatewayRouteTableAdapter (line 100) | func TestNewEC2TransitGatewayRouteTableAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-transit-gateway-route.go
type transitGatewayRouteItem (line 24) | type transitGatewayRouteItem struct
constant routeIDSep (line 29) | routeIDSep = "|"
constant routeDestPrefixList (line 30) | routeDestPrefixList = "pl:"
function transitGatewayRouteDestination (line 32) | func transitGatewayRouteDestination(r *types.TransitGatewayRoute) string {
function transitGatewayRouteID (line 42) | func transitGatewayRouteID(routeTableID, destination string) string {
function parseRouteQuery (line 46) | func parseRouteQuery(query string) (routeTableID, destination string, er...
function searchRoutesFilter (line 57) | func searchRoutesFilter() []types.Filter {
constant maxSearchRoutesResults (line 65) | maxSearchRoutesResults = 1000
function getTransitGatewayRoute (line 67) | func getTransitGatewayRoute(ctx context.Context, client *ec2.Client, _, ...
function listTransitGatewayRoutes (line 96) | func listTransitGatewayRoutes(ctx context.Context, client *ec2.Client, _...
function searchTransitGatewayRoutes (line 133) | func searchTransitGatewayRoutes(ctx context.Context, client *ec2.Client,...
function transitGatewayRouteItemMapper (line 153) | func transitGatewayRouteItemMapper(query, scope string, awsItem *transit...
function NewEC2TransitGatewayRouteAdapter (line 270) | func NewEC2TransitGatewayRouteAdapter(client *ec2.Client, accountID, reg...
FILE: aws-source/adapters/ec2-transit-gateway-route_test.go
function TestTransitGatewayRouteDestination (line 10) | func TestTransitGatewayRouteDestination(t *testing.T) {
function TestParseRouteQuery (line 19) | func TestParseRouteQuery(t *testing.T) {
function TestTransitGatewayRouteItemMapper (line 41) | func TestTransitGatewayRouteItemMapper(t *testing.T) {
function TestNewEC2TransitGatewayRouteAdapter (line 62) | func TestNewEC2TransitGatewayRouteAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-volume-status.go
function volumeStatusInputMapperGet (line 13) | func volumeStatusInputMapperGet(scope string, query string) (*ec2.Descri...
function volumeStatusInputMapperList (line 21) | func volumeStatusInputMapperList(scope string) (*ec2.DescribeVolumeStatu...
function volumeStatusOutputMapper (line 25) | func volumeStatusOutputMapper(_ context.Context, _ *ec2.Client, scope st...
function NewEC2VolumeStatusAdapter (line 91) | func NewEC2VolumeStatusAdapter(client *ec2.Client, accountID string, reg...
FILE: aws-source/adapters/ec2-volume-status_test.go
function TestVolumeStatusInputMapperGet (line 14) | func TestVolumeStatusInputMapperGet(t *testing.T) {
function TestVolumeStatusInputMapperList (line 30) | func TestVolumeStatusInputMapperList(t *testing.T) {
function TestVolumeStatusOutputMapper (line 42) | func TestVolumeStatusOutputMapper(t *testing.T) {
function TestNewEC2VolumeStatusAdapter (line 121) | func TestNewEC2VolumeStatusAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-volume.go
function volumeInputMapperGet (line 12) | func volumeInputMapperGet(scope string, query string) (*ec2.DescribeVolu...
function volumeInputMapperList (line 20) | func volumeInputMapperList(scope string) (*ec2.DescribeVolumesInput, err...
function volumeOutputMapper (line 24) | func volumeOutputMapper(_ context.Context, _ *ec2.Client, scope string, ...
function NewEC2VolumeAdapter (line 65) | func NewEC2VolumeAdapter(client *ec2.Client, accountID string, region st...
FILE: aws-source/adapters/ec2-volume_test.go
function TestVolumeInputMapperGet (line 14) | func TestVolumeInputMapperGet(t *testing.T) {
function TestVolumeInputMapperList (line 30) | func TestVolumeInputMapperList(t *testing.T) {
function TestVolumeOutputMapper (line 42) | func TestVolumeOutputMapper(t *testing.T) {
function TestNewEC2VolumeAdapter (line 103) | func TestNewEC2VolumeAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-vpc-endpoint.go
function vpcEndpointInputMapperGet (line 15) | func vpcEndpointInputMapperGet(scope string, query string) (*ec2.Describ...
function vpcEndpointInputMapperList (line 23) | func vpcEndpointInputMapperList(scope string) (*ec2.DescribeVpcEndpoints...
function vpcEndpointOutputMapper (line 27) | func vpcEndpointOutputMapper(_ context.Context, _ *ec2.Client, scope str...
function NewEC2VpcEndpointAdapter (line 181) | func NewEC2VpcEndpointAdapter(client *ec2.Client, accountID string, regi...
FILE: aws-source/adapters/ec2-vpc-endpoint_test.go
function TestVpcEndpointInputMapperGet (line 14) | func TestVpcEndpointInputMapperGet(t *testing.T) {
function TestVpcEndpointOutputMapper (line 30) | func TestVpcEndpointOutputMapper(t *testing.T) {
function TestNewEC2VpcEndpointAdapter (line 148) | func TestNewEC2VpcEndpointAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-vpc-peering-connection.go
function vpcPeeringConnectionOutputMapper (line 13) | func vpcPeeringConnectionOutputMapper(_ context.Context, _ *ec2.Client, ...
function NewEC2VpcPeeringConnectionAdapter (line 95) | func NewEC2VpcPeeringConnectionAdapter(client *ec2.Client, accountID str...
FILE: aws-source/adapters/ec2-vpc-peering-connection_test.go
function TestVpcPeeringConnectionOutputMapper (line 14) | func TestVpcPeeringConnectionOutputMapper(t *testing.T) {
function TestNewEC2VpcPeeringConnectionAdapter (line 104) | func TestNewEC2VpcPeeringConnectionAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2-vpc.go
function vpcInputMapperGet (line 12) | func vpcInputMapperGet(scope string, query string) (*ec2.DescribeVpcsInp...
function vpcInputMapperList (line 20) | func vpcInputMapperList(scope string) (*ec2.DescribeVpcsInput, error) {
function vpcOutputMapper (line 24) | func vpcOutputMapper(_ context.Context, _ *ec2.Client, scope string, _ *...
function NewEC2VpcAdapter (line 54) | func NewEC2VpcAdapter(client *ec2.Client, accountID string, region strin...
FILE: aws-source/adapters/ec2-vpc_test.go
function TestVpcInputMapperGet (line 13) | func TestVpcInputMapperGet(t *testing.T) {
function TestVpcInputMapperList (line 29) | func TestVpcInputMapperList(t *testing.T) {
function TestVpcOutputMapper (line 41) | func TestVpcOutputMapper(t *testing.T) {
function TestNewEC2VpcAdapter (line 100) | func TestNewEC2VpcAdapter(t *testing.T) {
FILE: aws-source/adapters/ec2.go
function ec2TagsToMap (line 6) | func ec2TagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/ec2_test.go
function ec2GetAutoConfig (line 9) | func ec2GetAutoConfig(t *testing.T) (*ec2.Client, string, string) {
FILE: aws-source/adapters/ecs-capacity-provider.go
function capacityProviderOutputMapper (line 18) | func capacityProviderOutputMapper(_ context.Context, _ ECSClient, scope ...
function NewECSCapacityProviderAdapter (line 57) | func NewECSCapacityProviderAdapter(client ECSClient, accountID string, r...
type DescribeCapacityProvidersPaginator (line 114) | type DescribeCapacityProvidersPaginator struct
method HasMorePages (line 136) | func (p *DescribeCapacityProvidersPaginator) HasMorePages() bool {
method NextPage (line 141) | func (p *DescribeCapacityProvidersPaginator) NextPage(ctx context.Cont...
function NewDescribeCapacityProvidersPaginator (line 122) | func NewDescribeCapacityProvidersPaginator(client ECSClient, params *ecs...
FILE: aws-source/adapters/ecs-capacity-provider_test.go
method DescribeCapacityProviders (line 15) | func (t *ecsTestClient) DescribeCapacityProviders(ctx context.Context, p...
function TestCapacityProviderOutputMapper (line 70) | func TestCapacityProviderOutputMapper(t *testing.T) {
function TestCapacityProviderAdapter (line 125) | func TestCapacityProviderAdapter(t *testing.T) {
function TestNewECSCapacityProviderAdapter (line 142) | func TestNewECSCapacityProviderAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs-cluster.go
function ecsClusterGetFunc (line 23) | func ecsClusterGetFunc(ctx context.Context, client ECSClient, scope stri...
function NewECSClusterAdapter (line 167) | func NewECSClusterAdapter(client ECSClient, accountID string, region str...
FILE: aws-source/adapters/ecs-cluster_test.go
method DescribeClusters (line 14) | func (t *ecsTestClient) DescribeClusters(ctx context.Context, params *ec...
method ListClusters (line 86) | func (t *ecsTestClient) ListClusters(context.Context, *ecs.ListClustersI...
function TestECSClusterGetFunc (line 94) | func TestECSClusterGetFunc(t *testing.T) {
function TestECSNewECSClusterAdapter (line 148) | func TestECSNewECSClusterAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs-container-instance.go
function containerInstanceGetFunc (line 21) | func containerInstanceGetFunc(ctx context.Context, client ECSClient, sco...
function containerInstanceListFuncOutputMapper (line 82) | func containerInstanceListFuncOutputMapper(output *ecs.ListContainerInst...
function NewECSContainerInstanceAdapter (line 113) | func NewECSContainerInstanceAdapter(client ECSClient, accountID string, ...
FILE: aws-source/adapters/ecs-container-instance_test.go
method DescribeContainerInstances (line 14) | func (t *ecsTestClient) DescribeContainerInstances(ctx context.Context, ...
method ListContainerInstances (line 319) | func (t *ecsTestClient) ListContainerInstances(context.Context, *ecs.Lis...
function TestContainerInstanceGetFunc (line 327) | func TestContainerInstanceGetFunc(t *testing.T) {
function TestNewECSContainerInstanceAdapter (line 350) | func TestNewECSContainerInstanceAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs-service.go
function serviceGetFunc (line 20) | func serviceGetFunc(ctx context.Context, client ECSClient, scope string,...
function serviceListFuncOutputMapper (line 267) | func serviceListFuncOutputMapper(output *ecs.ListServicesOutput, input *...
function NewECSServiceAdapter (line 298) | func NewECSServiceAdapter(client ECSClient, accountID string, region str...
FILE: aws-source/adapters/ecs-service_test.go
method DescribeServices (line 14) | func (t *ecsTestClient) DescribeServices(ctx context.Context, params *ec...
method ListServices (line 209) | func (t *ecsTestClient) ListServices(context.Context, *ecs.ListServicesI...
function TestServiceGetFunc (line 217) | func TestServiceGetFunc(t *testing.T) {
function TestNewECSServiceAdapter (line 312) | func TestNewECSServiceAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs-task-definition.go
function taskDefinitionGetFunc (line 19) | func taskDefinitionGetFunc(ctx context.Context, client ECSClient, scope ...
function getSecretLinkedItem (line 120) | func getSecretLinkedItem(secret types.Secret) *sdp.LinkedItemQuery {
function NewECSTaskDefinitionAdapter (line 153) | func NewECSTaskDefinitionAdapter(client ECSClient, accountID string, reg...
FILE: aws-source/adapters/ecs-task-definition_test.go
method DescribeTaskDefinition (line 14) | func (t *ecsTestClient) DescribeTaskDefinition(ctx context.Context, para...
method ListTaskDefinitions (line 199) | func (t *ecsTestClient) ListTaskDefinitions(context.Context, *ecs.ListTa...
function TestTaskDefinitionGetFunc (line 207) | func TestTaskDefinitionGetFunc(t *testing.T) {
function TestNewECSTaskDefinitionAdapter (line 256) | func TestNewECSTaskDefinitionAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs-task.go
function taskGetFunc (line 21) | func taskGetFunc(ctx context.Context, client ECSClient, scope string, in...
function taskGetInputMapper (line 156) | func taskGetInputMapper(scope, query string) *ecs.DescribeTasksInput {
function tasksListFuncOutputMapper (line 173) | func tasksListFuncOutputMapper(output *ecs.ListTasksOutput, input *ecs.L...
function NewECSTaskAdapter (line 198) | func NewECSTaskAdapter(client ECSClient, accountID string, region string...
FILE: aws-source/adapters/ecs-task_test.go
method DescribeTasks (line 14) | func (t *ecsTestClient) DescribeTasks(ctx context.Context, params *ecs.D...
method ListTasks (line 113) | func (t *ecsTestClient) ListTasks(context.Context, *ecs.ListTasksInput, ...
function TestTaskGetInputMapper (line 121) | func TestTaskGetInputMapper(t *testing.T) {
function TestTasksListFuncOutputMapper (line 156) | func TestTasksListFuncOutputMapper(t *testing.T) {
function TestTaskGetFunc (line 181) | func TestTaskGetFunc(t *testing.T) {
function TestNewECSTaskAdapter (line 234) | func TestNewECSTaskAdapter(t *testing.T) {
FILE: aws-source/adapters/ecs.go
type ECSClient (line 10) | type ECSClient interface
function ecsTagsToMap (line 26) | func ecsTagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/ecs_test.go
type ecsTestClient (line 9) | type ecsTestClient struct
function ecsGetAutoConfig (line 11) | func ecsGetAutoConfig(t *testing.T) (*ecs.Client, string, string) {
FILE: aws-source/adapters/efs-access-point.go
function AccessPointOutputMapper (line 13) | func AccessPointOutputMapper(_ context.Context, _ *efs.Client, scope str...
function NewEFSAccessPointAdapter (line 53) | func NewEFSAccessPointAdapter(client *efs.Client, accountID string, regi...
FILE: aws-source/adapters/efs-access-point_test.go
function TestAccessPointOutputMapper (line 14) | func TestAccessPointOutputMapper(t *testing.T) {
function TestNewEFSAccessPointAdapter (line 83) | func TestNewEFSAccessPointAdapter(t *testing.T) {
FILE: aws-source/adapters/efs-backup-policy.go
function BackupPolicyOutputMapper (line 13) | func BackupPolicyOutputMapper(_ context.Context, _ *efs.Client, scope st...
function NewEFSBackupPolicyAdapter (line 53) | func NewEFSBackupPolicyAdapter(client *efs.Client, accountID string, reg...
FILE: aws-source/adapters/efs-backup-policy_test.go
function TestBackupPolicyOutputMapper (line 11) | func TestBackupPolicyOutputMapper(t *testing.T) {
FILE: aws-source/adapters/efs-file-system.go
function FileSystemOutputMapper (line 13) | func FileSystemOutputMapper(_ context.Context, _ *efs.Client, scope stri...
function NewEFSFileSystemAdapter (line 78) | func NewEFSFileSystemAdapter(client *efs.Client, accountID string, regio...
FILE: aws-source/adapters/efs-file-system_test.go
function TestFileSystemOutputMapper (line 14) | func TestFileSystemOutputMapper(t *testing.T) {
function TestNewEFSFileSystemAdapter (line 94) | func TestNewEFSFileSystemAdapter(t *testing.T) {
FILE: aws-source/adapters/efs-mount-target.go
function MountTargetOutputMapper (line 13) | func MountTargetOutputMapper(_ context.Context, _ *efs.Client, scope str...
function NewEFSMountTargetAdapter (line 103) | func NewEFSMountTargetAdapter(client *efs.Client, accountID string, regi...
FILE: aws-source/adapters/efs-mount-target_test.go
function TestMountTargetOutputMapper (line 13) | func TestMountTargetOutputMapper(t *testing.T) {
FILE: aws-source/adapters/efs-replication-configuration.go
function ReplicationConfigurationOutputMapper (line 14) | func ReplicationConfigurationOutputMapper(_ context.Context, _ *efs.Clie...
function NewEFSReplicationConfigurationAdapter (line 115) | func NewEFSReplicationConfigurationAdapter(client *efs.Client, accountID...
FILE: aws-source/adapters/efs-replication-configuration_test.go
function TestReplicationConfigurationOutputMapper (line 12) | func TestReplicationConfigurationOutputMapper(t *testing.T) {
FILE: aws-source/adapters/efs.go
function lifeCycleStateToHealth (line 9) | func lifeCycleStateToHealth(state types.LifeCycleState) *sdp.Health {
function efsTagsToMap (line 29) | func efsTagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/efs_test.go
function efsGetAutoConfig (line 8) | func efsGetAutoConfig(t *testing.T) (*efs.Client, string, string) {
FILE: aws-source/adapters/eks-addon.go
function addonGetFunc (line 13) | func addonGetFunc(ctx context.Context, client EKSClient, scope string, i...
function NewEKSAddonAdapter (line 47) | func NewEKSAddonAdapter(client EKSClient, accountID string, region strin...
FILE: aws-source/adapters/eks-addon_test.go
function TestAddonGetFunc (line 38) | func TestAddonGetFunc(t *testing.T) {
function TestNewEKSAddonAdapter (line 50) | func TestNewEKSAddonAdapter(t *testing.T) {
FILE: aws-source/adapters/eks-cluster.go
function clusterGetFunc (line 13) | func clusterGetFunc(ctx context.Context, client EKSClient, scope string,...
function NewEKSClusterAdapter (line 192) | func NewEKSClusterAdapter(client EKSClient, accountID string, region str...
FILE: aws-source/adapters/eks-cluster_test.go
function TestClusterGetFunc (line 110) | func TestClusterGetFunc(t *testing.T) {
function TestNewEKSClusterAdapter (line 207) | func TestNewEKSClusterAdapter(t *testing.T) {
FILE: aws-source/adapters/eks-fargate-profile.go
function fargateProfileGetFunc (line 13) | func fargateProfileGetFunc(ctx context.Context, client EKSClient, scope ...
function NewEKSFargateProfileAdapter (line 72) | func NewEKSFargateProfileAdapter(client EKSClient, accountID string, reg...
FILE: aws-source/adapters/eks-fargate-profile_test.go
function TestFargateProfileGetFunc (line 37) | func TestFargateProfileGetFunc(t *testing.T) {
function TestNewEKSFargateProfileAdapter (line 68) | func TestNewEKSFargateProfileAdapter(t *testing.T) {
FILE: aws-source/adapters/eks-nodegroup.go
function nodegroupGetFunc (line 13) | func nodegroupGetFunc(ctx context.Context, client EKSClient, scope strin...
function NewEKSNodegroupAdapter (line 136) | func NewEKSNodegroupAdapter(client EKSClient, accountID string, region s...
FILE: aws-source/adapters/eks-nodegroup_test.go
function TestNodegroupGetFunc (line 78) | func TestNodegroupGetFunc(t *testing.T) {
function TestNewEKSNodegroupAdapter (line 133) | func TestNewEKSNodegroupAdapter(t *testing.T) {
FILE: aws-source/adapters/eks.go
type EKSClient (line 9) | type EKSClient interface
FILE: aws-source/adapters/eks_test.go
type EKSTestClient (line 10) | type EKSTestClient struct
method ListClusters (line 23) | func (t EKSTestClient) ListClusters(context.Context, *eks.ListClusters...
method DescribeCluster (line 27) | func (t EKSTestClient) DescribeCluster(ctx context.Context, params *ek...
method ListAddons (line 31) | func (t EKSTestClient) ListAddons(context.Context, *eks.ListAddonsInpu...
method DescribeAddon (line 35) | func (t EKSTestClient) DescribeAddon(ctx context.Context, params *eks....
method ListFargateProfiles (line 39) | func (t EKSTestClient) ListFargateProfiles(ctx context.Context, params...
method DescribeFargateProfile (line 43) | func (t EKSTestClient) DescribeFargateProfile(ctx context.Context, par...
method ListIdentityProviderConfigs (line 47) | func (t EKSTestClient) ListIdentityProviderConfigs(ctx context.Context...
method DescribeIdentityProviderConfig (line 51) | func (t EKSTestClient) DescribeIdentityProviderConfig(ctx context.Cont...
method ListNodegroups (line 55) | func (t EKSTestClient) ListNodegroups(ctx context.Context, params *eks...
method DescribeNodegroup (line 59) | func (t EKSTestClient) DescribeNodegroup(ctx context.Context, params *...
function eksGetAutoConfig (line 63) | func eksGetAutoConfig(t *testing.T) (*eks.Client, string, string) {
FILE: aws-source/adapters/elb-instance-health.go
type InstanceHealthName (line 18) | type InstanceHealthName struct
method String (line 23) | func (i InstanceHealthName) String() string {
function ParseInstanceName (line 27) | func ParseInstanceName(name string) (InstanceHealthName, error) {
function instanceHealthOutputMapper (line 40) | func instanceHealthOutputMapper(_ context.Context, _ *elb.Client, scope ...
function NewELBInstanceHealthAdapter (line 85) | func NewELBInstanceHealthAdapter(client *elb.Client, accountID string, r...
FILE: aws-source/adapters/elb-instance-health_test.go
function TestInstanceHealthOutputMapper (line 13) | func TestInstanceHealthOutputMapper(t *testing.T) {
FILE: aws-source/adapters/elb-load-balancer.go
type elbClient (line 14) | type elbClient interface
function elbTagsToMap (line 19) | func elbTagsToMap(tags []types.Tag) map[string]string {
constant elbDescribeTagsMaxItems (line 33) | elbDescribeTagsMaxItems = 20
function elbGetTagsMap (line 35) | func elbGetTagsMap(ctx context.Context, client elbClient, loadBalancerNa...
function tagsToELBTags (line 79) | func tagsToELBTags(tags map[string]string) []types.Tag {
function elbLoadBalancerOutputMapper (line 90) | func elbLoadBalancerOutputMapper(ctx context.Context, client elbClient, ...
function NewELBLoadBalancerAdapter (line 225) | func NewELBLoadBalancerAdapter(client elbClient, accountID string, regio...
FILE: aws-source/adapters/elb-load-balancer_test.go
type mockElbClient (line 15) | type mockElbClient struct
method DescribeTags (line 17) | func (m mockElbClient) DescribeTags(ctx context.Context, params *elb.D...
method DescribeLoadBalancers (line 40) | func (m mockElbClient) DescribeLoadBalancers(ctx context.Context, para...
function TestElbGetTagsMapBatching (line 44) | func TestElbGetTagsMapBatching(t *testing.T) {
function TestELBv2LoadBalancerOutputMapper (line 66) | func TestELBv2LoadBalancerOutputMapper(t *testing.T) {
FILE: aws-source/adapters/elbv2-listener.go
function listenerOutputMapper (line 15) | func listenerOutputMapper(ctx context.Context, client elbv2Client, scope...
function NewELBv2ListenerAdapter (line 120) | func NewELBv2ListenerAdapter(client elbv2Client, accountID string, regio...
FILE: aws-source/adapters/elbv2-listener_test.go
function TestListenerOutputMapper (line 13) | func TestListenerOutputMapper(t *testing.T) {
FILE: aws-source/adapters/elbv2-load-balancer.go
function elbv2LoadBalancerOutputMapper (line 12) | func elbv2LoadBalancerOutputMapper(ctx context.Context, client elbv2Clie...
function NewELBv2LoadBalancerAdapter (line 187) | func NewELBv2LoadBalancerAdapter(client elbv2Client, accountID string, r...
FILE: aws-source/adapters/elbv2-load-balancer_test.go
function TestLoadBalancerOutputMapper (line 14) | func TestLoadBalancerOutputMapper(t *testing.T) {
FILE: aws-source/adapters/elbv2-rule.go
function ruleOutputMapper (line 12) | func ruleOutputMapper(ctx context.Context, client elbv2Client, scope str...
function NewELBv2RuleAdapter (line 74) | func NewELBv2RuleAdapter(client elbv2Client, accountID string, region st...
FILE: aws-source/adapters/elbv2-rule_test.go
function TestRuleOutputMapper (line 17) | func TestRuleOutputMapper(t *testing.T) {
function TestNewELBv2RuleAdapter (line 96) | func TestNewELBv2RuleAdapter(t *testing.T) {
FILE: aws-source/adapters/elbv2-target-group.go
function targetGroupOutputMapper (line 13) | func targetGroupOutputMapper(ctx context.Context, client elbv2Client, sc...
function NewELBv2TargetGroupAdapter (line 88) | func NewELBv2TargetGroupAdapter(client elbv2Client, accountID string, re...
FILE: aws-source/adapters/elbv2-target-group_test.go
function TestTargetGroupOutputMapper (line 15) | func TestTargetGroupOutputMapper(t *testing.T) {
function TestNewELBv2TargetGroupAdapter (line 88) | func TestNewELBv2TargetGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/elbv2-target-health.go
type TargetHealthUniqueID (line 17) | type TargetHealthUniqueID struct
method String (line 26) | func (id TargetHealthUniqueID) String() string {
function ToTargetHealthUniqueID (line 47) | func ToTargetHealthUniqueID(id string) (TargetHealthUniqueID, error) {
function targetHealthOutputMapper (line 78) | func targetHealthOutputMapper(_ context.Context, _ *elbv2.Client, scope ...
function NewELBv2TargetHealthAdapter (line 198) | func NewELBv2TargetHealthAdapter(client *elbv2.Client, accountID string,...
FILE: aws-source/adapters/elbv2-target-health_test.go
function TestTargetHealthOutputMapper (line 13) | func TestTargetHealthOutputMapper(t *testing.T) {
function TestTargetHealthUniqueID (line 142) | func TestTargetHealthUniqueID(t *testing.T) {
function CompareTargetHealthUniqueID (line 216) | func CompareTargetHealthUniqueID(x, y TargetHealthUniqueID, t *testing.T) {
FILE: aws-source/adapters/elbv2.go
type elbv2Client (line 14) | type elbv2Client interface
function elbv2TagsToMap (line 22) | func elbv2TagsToMap(tags []types.Tag) map[string]string {
constant elbv2DescribeTagsMaxItems (line 36) | elbv2DescribeTagsMaxItems = 20
function elbv2GetTagsMap (line 39) | func elbv2GetTagsMap(ctx context.Context, client elbv2Client, arns []str...
function ActionToRequests (line 84) | func ActionToRequests(action types.Action) []*sdp.LinkedItemQuery {
FILE: aws-source/adapters/elbv2_test.go
type mockElbv2Client (line 13) | type mockElbv2Client struct
method DescribeTags (line 17) | func (m mockElbv2Client) DescribeTags(ctx context.Context, params *elb...
method DescribeLoadBalancers (line 41) | func (m mockElbv2Client) DescribeLoadBalancers(ctx context.Context, pa...
method DescribeListeners (line 45) | func (m mockElbv2Client) DescribeListeners(ctx context.Context, params...
method DescribeRules (line 49) | func (m mockElbv2Client) DescribeRules(ctx context.Context, params *el...
method DescribeTargetGroups (line 53) | func (m mockElbv2Client) DescribeTargetGroups(ctx context.Context, par...
function TestElbv2GetTagsMapBatching (line 57) | func TestElbv2GetTagsMapBatching(t *testing.T) {
function TestActionToRequests (line 101) | func TestActionToRequests(t *testing.T) {
FILE: aws-source/adapters/iam-group.go
function groupGetFunc (line 14) | func groupGetFunc(ctx context.Context, client *iam.Client, _, query stri...
function groupItemMapper (line 26) | func groupItemMapper(_ *string, scope string, awsItem *types.Group) (*sd...
function NewIAMGroupAdapter (line 43) | func NewIAMGroupAdapter(client *iam.Client, accountID string, cache sdpc...
FILE: aws-source/adapters/iam-group_test.go
function TestGroupItemMapper (line 13) | func TestGroupItemMapper(t *testing.T) {
function TestNewIAMGroupAdapter (line 34) | func TestNewIAMGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/iam-instance-profile.go
function instanceProfileGetFunc (line 14) | func instanceProfileGetFunc(ctx context.Context, client *iam.Client, _, ...
function instanceProfileItemMapper (line 26) | func instanceProfileItemMapper(_ *string, scope string, awsItem *types.I...
function instanceProfileListTagsFunc (line 69) | func instanceProfileListTagsFunc(ctx context.Context, ip *types.Instance...
function NewIAMInstanceProfileAdapter (line 93) | func NewIAMInstanceProfileAdapter(client *iam.Client, accountID string, ...
FILE: aws-source/adapters/iam-instance-profile_test.go
function TestInstanceProfileItemMapper (line 13) | func TestInstanceProfileItemMapper(t *testing.T) {
function TestNewIAMInstanceProfileAdapter (line 54) | func TestNewIAMInstanceProfileAdapter(t *testing.T) {
FILE: aws-source/adapters/iam-policy.go
type PolicyDetails (line 22) | type PolicyDetails struct
function policyGetFunc (line 30) | func policyGetFunc(ctx context.Context, client IAMClient, scope, query s...
function addPolicyDocument (line 68) | func addPolicyDocument(ctx context.Context, client IAMClient, pol *Polic...
function addPolicyEntities (line 99) | func addPolicyEntities(ctx context.Context, client IAMClient, details *P...
function policyItemMapper (line 133) | func policyItemMapper(_ *string, scope string, awsItem *PolicyDetails) (...
function policyListTagsFunc (line 207) | func policyListTagsFunc(ctx context.Context, p *PolicyDetails, client IA...
function policyListExtractor (line 230) | func policyListExtractor(ctx context.Context, output *iam.ListPoliciesOu...
function NewIAMPolicyAdapter (line 256) | func NewIAMPolicyAdapter(client IAMClient, accountID string, cache sdpca...
FILE: aws-source/adapters/iam-policy_test.go
method GetPolicy (line 17) | func (t *TestIAMClient) GetPolicy(ctx context.Context, params *iam.GetPo...
method ListEntitiesForPolicy (line 34) | func (t *TestIAMClient) ListEntitiesForPolicy(context.Context, *iam.List...
method ListPolicies (line 57) | func (t *TestIAMClient) ListPolicies(context.Context, *iam.ListPoliciesI...
method ListPolicyTags (line 88) | func (t *TestIAMClient) ListPolicyTags(ctx context.Context, params *iam....
constant testPolicy (line 99) | testPolicy = `{
method GetPolicyVersion (line 116) | func (c *TestIAMClient) GetPolicyVersion(ctx context.Context, params *ia...
function TestGetCurrentPolicyVersion (line 131) | func TestGetCurrentPolicyVersion(t *testing.T) {
function TestPolicyGetFunc (line 177) | func TestPolicyGetFunc(t *testing.T) {
function TestPolicyListTagsFunc (line 208) | func TestPolicyListTagsFunc(t *testing.T) {
function TestPolicyItemMapper (line 223) | func TestPolicyItemMapper(t *testing.T) {
function TestNewIAMPolicyAdapter (line 309) | func TestNewIAMPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/iam-role.go
type RoleDetails (line 18) | type RoleDetails struct
function roleGetFunc (line 24) | func roleGetFunc(ctx context.Context, client IAMClient, _, query string)...
function enrichRole (line 46) | func enrichRole(ctx context.Context, client IAMClient, roleDetails *Role...
type embeddedPolicy (line 69) | type embeddedPolicy struct
function getEmbeddedPolicies (line 75) | func getEmbeddedPolicies(ctx context.Context, client IAMClient, roleName...
function getRolePolicyDetails (line 110) | func getRolePolicyDetails(ctx context.Context, client IAMClient, roleNam...
function getAttachedPolicies (line 139) | func getAttachedPolicies(ctx context.Context, client IAMClient, roleName...
function roleItemMapper (line 159) | func roleItemMapper(_ *string, scope string, awsItem *RoleDetails) (*sdp...
function roleListTagsFunc (line 222) | func roleListTagsFunc(ctx context.Context, r *RoleDetails, client IAMCli...
function NewIAMRoleAdapter (line 246) | func NewIAMRoleAdapter(client IAMClient, accountID string, cache sdpcach...
FILE: aws-source/adapters/iam-role_test.go
method GetRole (line 19) | func (t *TestIAMClient) GetRole(ctx context.Context, params *iam.GetRole...
method ListRolePolicies (line 44) | func (t *TestIAMClient) ListRolePolicies(context.Context, *iam.ListRoleP...
method ListRoles (line 53) | func (t *TestIAMClient) ListRoles(context.Context, *iam.ListRolesInput, ...
method ListRoleTags (line 80) | func (t *TestIAMClient) ListRoleTags(ctx context.Context, params *iam.Li...
method GetRolePolicy (line 91) | func (t *TestIAMClient) GetRolePolicy(ctx context.Context, params *iam.G...
method ListAttachedRolePolicies (line 109) | func (t *TestIAMClient) ListAttachedRolePolicies(ctx context.Context, pa...
function TestRoleGetFunc (line 124) | func TestRoleGetFunc(t *testing.T) {
function TestRoleListFunc (line 143) | func TestRoleListFunc(t *testing.T) {
function TestRoleListTagsFunc (line 160) | func TestRoleListTagsFunc(t *testing.T) {
constant listBucketsPolicy (line 175) | listBucketsPolicy = `{
function TestRoleItemMapper (line 187) | func TestRoleItemMapper(t *testing.T) {
function TestNewIAMRoleAdapter (line 250) | func TestNewIAMRoleAdapter(t *testing.T) {
FILE: aws-source/adapters/iam-user.go
type UserDetails (line 15) | type UserDetails struct
function userGetFunc (line 20) | func userGetFunc(ctx context.Context, client IAMClient, _, query string)...
function enrichUser (line 44) | func enrichUser(ctx context.Context, client IAMClient, userDetails *User...
function getUserGroups (line 57) | func getUserGroups(ctx context.Context, client IAMClient, userName *stri...
function userItemMapper (line 80) | func userItemMapper(_ *string, scope string, awsItem *UserDetails) (*sdp...
function userListTagsFunc (line 108) | func userListTagsFunc(ctx context.Context, u *UserDetails, client IAMCli...
function NewIAMUserAdapter (line 132) | func NewIAMUserAdapter(client IAMClient, accountID string, cache sdpcach...
FILE: aws-source/adapters/iam-user_test.go
method ListGroupsForUser (line 19) | func (t *TestIAMClient) ListGroupsForUser(ctx context.Context, params *i...
method GetUser (line 55) | func (t *TestIAMClient) GetUser(ctx context.Context, params *iam.GetUser...
method ListUsers (line 67) | func (t *TestIAMClient) ListUsers(ctx context.Context, params *iam.ListU...
method ListUserTags (line 103) | func (t *TestIAMClient) ListUserTags(context.Context, *iam.ListUserTagsI...
function TestGetUserGroups (line 116) | func TestGetUserGroups(t *testing.T) {
function TestUserGetFunc (line 127) | func TestUserGetFunc(t *testing.T) {
function TestUserListFunc (line 142) | func TestUserListFunc(t *testing.T) {
function TestUserListTagsFunc (line 168) | func TestUserListTagsFunc(t *testing.T) {
function TestUserItemMapper (line 183) | func TestUserItemMapper(t *testing.T) {
function TestNewIAMUserAdapter (line 224) | func TestNewIAMUserAdapter(t *testing.T) {
FILE: aws-source/adapters/iam.go
type IAMClient (line 16) | type IAMClient interface
type QueryExtractorFunc (line 35) | type QueryExtractorFunc
type QueryExtractor (line 42) | type QueryExtractor struct
function LinksFromPolicy (line 133) | func LinksFromPolicy(document *policy.Policy) []*sdp.LinkedItemQuery {
function ParsePolicyDocument (line 198) | func ParsePolicyDocument(encoded string) (*policy.Policy, error) {
FILE: aws-source/adapters/iam_test.go
type TestIAMClient (line 14) | type TestIAMClient struct
function TestMain (line 16) | func TestMain(m *testing.M) {
function TestLinksFromPolicy (line 30) | func TestLinksFromPolicy(t *testing.T) {
function TestLinksFromPolicy_EdgeCases (line 94) | func TestLinksFromPolicy_EdgeCases(t *testing.T) {
FILE: aws-source/adapters/integration/apigateway/apigateway_test.go
function APIGateway (line 14) | func APIGateway(t *testing.T) {
FILE: aws-source/adapters/integration/apigateway/create.go
function createRestAPI (line 15) | func createRestAPI(ctx context.Context, logger *slog.Logger, client *api...
function createResource (line 43) | func createResource(ctx context.Context, logger *slog.Logger, client *ap...
function cleanPath (line 71) | func cleanPath(path string) string {
function createMethod (line 80) | func createMethod(ctx context.Context, logger *slog.Logger, client *apig...
function createMethodResponse (line 109) | func createMethodResponse(ctx context.Context, logger *slog.Logger, clie...
function createIntegration (line 144) | func createIntegration(ctx context.Context, logger *slog.Logger, client ...
function createAPIKey (line 173) | func createAPIKey(ctx context.Context, logger *slog.Logger, client *apig...
function createAuthorizer (line 201) | func createAuthorizer(ctx context.Context, logger *slog.Logger, client *...
function createDeployment (line 232) | func createDeployment(ctx context.Context, logger *slog.Logger, client *...
function createStage (line 259) | func createStage(ctx context.Context, logger *slog.Logger, client *apiga...
function createModel (line 288) | func createModel(ctx context.Context, logger *slog.Logger, client *apiga...
FILE: aws-source/adapters/integration/apigateway/delete.go
function deleteRestAPI (line 9) | func deleteRestAPI(ctx context.Context, client *apigateway.Client, restA...
function deleteAPIKeyByName (line 17) | func deleteAPIKeyByName(ctx context.Context, client *apigateway.Client, ...
FILE: aws-source/adapters/integration/apigateway/find.go
function findRestAPIsByTags (line 13) | func findRestAPIsByTags(ctx context.Context, client *apigateway.Client, ...
function findResource (line 28) | func findResource(ctx context.Context, client *apigateway.Client, restAP...
function findMethod (line 45) | func findMethod(ctx context.Context, client *apigateway.Client, restAPII...
function findMethodResponse (line 68) | func findMethodResponse(ctx context.Context, client *apigateway.Client, ...
function findIntegration (line 93) | func findIntegration(ctx context.Context, client *apigateway.Client, res...
function findAPIKeyByName (line 116) | func findAPIKeyByName(ctx context.Context, client *apigateway.Client, na...
function findAuthorizerByName (line 137) | func findAuthorizerByName(ctx context.Context, client *apigateway.Client...
function findDeploymentByDescription (line 158) | func findDeploymentByDescription(ctx context.Context, client *apigateway...
function findStageByName (line 175) | func findStageByName(ctx context.Context, client *apigateway.Client, res...
function findModelByName (line 204) | func findModelByName(ctx context.Context, client *apigateway.Client, res...
FILE: aws-source/adapters/integration/apigateway/main_test.go
function TestMain (line 14) | func TestMain(m *testing.M) {
function TestIntegrationAPIGateway (line 24) | func TestIntegrationAPIGateway(t *testing.T) {
function Setup (line 30) | func Setup(t *testing.T) {
function Teardown (line 45) | func Teardown(t *testing.T) {
function apigatewayClient (line 60) | func apigatewayClient(ctx context.Context) (*apigateway.Client, error) {
FILE: aws-source/adapters/integration/apigateway/setup.go
constant restAPISrc (line 13) | restAPISrc = "rest-api"
constant resourceSrc (line 14) | resourceSrc = "resource"
constant methodSrc (line 15) | methodSrc = "method"
constant methodResponseSrc (line 16) | methodResponseSrc = "method-response"
constant integrationSrc (line 17) | integrationSrc = "integration"
constant apiKeySrc (line 18) | apiKeySrc = "api-key"
constant authorizerSrc (line 19) | authorizerSrc = "authorizer"
constant deploymentSrc (line 20) | deploymentSrc = "deployment"
constant stageSrc (line 21) | stageSrc = "stage"
constant modelSrc (line 22) | modelSrc = "model"
function setup (line 25) | func setup(ctx context.Context, logger *slog.Logger, client *apigateway....
FILE: aws-source/adapters/integration/apigateway/teardown.go
function teardown (line 13) | func teardown(ctx context.Context, logger *slog.Logger, client *apigatew...
FILE: aws-source/adapters/integration/apigateway/util.go
function resourceTags (line 7) | func resourceTags(resourceName, testID string, nameAdditionalAttr ...str...
function hasTags (line 16) | func hasTags(tags map[string]string, requiredTags map[string]string) bool {
FILE: aws-source/adapters/integration/ec2-transit-gateway/client.go
function ec2Client (line 11) | func ec2Client(ctx context.Context) (*awsec2.Client, error) {
FILE: aws-source/adapters/integration/ec2-transit-gateway/main_test.go
function TestMain (line 59) | func TestMain(m *testing.M) {
function TestIntegrationEC2TransitGateway (line 69) | func TestIntegrationEC2TransitGateway(t *testing.T) {
function listSync (line 79) | func listSync(adapter discovery.ListStreamableAdapter, ctx context.Conte...
function searchSync (line 88) | func searchSync(adapter discovery.SearchStreamableAdapter, ctx context.C...
FILE: aws-source/adapters/integration/ec2-transit-gateway/setup.go
constant integrationTestName (line 18) | integrationTestName = "integration-test"
function Setup (line 30) | func Setup(t *testing.T) {
function setup (line 44) | func setup(ctx context.Context, logger *slog.Logger, client *ec2.Client)...
FILE: aws-source/adapters/integration/ec2-transit-gateway/teardown.go
function integrationTestTagFilters (line 16) | func integrationTestTagFilters() []types.Filter {
function getIntegrationTestTransitGatewayID (line 27) | func getIntegrationTestTransitGatewayID(ctx context.Context, client *ec2...
function Teardown (line 45) | func Teardown(t *testing.T) {
function teardown (line 59) | func teardown(ctx context.Context, logger *slog.Logger, client *ec2.Clie...
function clearPackageState (line 175) | func clearPackageState() {
FILE: aws-source/adapters/integration/ec2-transit-gateway/transit_gateway_route_table_association_test.go
function TransitGatewayRouteTableAssociation (line 14) | func TransitGatewayRouteTableAssociation(t *testing.T) {
FILE: aws-source/adapters/integration/ec2-transit-gateway/transit_gateway_route_table_propagation_test.go
function TransitGatewayRouteTablePropagation (line 14) | func TransitGatewayRouteTablePropagation(t *testing.T) {
FILE: aws-source/adapters/integration/ec2-transit-gateway/transit_gateway_route_table_test.go
function TransitGatewayRouteTable (line 25) | func TransitGatewayRouteTable(t *testing.T) {
FILE: aws-source/adapters/integration/ec2-transit-gateway/transit_gateway_route_test.go
function TransitGatewayRoute (line 14) | func TransitGatewayRoute(t *testing.T) {
FILE: aws-source/adapters/integration/ec2/create.go
function createEC2Instance (line 16) | func createEC2Instance(ctx context.Context, logger *slog.Logger, client ...
FILE: aws-source/adapters/integration/ec2/delete.go
function deleteInstance (line 9) | func deleteInstance(ctx context.Context, client *ec2.Client, instanceID ...
FILE: aws-source/adapters/integration/ec2/find.go
function findActiveInstanceIDByTags (line 14) | func findActiveInstanceIDByTags(ctx context.Context, client *ec2.Client,...
FILE: aws-source/adapters/integration/ec2/instance_test.go
function searchSync (line 15) | func searchSync(adapter discovery.SearchStreamableAdapter, ctx context.C...
function listSync (line 27) | func listSync(adapter discovery.ListStreamableAdapter, ctx context.Conte...
function EC2 (line 39) | func EC2(t *testing.T) {
FILE: aws-source/adapters/integration/ec2/main_test.go
function TestMain (line 14) | func TestMain(m *testing.M) {
function TestIntegrationEC2 (line 24) | func TestIntegrationEC2(t *testing.T) {
function Setup (line 30) | func Setup(t *testing.T) {
function Teardown (line 45) | func Teardown(t *testing.T) {
function ec2Client (line 60) | func ec2Client(ctx context.Context) (*awsec2.Client, error) {
FILE: aws-source/adapters/integration/ec2/setup.go
constant instanceSrc (line 11) | instanceSrc = "instance"
function setup (line 13) | func setup(ctx context.Context, logger *slog.Logger, client *ec2.Client)...
FILE: aws-source/adapters/integration/ec2/teardown.go
function teardown (line 12) | func teardown(ctx context.Context, logger *slog.Logger, client *ec2.Clie...
FILE: aws-source/adapters/integration/ec2/util.go
function resourceTags (line 9) | func resourceTags(resourceName, testID string, nameAdditionalAttr ...str...
function hasTags (line 30) | func hasTags(tags []types.Tag, requiredTags []types.Tag) bool {
FILE: aws-source/adapters/integration/errors.go
type NotFoundError (line 5) | type NotFoundError struct
method Error (line 9) | func (e NotFoundError) Error() string {
function NewNotFoundError (line 13) | func NewNotFoundError(resourceName string) NotFoundError {
FILE: aws-source/adapters/integration/kms/create.go
function createKey (line 15) | func createKey(ctx context.Context, logger *slog.Logger, client *kms.Cli...
function createAlias (line 41) | func createAlias(ctx context.Context, logger *slog.Logger, client *kms.C...
function genAliasName (line 68) | func genAliasName() string {
function createGrant (line 72) | func createGrant(ctx context.Context, logger *slog.Logger, client *kms.C...
function putKeyPolicy (line 100) | func putKeyPolicy(ctx context.Context, logger *slog.Logger, client *kms....
FILE: aws-source/adapters/integration/kms/delete.go
function deleteKey (line 9) | func deleteKey(ctx context.Context, client *kms.Client, keyID string) er...
function deleteAlias (line 18) | func deleteAlias(ctx context.Context, client *kms.Client, aliasName stri...
function deleteGrant (line 25) | func deleteGrant(ctx context.Context, client *kms.Client, keyID, grantID...
FILE: aws-source/adapters/integration/kms/find.go
function findActiveKeyIDByTags (line 15) | func findActiveKeyIDByTags(ctx context.Context, client *kms.Client, addi...
function findAliasesByTargetKey (line 54) | func findAliasesByTargetKey(ctx context.Context, client *kms.Client, key...
function findGrant (line 74) | func findGrant(ctx context.Context, client *kms.Client, keyID, principal...
function findKeyPolicy (line 92) | func findKeyPolicy(ctx context.Context, client *kms.Client, keyID string...
FILE: aws-source/adapters/integration/kms/kms_test.go
function searchSync (line 16) | func searchSync(adapter discovery.SearchStreamableAdapter, ctx context.C...
function listSync (line 28) | func listSync(adapter discovery.ListStreamableAdapter, ctx context.Conte...
function KMS (line 40) | func KMS(t *testing.T) {
FILE: aws-source/adapters/integration/kms/main_test.go
function TestMain (line 14) | func TestMain(m *testing.M) {
function TestIntegrationKMS (line 24) | func TestIntegrationKMS(t *testing.T) {
function Setup (line 30) | func Setup(t *testing.T) {
function Teardown (line 45) | func Teardown(t *testing.T) {
function kmsClient (line 60) | func kmsClient(ctx context.Context) (*awskms.Client, error) {
FILE: aws-source/adapters/integration/kms/setup.go
constant keySrc (line 13) | keySrc = "key"
constant aliasSrc (line 14) | aliasSrc = "alias"
constant grantSrc (line 15) | grantSrc = "grant"
constant keyPolicySrc (line 16) | keyPolicySrc = "key-policy"
function setup (line 19) | func setup(ctx context.Context, logger *slog.Logger, client *kms.Client)...
FILE: aws-source/adapters/integration/kms/teardown.go
function teardown (line 13) | func teardown(ctx context.Context, logger *slog.Logger, client *kms.Clie...
FILE: aws-source/adapters/integration/kms/util.go
function resourceTags (line 9) | func resourceTags(resourceName, testID string, nameAdditionalAttr ...str...
function hasTags (line 30) | func hasTags(tags []types.Tag, requiredTags []types.Tag) bool {
FILE: aws-source/adapters/integration/networkmanager/create.go
function createGlobalNetwork (line 14) | func createGlobalNetwork(ctx context.Context, logger *slog.Logger, clien...
function createSite (line 44) | func createSite(ctx context.Context, logger *slog.Logger, client *networ...
function createLink (line 75) | func createLink(ctx context.Context, logger *slog.Logger, client *networ...
function createDevice (line 111) | func createDevice(ctx context.Context, logger *slog.Logger, client *netw...
function createLinkAssociation (line 142) | func createLinkAssociation(ctx context.Context, logger *slog.Logger, cli...
function createConnection (line 171) | func createConnection(ctx context.Context, logger *slog.Logger, client *...
FILE: aws-source/adapters/integration/networkmanager/delete.go
function deleteGlobalNetwork (line 15) | func deleteGlobalNetwork(ctx context.Context, client *networkmanager.Cli...
function deleteSite (line 34) | func deleteSite(ctx context.Context, client *networkmanager.Client, glob...
function deleteLink (line 54) | func deleteLink(ctx context.Context, client *networkmanager.Client, glob...
function deleteDevice (line 74) | func deleteDevice(ctx context.Context, client *networkmanager.Client, gl...
function deleteLinkAssociation (line 95) | func deleteLinkAssociation(ctx context.Context, client *networkmanager.C...
function deleteConnection (line 117) | func deleteConnection(ctx context.Context, client *networkmanager.Client...
FILE: aws-source/adapters/integration/networkmanager/find.go
function findGlobalNetworkIDByTags (line 12) | func findGlobalNetworkIDByTags(ctx context.Context, client *networkmanag...
function findSiteIDByTags (line 27) | func findSiteIDByTags(ctx context.Context, client *networkmanager.Client...
function findLinkIDByTags (line 44) | func findLinkIDByTags(ctx context.Context, client *networkmanager.Client...
function findDeviceIDByTags (line 62) | func findDeviceIDByTags(ctx context.Context, client *networkmanager.Clie...
function findLinkAssociationID (line 80) | func findLinkAssociationID(ctx context.Context, client *networkmanager.C...
function findConnectionID (line 103) | func findConnectionID(ctx context.Context, client *networkmanager.Client...
FILE: aws-source/adapters/integration/networkmanager/main_test.go
function TestMain (line 14) | func TestMain(m *testing.M) {
function TestIntegrationNetworkManager (line 24) | func TestIntegrationNetworkManager(t *testing.T) {
function Setup (line 30) | func Setup(t *testing.T) {
function Teardown (line 45) | func Teardown(t *testing.T) {
function networkManagerClient (line 60) | func networkManagerClient(ctx context.Context) (*awsnetworkmanager.Clien...
FILE: aws-source/adapters/integration/networkmanager/networkmanager_test.go
function searchSync (line 16) | func searchSync(adapter discovery.SearchStreamableAdapter, ctx context.C...
function NetworkManager (line 28) | func NetworkManager(t *testing.T) {
FILE: aws-source/adapters/integration/networkmanager/setup.go
constant globalNetworkSrc (line 12) | globalNetworkSrc = "global-network"
constant siteSrc (line 13) | siteSrc = "site"
constant linkSrc (line 14) | linkSrc = "link"
constant deviceSrc (line 15) | deviceSrc = "device"
constant linkAssociationSrc (line 16) | linkAssociationSrc = "link-association"
constant connectionSrc (line 17) | connectionSrc = "connection"
constant deviceOneName (line 21) | deviceOneName = "device-1"
constant deviceTwoName (line 22) | deviceTwoName = "device-2"
function setup (line 25) | func setup(ctx context.Context, logger *slog.Logger, networkmanagerClien...
FILE: aws-source/adapters/integration/networkmanager/tags.go
function resourceTags (line 9) | func resourceTags(resourceName, testID string, additionalAttr ...string)...
function hasTags (line 30) | func hasTags(tags []types.Tag, requiredTags []types.Tag) bool {
FILE: aws-source/adapters/integration/networkmanager/teardown.go
function teardown (line 12) | func teardown(ctx context.Context, logger *slog.Logger, client *networkm...
FILE: aws-source/adapters/integration/ssm/main_test.go
function TestMain (line 24) | func TestMain(m *testing.M) {
function TestIntegrationSSM (line 48) | func TestIntegrationSSM(t *testing.T) {
FILE: aws-source/adapters/integration/util.go
constant TagTestKey (line 21) | TagTestKey = "test"
constant TagTestValue (line 22) | TagTestValue = "true"
constant TagTestIDKey (line 23) | TagTestIDKey = "test-id"
constant TagTestTypeKey (line 24) | TagTestTypeKey = "test-type"
constant TagResourceIDKey (line 25) | TagResourceIDKey = "resource-id"
type resourceGroup (line 28) | type resourceGroup
method String (line 37) | func (rg resourceGroup) String() string {
constant NetworkManager (line 31) | NetworkManager resourceGroup = iota
constant EC2 (line 32) | EC2
constant KMS (line 33) | KMS
constant APIGateway (line 34) | APIGateway
function ShouldRunIntegrationTests (line 52) | func ShouldRunIntegrationTests() bool {
function TestID (line 67) | func TestID() string {
function TestName (line 80) | func TestName(resourceGroup resourceGroup) string {
type AWSCfg (line 84) | type AWSCfg struct
function AWSSettings (line 90) | func AWSSettings(ctx context.Context) (*AWSCfg, error) {
function removeUnhealthy (line 123) | func removeUnhealthy(sdpInstances []*sdp.Item) []*sdp.Item {
function GetUniqueAttributeValueByTags (line 134) | func GetUniqueAttributeValueByTags(uniqueAttrKey string, items []*sdp.It...
function GetUniqueAttributeValueBySignificantAttribute (line 164) | func GetUniqueAttributeValueBySignificantAttribute(uniqueAttrkey, signif...
function ResourceName (line 196) | func ResourceName(resourceGroup resourceGroup, resourceName string, addi...
function ResourceTags (line 204) | func ResourceTags(resourceGroup resourceGroup, resourceName string, addi...
function hasTags (line 213) | func hasTags(tags map[string]string, requiredTags map[string]string) bool {
function AssertEqualItems (line 223) | func AssertEqualItems(t *testing.T, expected, actual []*sdp.Item, unique...
function uniqueAttributeValueSet (line 249) | func uniqueAttributeValueSet(items []*sdp.Item, key string) (map[any]boo...
function GetCallerIdentityARN (line 261) | func GetCallerIdentityARN(ctx context.Context) (*string, error) {
FILE: aws-source/adapters/integration/util_test.go
function Test_testID (line 8) | func Test_testID(t *testing.T) {
FILE: aws-source/adapters/kms-alias.go
function aliasOutputMapper (line 14) | func aliasOutputMapper(_ context.Context, _ *kms.Client, scope string, _...
function NewKMSAliasAdapter (line 76) | func NewKMSAliasAdapter(client *kms.Client, accountID string, region str...
FILE: aws-source/adapters/kms-alias_test.go
function TestAliasOutputMapper (line 14) | func TestAliasOutputMapper(t *testing.T) {
function TestNewKMSAliasAdapter (line 56) | func TestNewKMSAliasAdapter(t *testing.T) {
FILE: aws-source/adapters/kms-custom-key-store.go
function customKeyStoreOutputMapper (line 15) | func customKeyStoreOutputMapper(_ context.Context, _ *kms.Client, scope ...
function NewKMSCustomKeyStoreAdapter (line 78) | func NewKMSCustomKeyStoreAdapter(client *kms.Client, accountID string, r...
FILE: aws-source/adapters/kms-custom-key-store_test.go
function TestCustomKeyStoreOutputMapper (line 16) | func TestCustomKeyStoreOutputMapper(t *testing.T) {
function TestNewKMSCustomKeyStoreAdapter (line 59) | func TestNewKMSCustomKeyStoreAdapter(t *testing.T) {
function TestHealthState (line 73) | func TestHealthState(t *testing.T) {
FILE: aws-source/adapters/kms-grant.go
function grantOutputMapper (line 16) | func grantOutputMapper(ctx context.Context, _ *kms.Client, scope string,...
function NewKMSGrantAdapter (line 169) | func NewKMSGrantAdapter(client *kms.Client, accountID string, region str...
function iamSourceAndQuery (line 231) | func iamSourceAndQuery(resource string) (string, string) {
function isAWSServicePrincipal (line 244) | func isAWSServicePrincipal(principal string) bool {
FILE: aws-source/adapters/kms-grant_test.go
function TestIsAWSServicePrincipal (line 47) | func TestIsAWSServicePrincipal(t *testing.T) {
function TestGrantOutputMapper (line 123) | func TestGrantOutputMapper(t *testing.T) {
function TestGrantOutputMapperWithServicePrincipal (line 188) | func TestGrantOutputMapperWithServicePrincipal(t *testing.T) {
function TestNewKMSGrantAdapter (line 237) | func TestNewKMSGrantAdapter(t *testing.T) {
FILE: aws-source/adapters/kms-key-policy.go
type keyPolicyClient (line 15) | type keyPolicyClient interface
function getKeyPolicyFunc (line 20) | func getKeyPolicyFunc(ctx context.Context, client keyPolicyClient, scope...
function NewKMSKeyPolicyAdapter (line 83) | func NewKMSKeyPolicyAdapter(client keyPolicyClient, accountID string, re...
FILE: aws-source/adapters/kms-key-policy_test.go
type mockKeyPolicyClient (line 42) | type mockKeyPolicyClient struct
method GetKeyPolicy (line 44) | func (m *mockKeyPolicyClient) GetKeyPolicy(ctx context.Context, params...
method ListKeyPolicies (line 74) | func (m *mockKeyPolicyClient) ListKeyPolicies(ctx context.Context, par...
function TestGetKeyPolicyFunc (line 80) | func TestGetKeyPolicyFunc(t *testing.T) {
function TestNewKMSKeyPolicyAdapter (line 107) | func TestNewKMSKeyPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/kms-key.go
type kmsClient (line 14) | type kmsClient interface
function kmsKeyGetFunc (line 20) | func kmsKeyGetFunc(ctx context.Context, client kmsClient, scope string, ...
function NewKMSKeyAdapter (line 107) | func NewKMSKeyAdapter(client kmsClient, accountID, region string, cache ...
FILE: aws-source/adapters/kms-key_test.go
type kmsTestClient (line 13) | type kmsTestClient struct
method DescribeKey (line 15) | func (t kmsTestClient) DescribeKey(ctx context.Context, params *kms.De...
method ListKeys (line 36) | func (t kmsTestClient) ListKeys(context.Context, *kms.ListKeysInput, ....
method ListResourceTags (line 55) | func (t kmsTestClient) ListResourceTags(context.Context, *kms.ListReso...
function TestKMSGetFunc (line 74) | func TestKMSGetFunc(t *testing.T) {
function TestNewKMSKeyAdapter (line 90) | func TestNewKMSKeyAdapter(t *testing.T) {
FILE: aws-source/adapters/kms.go
function kmsTags (line 10) | func kmsTags(ctx context.Context, cli kmsClient, keyID string) (map[stri...
function kmsTagsToMap (line 25) | func kmsTagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/lambda-event-source-mapping.go
type lambdaEventSourceMappingClient (line 13) | type lambdaEventSourceMappingClient interface
function eventSourceMappingListFunc (line 18) | func eventSourceMappingListFunc(ctx context.Context, client lambdaEventS...
function convertGetEventSourceMappingOutputToConfiguration (line 33) | func convertGetEventSourceMappingOutputToConfiguration(output *lambda.Ge...
function eventSourceMappingOutputMapper (line 70) | func eventSourceMappingOutputMapper(query, scope string, awsItem *types....
function NewLambdaEventSourceMappingAdapter (line 169) | func NewLambdaEventSourceMappingAdapter(client lambdaEventSourceMappingC...
FILE: aws-source/adapters/lambda-event-source-mapping_test.go
type TestLambdaEventSourceMappingClient (line 13) | type TestLambdaEventSourceMappingClient struct
method ListEventSourceMappings (line 15) | func (t *TestLambdaEventSourceMappingClient) ListEventSourceMappings(c...
method GetEventSourceMapping (line 55) | func (t *TestLambdaEventSourceMappingClient) GetEventSourceMapping(ctx...
function TestLambdaEventSourceMappingAdapter (line 87) | func TestLambdaEventSourceMappingAdapter(t *testing.T) {
function TestLambdaEventSourceMappingGetFunc (line 109) | func TestLambdaEventSourceMappingGetFunc(t *testing.T) {
function TestLambdaEventSourceMappingItemMapper (line 144) | func TestLambdaEventSourceMappingItemMapper(t *testing.T) {
function TestLambdaEventSourceMappingItemMapperWithDynamoDB (line 207) | func TestLambdaEventSourceMappingItemMapperWithDynamoDB(t *testing.T) {
function TestLambdaEventSourceMappingItemMapperWithRDS (line 240) | func TestLambdaEventSourceMappingItemMapperWithRDS(t *testing.T) {
function TestLambdaEventSourceMappingSearchByEventSourceARN (line 273) | func TestLambdaEventSourceMappingSearchByEventSourceARN(t *testing.T) {
function TestLambdaEventSourceMappingSearchWrongScope (line 293) | func TestLambdaEventSourceMappingSearchWrongScope(t *testing.T) {
function TestLambdaEventSourceMappingAdapterList (line 303) | func TestLambdaEventSourceMappingAdapterList(t *testing.T) {
function TestLambdaEventSourceMappingAdapterListWrongScope (line 337) | func TestLambdaEventSourceMappingAdapterListWrongScope(t *testing.T) {
function TestLambdaEventSourceMappingAdapterIntegration (line 347) | func TestLambdaEventSourceMappingAdapterIntegration(t *testing.T) {
FILE: aws-source/adapters/lambda-function.go
type FunctionDetails (line 17) | type FunctionDetails struct
function functionGetFunc (line 28) | func functionGetFunc(ctx context.Context, client LambdaClient, scope str...
function ExtractLinksFromPolicy (line 419) | func ExtractLinksFromPolicy(policy *PolicyDocument) []*sdp.LinkedItemQue...
function GetEventLinkedItem (line 474) | func GetEventLinkedItem(destinationARN string) (*sdp.LinkedItemQuery, er...
function NewLambdaFunctionAdapter (line 526) | func NewLambdaFunctionAdapter(client LambdaClient, accountID string, reg...
FILE: aws-source/adapters/lambda-function_test.go
method GetFunction (line 103) | func (t *TestLambdaClient) GetFunction(ctx context.Context, params *lamb...
method ListFunctionEventInvokeConfigs (line 115) | func (t *TestLambdaClient) ListFunctionEventInvokeConfigs(context.Contex...
method ListFunctionUrlConfigs (line 136) | func (t *TestLambdaClient) ListFunctionUrlConfigs(context.Context, *lamb...
method ListFunctions (line 158) | func (t *TestLambdaClient) ListFunctions(context.Context, *lambda.ListFu...
method GetPolicy (line 166) | func (t *TestLambdaClient) GetPolicy(ctx context.Context, params *lambda...
function TestFunctionGetFunc (line 172) | func TestFunctionGetFunc(t *testing.T) {
function TestGetEventLinkedItem (line 321) | func TestGetEventLinkedItem(t *testing.T) {
function TestNewLambdaFunctionAdapter (line 376) | func TestNewLambdaFunctionAdapter(t *testing.T) {
FILE: aws-source/adapters/lambda-layer-version.go
function layerVersionGetInputMapper (line 15) | func layerVersionGetInputMapper(scope, query string) *lambda.GetLayerVer...
function layerVersionGetFunc (line 35) | func layerVersionGetFunc(ctx context.Context, client LambdaClient, scope...
function NewLambdaLayerVersionAdapter (line 99) | func NewLambdaLayerVersionAdapter(client LambdaClient, accountID string,...
FILE: aws-source/adapters/lambda-layer-version_test.go
function TestLayerVersionGetInputMapper (line 14) | func TestLayerVersionGetInputMapper(t *testing.T) {
method GetLayerVersion (line 56) | func (t *TestLambdaClient) GetLayerVersion(ctx context.Context, params *...
method ListLayerVersions (line 80) | func (t *TestLambdaClient) ListLayerVersions(context.Context, *lambda.Li...
function TestLayerVersionGetFunc (line 84) | func TestLayerVersionGetFunc(t *testing.T) {
function TestNewLambdaLayerVersionAdapter (line 116) | func TestNewLambdaLayerVersionAdapter(t *testing.T) {
FILE: aws-source/adapters/lambda-layer.go
function layerListFunc (line 15) | func layerListFunc(ctx context.Context, client *lambda.Client, scope str...
function layerItemMapper (line 34) | func layerItemMapper(_, scope string, awsItem *types.LayersListItem) (*s...
function NewLambdaLayerAdapter (line 62) | func NewLambdaLayerAdapter(client *lambda.Client, accountID string, regi...
FILE: aws-source/adapters/lambda-layer_test.go
function TestLayerItemMapper (line 12) | func TestLayerItemMapper(t *testing.T) {
function TestNewLambdaLayerAdapter (line 54) | func TestNewLambdaLayerAdapter(t *testing.T) {
FILE: aws-source/adapters/lambda.go
type LambdaClient (line 11) | type LambdaClient interface
type PolicyDocument (line 25) | type PolicyDocument struct
type PolicyStatement (line 31) | type PolicyStatement struct
type Principal (line 37) | type Principal struct
type Condition (line 41) | type Condition struct
type StringEqualsCondition (line 46) | type StringEqualsCondition struct
type ArnLikeCondition (line 50) | type ArnLikeCondition struct
FILE: aws-source/adapters/lambda_test.go
type TestLambdaClient (line 10) | type TestLambdaClient struct
function lambdaGetAutoConfig (line 12) | func lambdaGetAutoConfig(t *testing.T) (*lambda.Client, string, string) {
function TestParsePolicy (line 116) | func TestParsePolicy(t *testing.T) {
FILE: aws-source/adapters/network-firewall-firewall-policy.go
type unifiedFirewallPolicy (line 13) | type unifiedFirewallPolicy struct
function firewallPolicyGetFunc (line 18) | func firewallPolicyGetFunc(ctx context.Context, client networkFirewallCl...
function NewNetworkFirewallFirewallPolicyAdapter (line 112) | func NewNetworkFirewallFirewallPolicyAdapter(client networkFirewallClien...
FILE: aws-source/adapters/network-firewall-firewall-policy_test.go
method DescribeFirewallPolicy (line 12) | func (c testNetworkFirewallClient) DescribeFirewallPolicy(ctx context.Co...
method ListFirewallPolicies (line 81) | func (c testNetworkFirewallClient) ListFirewallPolicies(context.Context,...
function TestFirewallPolicyGetFunc (line 91) | func TestFirewallPolicyGetFunc(t *testing.T) {
FILE: aws-source/adapters/network-firewall-firewall.go
type unifiedFirewall (line 14) | type unifiedFirewall struct
function firewallGetFunc (line 22) | func firewallGetFunc(ctx context.Context, client networkFirewallClient, ...
function NewNetworkFirewallFirewallAdapter (line 227) | func NewNetworkFirewallFirewallAdapter(client networkFirewallClient, acc...
FILE: aws-source/adapters/network-firewall-firewall_test.go
method DescribeFirewall (line 13) | func (c testNetworkFirewallClient) DescribeFirewall(ctx context.Context,...
method DescribeLoggingConfiguration (line 70) | func (c testNetworkFirewallClient) DescribeLoggingConfiguration(ctx cont...
method DescribeResourcePolicy (line 102) | func (c testNetworkFirewallClient) DescribeResourcePolicy(ctx context.Co...
method ListFirewalls (line 108) | func (c testNetworkFirewallClient) ListFirewalls(context.Context, *netwo...
function TestFirewallGetFunc (line 118) | func TestFirewallGetFunc(t *testing.T) {
FILE: aws-source/adapters/network-firewall-rule-group.go
type unifiedRuleGroup (line 14) | type unifiedRuleGroup struct
function ruleGroupGetFunc (line 20) | func ruleGroupGetFunc(ctx context.Context, client networkFirewallClient,...
function NewNetworkFirewallRuleGroupAdapter (line 103) | func NewNetworkFirewallRuleGroupAdapter(client networkFirewallClient, ac...
FILE: aws-source/adapters/network-firewall-rule-group_test.go
method DescribeRuleGroup (line 12) | func (c testNetworkFirewallClient) DescribeRuleGroup(ctx context.Context...
method ListRuleGroups (line 137) | func (c testNetworkFirewallClient) ListRuleGroups(ctx context.Context, p...
function TestRuleGroupGetFunc (line 147) | func TestRuleGroupGetFunc(t *testing.T) {
FILE: aws-source/adapters/network-firewall-tls-inspection-configuration.go
type unifiedTLSInspectionConfiguration (line 13) | type unifiedTLSInspectionConfiguration struct
function tlsInspectionConfigurationGetFunc (line 19) | func tlsInspectionConfigurationGetFunc(ctx context.Context, client netwo...
function NewNetworkFirewallTLSInspectionConfigurationAdapter (line 143) | func NewNetworkFirewallTLSInspectionConfigurationAdapter(client networkF...
FILE: aws-source/adapters/network-firewall-tls-inspection-configuration_test.go
method DescribeTLSInspectionConfiguration (line 12) | func (c testNetworkFirewallClient) DescribeTLSInspectionConfiguration(ct...
method ListTLSInspectionConfigurations (line 94) | func (c testNetworkFirewallClient) ListTLSInspectionConfigurations(ctx c...
function TestTLSInspectionConfigurationGetFunc (line 104) | func TestTLSInspectionConfigurationGetFunc(t *testing.T) {
FILE: aws-source/adapters/networkfirewall.go
type networkFirewallClient (line 12) | type networkFirewallClient interface
function encryptionConfigurationLink (line 29) | func encryptionConfigurationLink(config *types.EncryptionConfiguration, ...
FILE: aws-source/adapters/networkfirewall_test.go
type testNetworkFirewallClient (line 3) | type testNetworkFirewallClient struct
FILE: aws-source/adapters/networkmanager-connect-attachment.go
function connectAttachmentGetFunc (line 14) | func connectAttachmentGetFunc(ctx context.Context, client *networkmanage...
function connectAttachmentItemMapper (line 25) | func connectAttachmentItemMapper(_, scope string, ca *types.ConnectAttac...
function NewNetworkManagerConnectAttachmentAdapter (line 74) | func NewNetworkManagerConnectAttachmentAdapter(client *networkmanager.Cl...
FILE: aws-source/adapters/networkmanager-connect-attachment_test.go
function TestConnectAttachmentItemMapper (line 10) | func TestConnectAttachmentItemMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-connect-peer-association.go
function connectPeerAssociationsOutputMapper (line 15) | func connectPeerAssociationsOutputMapper(_ context.Context, _ *networkma...
function NewNetworkManagerConnectPeerAssociationAdapter (line 100) | func NewNetworkManagerConnectPeerAssociationAdapter(client *networkmanag...
FILE: aws-source/adapters/networkmanager-connect-peer-association_test.go
function TestConnectPeerAssociationsOutputMapper (line 13) | func TestConnectPeerAssociationsOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-connect-peer.go
function connectPeerGetFunc (line 14) | func connectPeerGetFunc(ctx context.Context, client NetworkManagerClient...
function NewNetworkManagerConnectPeerAdapter (line 163) | func NewNetworkManagerConnectPeerAdapter(client NetworkManagerClient, ac...
FILE: aws-source/adapters/networkmanager-connect-peer_test.go
method GetConnectPeer (line 13) | func (n NetworkManagerTestClient) GetConnectPeer(ctx context.Context, pa...
method ListConnectPeers (line 38) | func (n NetworkManagerTestClient) ListConnectPeers(context.Context, *net...
function TestConnectPeerGetFunc (line 42) | func TestConnectPeerGetFunc(t *testing.T) {
FILE: aws-source/adapters/networkmanager-connection.go
function connectionOutputMapper (line 15) | func connectionOutputMapper(_ context.Context, _ *networkmanager.Client,...
function NewNetworkManagerConnectionAdapter (line 115) | func NewNetworkManagerConnectionAdapter(client *networkmanager.Client, a...
FILE: aws-source/adapters/networkmanager-connection_test.go
function TestConnectionOutputMapper (line 14) | func TestConnectionOutputMapper(t *testing.T) {
function TestConnectionInputMapperSearch (line 93) | func TestConnectionInputMapperSearch(t *testing.T) {
FILE: aws-source/adapters/networkmanager-core-network-policy.go
function coreNetworkPolicyGetFunc (line 14) | func coreNetworkPolicyGetFunc(ctx context.Context, client *networkmanage...
function coreNetworkPolicyItemMapper (line 25) | func coreNetworkPolicyItemMapper(_, scope string, cn *types.CoreNetworkP...
function NewNetworkManagerCoreNetworkPolicyAdapter (line 55) | func NewNetworkManagerCoreNetworkPolicyAdapter(client *networkmanager.Cl...
FILE: aws-source/adapters/networkmanager-core-network-policy_test.go
function TestCoreNetworkPolicyItemMapper (line 10) | func TestCoreNetworkPolicyItemMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-core-network.go
function coreNetworkGetFunc (line 15) | func coreNetworkGetFunc(ctx context.Context, client NetworkManagerClient...
function NewNetworkManagerCoreNetworkAdapter (line 97) | func NewNetworkManagerCoreNetworkAdapter(client NetworkManagerClient, ac...
FILE: aws-source/adapters/networkmanager-core-network_test.go
method GetCoreNetwork (line 13) | func (n NetworkManagerTestClient) GetCoreNetwork(ctx context.Context, pa...
method ListCoreNetworks (line 37) | func (n NetworkManagerTestClient) ListCoreNetworks(context.Context, *net...
function TestCoreNetworkItemMapper (line 41) | func TestCoreNetworkItemMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-device.go
function deviceOutputMapper (line 15) | func deviceOutputMapper(_ context.Context, _ *networkmanager.Client, sco...
function NewNetworkManagerDeviceAdapter (line 109) | func NewNetworkManagerDeviceAdapter(client *networkmanager.Client, accou...
FILE: aws-source/adapters/networkmanager-device_test.go
function TestDeviceOutputMapper (line 14) | func TestDeviceOutputMapper(t *testing.T) {
function TestDeviceInputMapperSearch (line 91) | func TestDeviceInputMapperSearch(t *testing.T) {
FILE: aws-source/adapters/networkmanager-global-network.go
function globalNetworkOutputMapper (line 14) | func globalNetworkOutputMapper(_ context.Context, client *networkmanager...
function NewNetworkManagerGlobalNetworkAdapter (line 127) | func NewNetworkManagerGlobalNetworkAdapter(client *networkmanager.Client...
function idWithGlobalNetwork (line 174) | func idWithGlobalNetwork(gn, idOrArn string) string {
function idWithTypeAndGlobalNetwork (line 179) | func idWithTypeAndGlobalNetwork(gb, rType, idOrArn string) string {
FILE: aws-source/adapters/networkmanager-global-network_test.go
function TestGlobalNetworkOutputMapper (line 13) | func TestGlobalNetworkOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-link-association.go
function linkAssociationOutputMapper (line 17) | func linkAssociationOutputMapper(_ context.Context, _ *networkmanager.Cl...
function NewNetworkManagerLinkAssociationAdapter (line 90) | func NewNetworkManagerLinkAssociationAdapter(client *networkmanager.Clie...
FILE: aws-source/adapters/networkmanager-link-association_test.go
function TestLinkAssociationOutputMapper (line 13) | func TestLinkAssociationOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-link.go
function linkOutputMapper (line 15) | func linkOutputMapper(_ context.Context, _ *networkmanager.Client, scope...
function NewNetworkManagerLinkAdapter (line 97) | func NewNetworkManagerLinkAdapter(client *networkmanager.Client, account...
FILE: aws-source/adapters/networkmanager-link_test.go
function TestLinkOutputMapper (line 14) | func TestLinkOutputMapper(t *testing.T) {
function TestLinkInputMapperSearch (line 85) | func TestLinkInputMapperSearch(t *testing.T) {
FILE: aws-source/adapters/networkmanager-network-resource-relationship.go
function networkResourceRelationshipOutputMapper (line 16) | func networkResourceRelationshipOutputMapper(_ context.Context, _ *netwo...
function NewNetworkManagerNetworkResourceRelationshipsAdapter (line 193) | func NewNetworkManagerNetworkResourceRelationshipsAdapter(client *networ...
FILE: aws-source/adapters/networkmanager-network-resource-relationship_test.go
function TestNetworkResourceRelationshipOutputMapper (line 13) | func TestNetworkResourceRelationshipOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-site-to-site-vpn-attachment.go
function getSiteToSiteVpnAttachmentGetFunc (line 13) | func getSiteToSiteVpnAttachmentGetFunc(ctx context.Context, client *netw...
function siteToSiteVpnAttachmentItemMapper (line 24) | func siteToSiteVpnAttachmentItemMapper(_, scope string, awsItem *types.S...
function NewNetworkManagerSiteToSiteVpnAttachmentAdapter (line 82) | func NewNetworkManagerSiteToSiteVpnAttachmentAdapter(client *networkmana...
FILE: aws-source/adapters/networkmanager-site-to-site-vpn-attachment_test.go
function TestSiteToSiteVpnAttachmentOutputMapper (line 10) | func TestSiteToSiteVpnAttachmentOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-site.go
function siteOutputMapper (line 15) | func siteOutputMapper(_ context.Context, _ *networkmanager.Client, scope...
function NewNetworkManagerSiteAdapter (line 86) | func NewNetworkManagerSiteAdapter(client *networkmanager.Client, account...
FILE: aws-source/adapters/networkmanager-site_test.go
function TestSiteOutputMapper (line 14) | func TestSiteOutputMapper(t *testing.T) {
function TestSiteInputMapperSearch (line 77) | func TestSiteInputMapperSearch(t *testing.T) {
FILE: aws-source/adapters/networkmanager-transit-gateway-connect-peer-association.go
function transitGatewayConnectPeerAssociationsOutputMapper (line 14) | func transitGatewayConnectPeerAssociationsOutputMapper(_ context.Context...
function NewNetworkManagerTransitGatewayConnectPeerAssociationAdapter (line 87) | func NewNetworkManagerTransitGatewayConnectPeerAssociationAdapter(client...
FILE: aws-source/adapters/networkmanager-transit-gateway-connect-peer-association_test.go
function TestTransitGatewayConnectPeerAssociationsOutputMapper (line 13) | func TestTransitGatewayConnectPeerAssociationsOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-transit-gateway-peering.go
function getTransitGatewayPeeringGetFunc (line 13) | func getTransitGatewayPeeringGetFunc(ctx context.Context, client *networ...
function transitGatewayPeeringItemMapper (line 24) | func transitGatewayPeeringItemMapper(_, scope string, awsItem *types.Tra...
function NewNetworkManagerTransitGatewayPeeringAdapter (line 94) | func NewNetworkManagerTransitGatewayPeeringAdapter(client *networkmanage...
FILE: aws-source/adapters/networkmanager-transit-gateway-peering_test.go
function TestTransitGatewayPeeringOutputMapper (line 10) | func TestTransitGatewayPeeringOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-transit-gateway-registration.go
function transitGatewayRegistrationOutputMapper (line 14) | func transitGatewayRegistrationOutputMapper(_ context.Context, _ *networ...
function NewNetworkManagerTransitGatewayRegistrationAdapter (line 72) | func NewNetworkManagerTransitGatewayRegistrationAdapter(client *networkm...
FILE: aws-source/adapters/networkmanager-transit-gateway-registration_test.go
function TestTransitGatewayRegistrationOutputMapper (line 13) | func TestTransitGatewayRegistrationOutputMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-transit-gateway-route-table-attachment.go
function getTransitGatewayRouteTableAttachmentGetFunc (line 13) | func getTransitGatewayRouteTableAttachmentGetFunc(ctx context.Context, c...
function transitGatewayRouteTableAttachmentItemMapper (line 24) | func transitGatewayRouteTableAttachmentItemMapper(_, scope string, awsIt...
function NewNetworkManagerTransitGatewayRouteTableAttachmentAdapter (line 82) | func NewNetworkManagerTransitGatewayRouteTableAttachmentAdapter(client *...
FILE: aws-source/adapters/networkmanager-transit-gateway-route-table-attachment_test.go
function TestTransitGatewayRouteTableAttachmentItemMapper (line 10) | func TestTransitGatewayRouteTableAttachmentItemMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager-vpc-attachment.go
function vpcAttachmentGetFunc (line 13) | func vpcAttachmentGetFunc(ctx context.Context, client *networkmanager.Cl...
function vpcAttachmentItemMapper (line 24) | func vpcAttachmentItemMapper(_, scope string, awsItem *types.VpcAttachme...
function NewNetworkManagerVPCAttachmentAdapter (line 57) | func NewNetworkManagerVPCAttachmentAdapter(client *networkmanager.Client...
FILE: aws-source/adapters/networkmanager-vpc-attachment_test.go
function TestVPCAttachmentItemMapper (line 10) | func TestVPCAttachmentItemMapper(t *testing.T) {
FILE: aws-source/adapters/networkmanager.go
type NetworkManagerClient (line 10) | type NetworkManagerClient interface
function networkmanagerTagsToMap (line 19) | func networkmanagerTagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/networkmanager_test.go
type NetworkManagerTestClient (line 3) | type NetworkManagerTestClient struct
FILE: aws-source/adapters/rds-db-cluster-parameter-group.go
type ClusterParameterGroup (line 14) | type ClusterParameterGroup struct
function dBClusterParameterGroupItemMapper (line 20) | func dBClusterParameterGroupItemMapper(_, scope string, awsItem *Cluster...
function NewRDSDBClusterParameterGroupAdapter (line 37) | func NewRDSDBClusterParameterGroupAdapter(client rdsClient, accountID st...
FILE: aws-source/adapters/rds-db-cluster-parameter-group_test.go
function TestDBClusterParameterGroupOutputMapper (line 11) | func TestDBClusterParameterGroupOutputMapper(t *testing.T) {
function TestNewRDSDBClusterParameterGroupAdapter (line 87) | func TestNewRDSDBClusterParameterGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/rds-db-cluster.go
function dBClusterOutputMapper (line 12) | func dBClusterOutputMapper(ctx context.Context, client rdsClient, scope ...
function NewRDSDBClusterAdapter (line 241) | func NewRDSDBClusterAdapter(client rdsClient, accountID string, region s...
FILE: aws-source/adapters/rds-db-cluster_test.go
function TestDBClusterOutputMapper (line 14) | func TestDBClusterOutputMapper(t *testing.T) {
function TestNewRDSDBClusterAdapter (line 254) | func TestNewRDSDBClusterAdapter(t *testing.T) {
FILE: aws-source/adapters/rds-db-instance.go
function statusToHealth (line 12) | func statusToHealth(status string) *sdp.Health {
function dBInstanceOutputMapper (line 75) | func dBInstanceOutputMapper(ctx context.Context, client rdsClient, scope...
function NewRDSDBInstanceAdapter (line 372) | func NewRDSDBInstanceAdapter(client rdsClient, accountID string, region ...
FILE: aws-source/adapters/rds-db-instance_test.go
function TestDBInstanceOutputMapper (line 14) | func TestDBInstanceOutputMapper(t *testing.T) {
function TestNewRDSDBInstanceAdapter (line 312) | func TestNewRDSDBInstanceAdapter(t *testing.T) {
FILE: aws-source/adapters/rds-db-parameter-group.go
type ParameterGroup (line 14) | type ParameterGroup struct
function dBParameterGroupItemMapper (line 20) | func dBParameterGroupItemMapper(_, scope string, awsItem *ParameterGroup...
function NewRDSDBParameterGroupAdapter (line 37) | func NewRDSDBParameterGroupAdapter(client rdsClient, accountID string, r...
FILE: aws-source/adapters/rds-db-parameter-group_test.go
function TestDBParameterGroupOutputMapper (line 11) | func TestDBParameterGroupOutputMapper(t *testing.T) {
function TestNewRDSDBParameterGroupAdapter (line 75) | func TestNewRDSDBParameterGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/rds-db-subnet-group.go
function dBSubnetGroupOutputMapper (line 12) | func dBSubnetGroupOutputMapper(ctx context.Context, client rdsClient, sc...
function NewRDSDBSubnetGroupAdapter (line 90) | func NewRDSDBSubnetGroupAdapter(client rdsClient, accountID string, regi...
FILE: aws-source/adapters/rds-db-subnet-group_test.go
function TestDBSubnetGroupOutputMapper (line 14) | func TestDBSubnetGroupOutputMapper(t *testing.T) {
function TestNewRDSDBSubnetGroupAdapter (line 86) | func TestNewRDSDBSubnetGroupAdapter(t *testing.T) {
FILE: aws-source/adapters/rds-option-group.go
function optionGroupOutputMapper (line 12) | func optionGroupOutputMapper(ctx context.Context, client rdsClient, scop...
function NewRDSOptionGroupAdapter (line 49) | func NewRDSOptionGroupAdapter(client rdsClient, accountID string, region...
FILE: aws-source/adapters/rds-option-group_test.go
function TestOptionGroupOutputMapper (line 11) | func TestOptionGroupOutputMapper(t *testing.T) {
FILE: aws-source/adapters/rds.go
type rdsClient (line 10) | type rdsClient interface
type mockRdsClient (line 22) | type mockRdsClient struct
method DescribeDBClusterParameterGroups (line 24) | func (m mockRdsClient) DescribeDBClusterParameterGroups(ctx context.Co...
method DescribeDBClusterParameters (line 28) | func (m mockRdsClient) DescribeDBClusterParameters(ctx context.Context...
method ListTagsForResource (line 32) | func (m mockRdsClient) ListTagsForResource(ctx context.Context, params...
method DescribeDBClusters (line 43) | func (m mockRdsClient) DescribeDBClusters(ctx context.Context, params ...
method DescribeDBInstances (line 47) | func (m mockRdsClient) DescribeDBInstances(ctx context.Context, params...
method DescribeDBSubnetGroups (line 51) | func (m mockRdsClient) DescribeDBSubnetGroups(ctx context.Context, par...
method DescribeOptionGroups (line 55) | func (m mockRdsClient) DescribeOptionGroups(ctx context.Context, param...
method DescribeDBParameterGroups (line 59) | func (m mockRdsClient) DescribeDBParameterGroups(ctx context.Context, ...
method DescribeDBParameters (line 63) | func (m mockRdsClient) DescribeDBParameters(ctx context.Context, param...
function rdsTagsToMap (line 67) | func rdsTagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/rds_test.go
function rdsGetAutoConfig (line 8) | func rdsGetAutoConfig(t *testing.T) (*rds.Client, string, string) {
FILE: aws-source/adapters/route53-health-check.go
type HealthCheck (line 17) | type HealthCheck struct
function healthCheckGetFunc (line 22) | func healthCheckGetFunc(ctx context.Context, client *route53.Client, sco...
function healthCheckListFunc (line 45) | func healthCheckListFunc(ctx context.Context, client *route53.Client, sc...
function healthCheckItemMapper (line 72) | func healthCheckItemMapper(_, scope string, awsItem *HealthCheck) (*sdp....
function NewRoute53HealthCheckAdapter (line 128) | func NewRoute53HealthCheckAdapter(client *route53.Client, accountID stri...
FILE: aws-source/adapters/route53-health-check_test.go
function TestHealthCheckItemMapper (line 12) | func TestHealthCheckItemMapper(t *testing.T) {
function TestNewRoute53HealthCheckAdapter (line 73) | func TestNewRoute53HealthCheckAdapter(t *testing.T) {
FILE: aws-source/adapters/route53-hosted-zone.go
function hostedZoneGetFunc (line 14) | func hostedZoneGetFunc(ctx context.Context, client *route53.Client, scop...
function hostedZoneListFunc (line 26) | func hostedZoneListFunc(ctx context.Context, client *route53.Client, sco...
function hostedZoneItemMapper (line 42) | func hostedZoneItemMapper(_, scope string, awsItem *types.HostedZone) (*...
function NewRoute53HostedZoneAdapter (line 69) | func NewRoute53HostedZoneAdapter(client *route53.Client, accountID strin...
FILE: aws-source/adapters/route53-hosted-zone_test.go
function TestHostedZoneItemMapper (line 12) | func TestHostedZoneItemMapper(t *testing.T) {
function TestNewRoute53HostedZoneAdapter (line 50) | func TestNewRoute53HostedZoneAdapter(t *testing.T) {
FILE: aws-source/adapters/route53-resource-record-set.go
function resourceRecordSetGetFunc (line 16) | func resourceRecordSetGetFunc(ctx context.Context, client *route53.Clien...
function constructRecordFQDN (line 23) | func constructRecordFQDN(recordName, hostedZoneName string) string {
function resourceRecordSetSearchFunc (line 52) | func resourceRecordSetSearchFunc(ctx context.Context, client *route53.Cl...
function resourceRecordSetItemMapper (line 104) | func resourceRecordSetItemMapper(_, scope string, awsItem *types.Resourc...
function NewRoute53ResourceRecordSetAdapter (line 172) | func NewRoute53ResourceRecordSetAdapter(client *route53.Client, accountI...
FILE: aws-source/adapters/route53-resource-record-set_test.go
function TestResourceRecordSetItemMapper (line 16) | func TestResourceRecordSetItemMapper(t *testing.T) {
function TestConstructRecordFQDN (line 124) | func TestConstructRecordFQDN(t *testing.T) {
function TestNewRoute53ResourceRecordSetAdapter (line 209) | func TestNewRoute53ResourceRecordSetAdapter(t *testing.T) {
FILE: aws-source/adapters/route53.go
function route53TagsToMap (line 5) | func route53TagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/route53_test.go
function route53GetAutoConfig (line 8) | func route53GetAutoConfig(t *testing.T) (*route53.Client, string, string) {
FILE: aws-source/adapters/s3.go
constant CacheDuration (line 19) | CacheDuration = 10 * time.Minute
function NewS3Adapter (line 22) | func NewS3Adapter(config aws.Config, accountID string, cache sdpcache.Ca...
type S3Source (line 70) | type S3Source struct
method Client (line 88) | func (s *S3Source) Client() *s3.Client {
method Type (line 105) | func (s *S3Source) Type() string {
method Name (line 111) | func (s *S3Source) Name() string {
method Metadata (line 115) | func (s *S3Source) Metadata() *sdp.AdapterMetadata {
method Scopes (line 121) | func (s *S3Source) Scopes() []string {
method Get (line 182) | func (s *S3Source) Get(ctx context.Context, scope string, query string...
method List (line 558) | func (s *S3Source) List(ctx context.Context, scope string, ignoreCache...
method Search (line 639) | func (s *S3Source) Search(ctx context.Context, scope string, query str...
method Weight (line 688) | func (s *S3Source) Weight() int {
type S3Client (line 128) | type S3Client interface
type Bucket (line 153) | type Bucket struct
function getImpl (line 194) | func getImpl(ctx context.Context, cache sdpcache.Cache, client S3Client,...
function listImpl (line 570) | func listImpl(ctx context.Context, cache sdpcache.Cache, client S3Client...
function searchImpl (line 651) | func searchImpl(ctx context.Context, cache sdpcache.Cache, client S3Clie...
FILE: aws-source/adapters/s3_test.go
function TestS3SearchImpl (line 16) | func TestS3SearchImpl(t *testing.T) {
function TestS3ListImpl (line 63) | func TestS3ListImpl(t *testing.T) {
function TestS3GetImpl (line 75) | func TestS3GetImpl(t *testing.T) {
function TestS3SourceCaching (line 131) | func TestS3SourceCaching(t *testing.T) {
type TestS3Client (line 168) | type TestS3Client struct
method ListBuckets (line 170) | func (t TestS3Client) ListBuckets(ctx context.Context, params *s3.List...
method GetBucketAcl (line 182) | func (t TestS3Client) GetBucketAcl(ctx context.Context, params *s3.Get...
method GetBucketAnalyticsConfiguration (line 199) | func (t TestS3Client) GetBucketAnalyticsConfiguration(ctx context.Cont...
method GetBucketCors (line 220) | func (t TestS3Client) GetBucketCors(ctx context.Context, params *s3.Ge...
method GetBucketEncryption (line 243) | func (t TestS3Client) GetBucketEncryption(ctx context.Context, params ...
method GetBucketIntelligentTieringConfiguration (line 259) | func (t TestS3Client) GetBucketIntelligentTieringConfiguration(ctx con...
method GetBucketInventoryConfiguration (line 275) | func (t TestS3Client) GetBucketInventoryConfiguration(ctx context.Cont...
method GetBucketLifecycleConfiguration (line 301) | func (t TestS3Client) GetBucketLifecycleConfiguration(ctx context.Cont...
method GetBucketLocation (line 339) | func (t TestS3Client) GetBucketLocation(ctx context.Context, params *s...
method GetBucketLogging (line 345) | func (t TestS3Client) GetBucketLogging(ctx context.Context, params *s3...
method GetBucketMetricsConfiguration (line 362) | func (t TestS3Client) GetBucketMetricsConfiguration(ctx context.Contex...
method GetBucketNotificationConfiguration (line 370) | func (t TestS3Client) GetBucketNotificationConfiguration(ctx context.C...
method GetBucketOwnershipControls (line 417) | func (t TestS3Client) GetBucketOwnershipControls(ctx context.Context, ...
method GetBucketPolicy (line 429) | func (t TestS3Client) GetBucketPolicy(ctx context.Context, params *s3....
method GetBucketPolicyStatus (line 435) | func (t TestS3Client) GetBucketPolicyStatus(ctx context.Context, param...
method GetBucketReplication (line 443) | func (t TestS3Client) GetBucketReplication(ctx context.Context, params...
method GetBucketRequestPayment (line 478) | func (t TestS3Client) GetBucketRequestPayment(ctx context.Context, par...
method GetBucketTagging (line 484) | func (t TestS3Client) GetBucketTagging(ctx context.Context, params *s3...
method GetBucketVersioning (line 490) | func (t TestS3Client) GetBucketVersioning(ctx context.Context, params ...
method GetBucketWebsite (line 497) | func (t TestS3Client) GetBucketWebsite(ctx context.Context, params *s3...
type TestS3FailClient (line 523) | type TestS3FailClient struct
method ListBuckets (line 525) | func (t TestS3FailClient) ListBuckets(ctx context.Context, params *s3....
method GetBucketAcl (line 529) | func (t TestS3FailClient) GetBucketAcl(ctx context.Context, params *s3...
method GetBucketAnalyticsConfiguration (line 532) | func (t TestS3FailClient) GetBucketAnalyticsConfiguration(ctx context....
method GetBucketCors (line 536) | func (t TestS3FailClient) GetBucketCors(ctx context.Context, params *s...
method GetBucketEncryption (line 540) | func (t TestS3FailClient) GetBucketEncryption(ctx context.Context, par...
method GetBucketIntelligentTieringConfiguration (line 544) | func (t TestS3FailClient) GetBucketIntelligentTieringConfiguration(ctx...
method GetBucketInventoryConfiguration (line 548) | func (t TestS3FailClient) GetBucketInventoryConfiguration(ctx context....
method GetBucketLifecycleConfiguration (line 552) | func (t TestS3FailClient) GetBucketLifecycleConfiguration(ctx context....
method GetBucketLocation (line 556) | func (t TestS3FailClient) GetBucketLocation(ctx context.Context, param...
method GetBucketLogging (line 560) | func (t TestS3FailClient) GetBucketLogging(ctx context.Context, params...
method GetBucketMetricsConfiguration (line 564) | func (t TestS3FailClient) GetBucketMetricsConfiguration(ctx context.Co...
method GetBucketNotificationConfiguration (line 568) | func (t TestS3FailClient) GetBucketNotificationConfiguration(ctx conte...
method GetBucketOwnershipControls (line 572) | func (t TestS3FailClient) GetBucketOwnershipControls(ctx context.Conte...
method GetBucketPolicy (line 576) | func (t TestS3FailClient) GetBucketPolicy(ctx context.Context, params ...
method GetBucketPolicyStatus (line 580) | func (t TestS3FailClient) GetBucketPolicyStatus(ctx context.Context, p...
method GetBucketReplication (line 584) | func (t TestS3FailClient) GetBucketReplication(ctx context.Context, pa...
method GetBucketRequestPayment (line 588) | func (t TestS3FailClient) GetBucketRequestPayment(ctx context.Context,...
method GetBucketTagging (line 592) | func (t TestS3FailClient) GetBucketTagging(ctx context.Context, params...
method GetBucketVersioning (line 596) | func (t TestS3FailClient) GetBucketVersioning(ctx context.Context, par...
method GetBucketWebsite (line 600) | func (t TestS3FailClient) GetBucketWebsite(ctx context.Context, params...
method GetObject (line 604) | func (t TestS3FailClient) GetObject(ctx context.Context, params *s3.Ge...
method HeadBucket (line 608) | func (t TestS3FailClient) HeadBucket(ctx context.Context, params *s3.H...
method HeadObject (line 612) | func (t TestS3FailClient) HeadObject(ctx context.Context, params *s3.H...
method PutBucketAcl (line 616) | func (t TestS3FailClient) PutBucketAcl(ctx context.Context, params *s3...
method PutBucketCors (line 620) | func (t TestS3FailClient) PutBucketCors(ctx context.Context, params *s...
method PutBucketLifecycleConfiguration (line 624) | func (t TestS3FailClient) PutBucketLifecycleConfiguration(ctx context....
method PutBucketLogging (line 628) | func (t TestS3FailClient) PutBucketLogging(ctx context.Context, params...
method PutBucketNotificationConfiguration (line 632) | func (t TestS3FailClient) PutBucketNotificationConfiguration(ctx conte...
method PutBucketPolicy (line 636) | func (t TestS3FailClient) PutBucketPolicy(ctx context.Context, params ...
method PutBucketReplication (line 640) | func (t TestS3FailClient) PutBucketReplication(ctx context.Context, pa...
method PutBucketRequestPayment (line 644) | func (t TestS3FailClient) PutBucketRequestPayment(ctx context.Context,...
method PutBucketTagging (line 648) | func (t TestS3FailClient) PutBucketTagging(ctx context.Context, params...
method PutBucketVersioning (line 652) | func (t TestS3FailClient) PutBucketVersioning(ctx context.Context, par...
method PutBucketWebsite (line 656) | func (t TestS3FailClient) PutBucketWebsite(ctx context.Context, params...
method PutObject (line 660) | func (t TestS3FailClient) PutObject(ctx context.Context, params *s3.Pu...
function TestNewS3Adapter (line 664) | func TestNewS3Adapter(t *testing.T) {
function TestS3SearchWithARNFormat (line 677) | func TestS3SearchWithARNFormat(t *testing.T) {
FILE: aws-source/adapters/sns-data-protection-policy.go
type dataProtectionPolicyClient (line 12) | type dataProtectionPolicyClient interface
function getDataProtectionPolicyFunc (line 16) | func getDataProtectionPolicyFunc(ctx context.Context, client dataProtect...
function NewSNSDataProtectionPolicyAdapter (line 59) | func NewSNSDataProtectionPolicyAdapter(client dataProtectionPolicyClient...
FILE: aws-source/adapters/sns-data-protection-policy_test.go
type mockDataProtectionPolicyClient (line 12) | type mockDataProtectionPolicyClient struct
method GetDataProtectionPolicy (line 14) | func (m mockDataProtectionPolicyClient) GetDataProtectionPolicy(ctx co...
function TestGetDataProtectionPolicyFunc (line 20) | func TestGetDataProtectionPolicyFunc(t *testing.T) {
function TestNewSNSDataProtectionPolicyAdapter (line 36) | func TestNewSNSDataProtectionPolicyAdapter(t *testing.T) {
FILE: aws-source/adapters/sns-endpoint.go
type endpointClient (line 12) | type endpointClient interface
function getEndpointFunc (line 18) | func getEndpointFunc(ctx context.Context, client endpointClient, scope s...
function NewSNSEndpointAdapter (line 56) | func NewSNSEndpointAdapter(client endpointClient, accountID string, regi...
FILE: aws-source/adapters/sns-endpoint_test.go
type mockEndpointClient (line 13) | type mockEndpointClient struct
method ListTagsForResource (line 15) | func (m *mockEndpointClient) ListTagsForResource(ctx context.Context, ...
method GetEndpointAttributes (line 20) | func (m *mockEndpointClient) GetEndpointAttributes(ctx context.Context...
method ListEndpointsByPlatformApplication (line 29) | func (m *mockEndpointClient) ListEndpointsByPlatformApplication(ctx co...
function TestGetEndpointFunc (line 42) | func TestGetEndpointFunc(t *testing.T) {
function TestNewSNSEndpointAdapter (line 58) | func TestNewSNSEndpointAdapter(t *testing.T) {
FILE: aws-source/adapters/sns-platform-application.go
type platformApplicationClient (line 12) | type platformApplicationClient interface
function getPlatformApplicationFunc (line 18) | func getPlatformApplicationFunc(ctx context.Context, client platformAppl...
function NewSNSPlatformApplicationAdapter (line 65) | func NewSNSPlatformApplicationAdapter(client platformApplicationClient, ...
FILE: aws-source/adapters/sns-platform-application_test.go
type mockPlatformApplicationClient (line 13) | type mockPlatformApplicationClient struct
method ListTagsForResource (line 15) | func (m mockPlatformApplicationClient) ListTagsForResource(ctx context...
method GetPlatformApplicationAttributes (line 24) | func (m mockPlatformApplicationClient) GetPlatformApplicationAttribute...
method ListPlatformApplications (line 33) | func (m mockPlatformApplicationClient) ListPlatformApplications(ctx co...
function TestGetPlatformApplicationFunc (line 54) | func TestGetPlatformApplicationFunc(t *testing.T) {
function TestNewSNSPlatformApplicationAdapter (line 70) | func TestNewSNSPlatformApplicationAdapter(t *testing.T) {
FILE: aws-source/adapters/sns-subscription.go
type subsCli (line 13) | type subsCli interface
function getSubsFunc (line 19) | func getSubsFunc(ctx context.Context, client subsCli, scope string, inpu...
function NewSNSSubscriptionAdapter (line 76) | func NewSNSSubscriptionAdapter(client subsCli, accountID string, region ...
FILE: aws-source/adapters/sns-subscription_test.go
type snsTestClient (line 13) | type snsTestClient struct
method GetSubscriptionAttributes (line 15) | func (t snsTestClient) GetSubscriptionAttributes(ctx context.Context, ...
method ListSubscriptions (line 28) | func (t snsTestClient) ListSubscriptions(context.Context, *sns.ListSub...
method ListTagsForResource (line 42) | func (t snsTestClient) ListTagsForResource(context.Context, *sns.ListT...
function TestSNSGetFunc (line 51) | func TestSNSGetFunc(t *testing.T) {
function TestNewSNSSubscriptionAdapter (line 67) | func TestNewSNSSubscriptionAdapter(t *testing.T) {
FILE: aws-source/adapters/sns-topic.go
type topicClient (line 13) | type topicClient interface
function getTopicFunc (line 19) | func getTopicFunc(ctx context.Context, client topicClient, scope string,...
function NewSNSTopicAdapter (line 63) | func NewSNSTopicAdapter(client topicClient, accountID string, region str...
FILE: aws-source/adapters/sns-topic_test.go
type testTopicClient (line 13) | type testTopicClient struct
method GetTopicAttributes (line 15) | func (t testTopicClient) GetTopicAttributes(ctx context.Context, param...
method ListTopics (line 29) | func (t testTopicClient) ListTopics(context.Context, *sns.ListTopicsIn...
method ListTagsForResource (line 39) | func (t testTopicClient) ListTagsForResource(context.Context, *sns.Lis...
function TestGetTopicFunc (line 48) | func TestGetTopicFunc(t *testing.T) {
function TestNewSNSTopicAdapter (line 64) | func TestNewSNSTopicAdapter(t *testing.T) {
FILE: aws-source/adapters/sns.go
type tagLister (line 10) | type tagLister interface
function tagsByResourceARN (line 15) | func tagsByResourceARN(ctx context.Context, cli tagLister, resourceARN s...
function tagsToMap (line 35) | func tagsToMap(tags []types.Tag) map[string]string {
FILE: aws-source/adapters/sqs-queue.go
type sqsClient (line 14) | type sqsClient interface
function getFunc (line 20) | func getFunc(ctx context.Context, client sqsClient, scope string, input ...
function sqsQueueSearchInputMapper (line 86) | func sqsQueueSearchInputMapper(scope string, query string) (*sqs.GetQueu...
function NewSQSQueueAdapter (line 106) | func NewSQSQueueAdapter(client sqsClient, accountID string, region strin...
FILE: aws-source/adapters/sqs-queue_test.go
type testClient (line 13) | type testClient struct
method GetQueueAttributes (line 15) | func (t testClient) GetQueueAttributes(ctx context.Context, params *sq...
method ListQueueTags (line 34) | func (t testClient) ListQueueTags(ctx context.Context, params *sqs.Lis...
method ListQueues (line 43) | func (t testClient) ListQueues(ctx context.Context, input *sqs.ListQue...
function TestGetFunc (line 52) | func TestGetFunc(t *testing.T) {
function TestSqsQueueSearchInputMapper (line 94) | func TestSqsQueueSearchInputMapper(t *testing.T) {
function TestNewQueueAdapter (line 150) | func TestNewQueueAdapter(t *testing.T) {
FILE: aws-source/adapters/sqs.go
function tags (line 9) | func tags(ctx context.Context, cli sqsClient, queURL string) (map[string...
FILE: aws-source/adapters/ssm-parameter.go
type ssmClient (line 18) | type ssmClient interface
function ssmParameterInputMapperSearch (line 24) | func ssmParameterInputMapperSearch(ctx context.Context, client ssmClient...
function ssmParameterPostSearchFilter (line 127) | func ssmParameterPostSearchFilter(ctx context.Context, query string, ite...
function ssmParameterOutputMapper (line 149) | func ssmParameterOutputMapper(ctx context.Context, client ssmClient, sco...
function NewSSMParameterAdapter (line 222) | func NewSSMParameterAdapter(client ssmClient, accountID string, region s...
FILE: aws-source/adapters/ssm-parameter_test.go
type mockSSMClient (line 15) | type mockSSMClient struct
method DescribeParameters (line 17) | func (m *mockSSMClient) DescribeParameters(ctx context.Context, input ...
method ListTagsForResource (line 44) | func (m *mockSSMClient) ListTagsForResource(ctx context.Context, input...
method GetParameter (line 55) | func (m *mockSSMClient) GetParameter(ctx context.Context, input *ssm.G...
function TestSSMParameterAdapter (line 71) | func TestSSMParameterAdapter(t *testing.T) {
function TestSSMParameterAdapterE2E (line 122) | func TestSSMParameterAdapterE2E(t *testing.T) {
FILE: aws-source/adapters/tracing.go
constant instrumentationName (line 10) | instrumentationName = "github.com/overmindtech/cli/aws-source/adapters"
constant instrumentationVersion (line 11) | instrumentationVersion = "0.0.1"
FILE: aws-source/cmd/root.go
function Execute (line 99) | func Execute() {
function init (line 106) | func init() {
function initConfig (line 187) | func initConfig() {
type TerminationLogHook (line 202) | type TerminationLogHook struct
method Levels (line 204) | func (t TerminationLogHook) Levels() []log.Level {
method Fire (line 208) | func (t TerminationLogHook) Fire(e *log.Entry) error {
FILE: aws-source/main.go
function main (line 23) | func main() {
FILE: aws-source/module/provider/datasource_aws_external_id.go
type awsExternalIdDataSource (line 20) | type awsExternalIdDataSource struct
method Metadata (line 32) | func (d *awsExternalIdDataSource) Metadata(_ context.Context, req data...
method Schema (line 36) | func (d *awsExternalIdDataSource) Schema(_ context.Context, _ datasour...
method Configure (line 49) | func (d *awsExternalIdDataSource) Configure(_ context.Context, req dat...
method Read (line 62) | func (d *awsExternalIdDataSource) Read(ctx context.Context, _ datasour...
type awsExternalIdDataSourceModel (line 24) | type awsExternalIdDataSourceModel struct
function NewAWSExternalIdDataSource (line 28) | func NewAWSExternalIdDataSource() datasource.DataSource {
FILE: aws-source/module/provider/main.go
constant defaultHoneycombAPIKey (line 16) | defaultHoneycombAPIKey = "hcaik_01j03qe0exnn2jxpj2vxkqb7yrqtr083kyk9rxxt...
function main (line 18) | func main() {
function run (line 26) | func run() error {
FILE: aws-source/module/provider/provider.go
type overmindProvider (line 24) | type overmindProvider struct
method Metadata (line 39) | func (p *overmindProvider) Metadata(_ context.Context, _ provider.Meta...
method Schema (line 44) | func (p *overmindProvider) Schema(_ context.Context, _ provider.Schema...
method Configure (line 63) | func (p *overmindProvider) Configure(ctx context.Context, req provider...
method Resources (line 122) | func (p *overmindProvider) Resources(_ context.Context) []func() resou...
method DataSources (line 128) | func (p *overmindProvider) DataSources(_ context.Context) []func() dat...
type overmindProviderModel (line 28) | type overmindProviderModel struct
function NewProvider (line 33) | func NewProvider(version string) func() provider.Provider {
FILE: aws-source/module/provider/provider_test.go
type mockMgmtHandler (line 27) | type mockMgmtHandler struct
method GetOrCreateAWSExternalId (line 41) | func (m *mockMgmtHandler) GetOrCreateAWSExternalId(_ context.Context, ...
method CreateSource (line 47) | func (m *mockMgmtHandler) CreateSource(_ context.Context, req *connect...
method GetSource (line 59) | func (m *mockMgmtHandler) GetSource(_ context.Context, req *connect.Re...
method UpdateSource (line 73) | func (m *mockMgmtHandler) UpdateSource(_ context.Context, req *connect...
method DeleteSource (line 88) | func (m *mockMgmtHandler) DeleteSource(_ context.Context, req *connect...
function newMockMgmtHandler (line 34) | func newMockMgmtHandler() *mockMgmtHandler {
type testProvider (line 107) | type testProvider struct
method Configure (line 114) | func (p *testProvider) Configure(ctx context.Context, _ provider.Confi...
method Schema (line 122) | func (p *testProvider) Schema(ctx context.Context, req provider.Schema...
method Resources (line 128) | func (p *testProvider) Resources(ctx context.Context) []func() resourc...
method DataSources (line 132) | func (p *testProvider) DataSources(ctx context.Context) []func() datas...
function startTestServer (line 138) | func startTestServer(t *testing.T) string {
function unitTestProviderFactories (line 149) | func unitTestProviderFactories(serverURL string) map[string]func() (tfpr...
function accTestProviderFactories (line 158) | func accTestProviderFactories() map[string]func() (tfprotov6.ProviderSer...
function TestAWSSourceResource_CRUD (line 166) | func TestAWSSourceResource_CRUD(t *testing.T) {
function TestProviderConfigure_MissingAPIKey (line 199) | func TestProviderConfigure_MissingAPIKey(t *testing.T) {
function TestAWSExternalIdDataSource_Read (line 220) | func TestAWSExternalIdDataSource_Read(t *testing.T) {
function testAccAWSSourceConfig (line 237) | func testAccAWSSourceConfig(name, roleARN, regions string) string {
FILE: aws-source/module/provider/resource_aws_source.go
type awsSourceResource (line 29) | type awsSourceResource struct
method Metadata (line 45) | func (r *awsSourceResource) Metadata(_ context.Context, req resource.M...
method Schema (line 49) | func (r *awsSourceResource) Schema(_ context.Context, _ resource.Schem...
method Configure (line 84) | func (r *awsSourceResource) Configure(_ context.Context, req resource....
method Create (line 97) | func (r *awsSourceResource) Create(ctx context.Context, req resource.C...
method Read (line 172) | func (r *awsSourceResource) Read(ctx context.Context, req resource.Rea...
method Update (line 231) | func (r *awsSourceResource) Update(ctx context.Context, req resource.U...
method Delete (line 302) | func (r *awsSourceResource) Delete(ctx context.Context, req resource.D...
method ImportState (line 336) | func (r *awsSourceResource) ImportState(ctx context.Context, req resou...
type awsSourceResourceModel (line 33) | type awsSourceResourceModel struct
function NewAWSSourceResource (line 41) | func NewAWSSourceResource() resource.Resource {
function uuidToBytes (line 347) | func uuidToBytes(s string) ([]byte, error) {
function regionsFromList (line 356) | func regionsFromList(ctx context.Context, list types.List) ([]string, di...
function toAnySlice (line 362) | func toAnySlice(ss []string) []any {
function regionsFromStructValue (line 370) | func regionsFromStructValue(v *structpb.Value) []string {
FILE: aws-source/proc/proc.go
type AwsAuthConfig (line 57) | type AwsAuthConfig struct
method GetAWSConfig (line 137) | func (c AwsAuthConfig) GetAWSConfig(region string) (aws.Config, error) {
function ConfigFromViper (line 71) | func ConfigFromViper() ([]aws.Config, error) {
function isTimeoutError (line 90) | func isTimeoutError(err error) bool {
function isOptInRegionError (line 96) | func isOptInRegionError(err error) bool {
function isSkippableRegionError (line 116) | func isSkippableRegionError(err error) bool {
function wrapRegionError (line 121) | func wrapRegionError(err error, region string) error {
function CreateAWSConfigs (line 243) | func CreateAWSConfigs(awsAuthConfig AwsAuthConfig) ([]aws.Config, error) {
function InitializeAwsSourceAdapters (line 274) | func InitializeAwsSourceAdapters(ctx context.Context, e *discovery.Engin...
FILE: aws-source/proc/proc_test.go
type testAdapter (line 18) | type testAdapter struct
method Type (line 23) | func (t *testAdapter) Type() string {
method Name (line 27) | func (t *testAdapter) Name() string {
method Scopes (line 31) | func (t *testAdapter) Scopes() []string {
method Metadata (line 35) | func (t *testAdapter) Metadata() *sdp.AdapterMetadata {
method Get (line 42) | func (t *testAdapter) Get(ctx context.Context, scope string, query str...
function TestInitializeAwsSourceEngine_RetryClearsAdapters (line 55) | func TestInitializeAwsSourceEngine_RetryClearsAdapters(t *testing.T) {
type mockAPIError (line 105) | type mockAPIError struct
method Error (line 110) | func (m *mockAPIError) Error() string {
method ErrorCode (line 114) | func (m *mockAPIError) ErrorCode() string {
method ErrorMessage (line 118) | func (m *mockAPIError) ErrorMessage() string {
method ErrorFault (line 122) | func (m *mockAPIError) ErrorFault() smithy.ErrorFault {
function TestIsOptInRegionError (line 126) | func TestIsOptInRegionError(t *testing.T) {
function TestIsTimeoutError (line 201) | func TestIsTimeoutError(t *testing.T) {
function TestIsSkippableRegionError (line 249) | func TestIsSkippableRegionError(t *testing.T) {
function TestWrapRegionError (line 300) | func TestWrapRegionError(t *testing.T) {
FILE: cmd/auth_client.go
function newRetryableHTTPClient (line 18) | func newRetryableHTTPClient() *http.Client {
function UnauthenticatedApiKeyClient (line 32) | func UnauthenticatedApiKeyClient(ctx context.Context, oi sdp.OvermindIns...
function AuthenticatedBookmarkClient (line 39) | func AuthenticatedBookmarkClient(ctx context.Context, oi sdp.OvermindIns...
function AuthenticatedChangesClient (line 47) | func AuthenticatedChangesClient(ctx context.Context, oi sdp.OvermindInst...
function AuthenticatedConfigurationClient (line 55) | func AuthenticatedConfigurationClient(ctx context.Context, oi sdp.Overmi...
function AuthenticatedManagementClient (line 63) | func AuthenticatedManagementClient(ctx context.Context, oi sdp.OvermindI...
function AuthenticatedSnapshotsClient (line 71) | func AuthenticatedSnapshotsClient(ctx context.Context, oi sdp.OvermindIn...
function AuthenticatedInviteClient (line 79) | func AuthenticatedInviteClient(ctx context.Context, oi sdp.OvermindInsta...
function AuthenticatedSignalsClient (line 85) | func AuthenticatedSignalsClient(ctx context.Context, oi sdp.OvermindInst...
type AuthenticatedTransport (line 95) | type AuthenticatedTransport struct
method RoundTrip (line 116) | func (y *AuthenticatedTransport) RoundTrip(req *http.Request) (*http.R...
function NewAuthenticatedClient (line 102) | func NewAuthenticatedClient(ctx context.Context, from *http.Client) *htt...
FILE: cmd/auth_client_test.go
type testProxyServer (line 22) | type testProxyServer struct
method getURL (line 129) | func (p *testProxyServer) getURL() string {
function startTestProxyServer (line 30) | func startTestProxyServer(t *testing.T) *testProxyServer {
function setProxyEnv (line 135) | func setProxyEnv(t *testing.T, proxyURL string) func() {
function TestNewRetryableHTTPClientRespectsProxy (line 167) | func TestNewRetryableHTTPClientRespectsProxy(t *testing.T) {
function TestAuthenticatedChangesClientUsesProxy (line 247) | func TestAuthenticatedChangesClientUsesProxy(t *testing.T) {
function TestWebSocketDialerUsesProxy (line 324) | func TestWebSocketDialerUsesProxy(t *testing.T) {
FILE: cmd/bookmarks.go
function init (line 22) | func init() {
FILE: cmd/bookmarks_create_bookmark.go
function CreateBookmark (line 25) | func CreateBookmark(cmd *cobra.Command, args []string) error {
function init (line 99) | func init() {
FILE: cmd/bookmarks_get_affected_bookmarks.go
function GetAffectedBookmarks (line 22) | func GetAffectedBookmarks(cmd *cobra.Command, args []string) error {
function init (line 67) | func init() {
FILE: cmd/bookmarks_get_bookmark.go
function GetBookmark (line 23) | func GetBookmark(cmd *cobra.Command, args []string) error {
function init (line 67) | func init() {
FILE: cmd/changes.go
function init (line 20) | func init() {
FILE: cmd/changes_end_change.go
function EndChange (line 21) | func EndChange(cmd *cobra.Command, args []string) error {
function init (line 104) | func init() {
FILE: cmd/changes_get_change.go
function GetChange (line 24) | func GetChange(cmd *cobra.Command, args []string) error {
function validateChangeStatus (line 116) | func validateChangeStatus(statusStr string) (sdp.ChangeStatus, error) {
function init (line 139) | func init() {
FILE: cmd/changes_get_change_test.go
function TestGetChangeCmdHasWaitFlag (line 10) | func TestGetChangeCmdHasWaitFlag(t *testing.T) {
function TestValidateChangeStatus (line 24) | func TestValidateChangeStatus(t *testing.T) {
FILE: cmd/changes_get_signals.go
function GetSignals (line 29) | func GetSignals(cmd *cobra.Command, args []string) error {
function init (line 93) | func init() {
FILE: cmd/changes_get_signals_test.go
function TestGetSignalsCmd (line 9) | func TestGetSignalsCmd(t *testing.T) {
function TestGetSignalsFormat (line 33) | func TestGetSignalsFormat(t *testing.T) {
FILE: cmd/changes_list_changes.go
function ListChanges (line 25) | func ListChanges(cmd *cobra.Command, args []string) error {
function printJson (line 231) | func printJson(_ context.Context, b []byte, prefix, id string, cmd *cobr...
function init (line 287) | func init() {
FILE: cmd/changes_start_analysis.go
function StartAnalysis (line 30) | func StartAnalysis(cmd *cobra.Command, args []string) error {
function init (line 98) | func init() {
FILE: cmd/changes_start_analysis_test.go
function TestAddAnalysisFlags (line 14) | func TestAddAnalysisFlags(t *testing.T) {
function TestBuildAnalysisConfigWithNoFlags (line 57) | func TestBuildAnalysisConfigWithNoFlags(t *testing.T) {
function TestBuildAnalysisConfigWithBlastRadiusFlags (line 90) | func TestBuildAnalysisConfigWithBlastRadiusFlags(t *testing.T) {
function TestBuildAnalysisConfigWithInvalidSignalConfigPath (line 122) | func TestBuildAnalysisConfigWithInvalidSignalConfigPath(t *testing.T) {
function TestBuildAnalysisConfigWithValidSignalConfig (line 138) | func TestBuildAnalysisConfigWithValidSignalConfig(t *testing.T) {
function TestStartAnalysisCmdFlags (line 175) | func TestStartAnalysisCmdFlags(t *testing.T) {
function TestSubmitPlanCmdHasCommentFlag (line 210) | func TestSubmitPlanCmdHasCommentFlag(t *testing.T) {
function TestSubmitPlanCmdHasNoStartFlag (line 224) | func TestSubmitPlanCmdHasNoStartFlag(t *testing.T) {
FILE: cmd/changes_start_change.go
function StartChange (line 21) | func StartChange(cmd *cobra.Command, args []string) error {
function init (line 111) | func init() {
FILE: cmd/changes_submit_plan.go
type TfData (line 43) | type TfData struct
function changeTitle (line 49) | func changeTitle(ctx context.Context, arg string) string {
function tryLoadText (line 80) | func tryLoadText(ctx context.Context, fileName string) string {
function createBlastRadiusConfig (line 94) | func createBlastRadiusConfig(maxDepth, maxItems int32, maxTime, changeAn...
function SubmitPlan (line 124) | func SubmitPlan(cmd *cobra.Command, args []string) error {
function loadSignalConfigFile (line 324) | func loadSignalConfigFile(signalConfigPath string) (*sdp.SignalConfigFil...
function checkForAndLoadSignalConfigFile (line 346) | func checkForAndLoadSignalConfigFile(ctx context.Context, lf log.Fields,...
function init (line 393) | func init() {
FILE: cmd/changes_submit_plan_test.go
function TestBlastRadiusConfigCreation (line 8) | func TestBlastRadiusConfigCreation(t *testing.T) {
FILE: cmd/changes_submit_signal.go
function SubmitSignal (line 23) | func SubmitSignal(cmd *cobra.Command, args []string) error {
function validateValue (line 89) | func validateValue(value float64) (float64, error) {
function init (line 96) | func init() {
FILE: cmd/changes_submit_signal_test.go
function TestValidateValue (line 7) | func TestValidateValue(t *testing.T) {
FILE: cmd/explore.go
function StartLocalSources (line 62) | func StartLocalSources(ctx context.Context, oi sdp.OvermindInstance, tok...
function Explore (line 611) | func Explore(cmd *cobra.Command, args []string) error {
function init (line 660) | func init() {
function unifiedGCPConfigs (line 674) | func unifiedGCPConfigs(gcpConfigs []*gcpproc.GCPConfig) []*gcpproc.GCPCo...
function unifiedAzureConfigs (line 710) | func unifiedAzureConfigs(azureConfigs []*azureproc.AzureConfig) []*azure...
FILE: cmd/explore_test
Copy disabled (too large)
Download .json
Condensed preview — 1937 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,395K chars).
[
{
"path": ".github/e2eapply.tape",
"chars": 245,
"preview": "Output e2e/apply.mp4\n\nSet Width 1920\nSet Height 1080\n\nSet FontSize 12\nSet CursorBlink false\n\nHide\nType \"export PATH=$PWD"
},
{
"path": ".github/e2eplan.tape",
"chars": 261,
"preview": "Output e2e/plan.mp4\n\nSet Width 1920\nSet Height 1080\n\nSet FontSize 12\nSet CursorBlink false\n\nHide\nType \"export PATH=$PWD:"
},
{
"path": ".github/workflows/docker-release.yml",
"chars": 1308,
"preview": "name: Build and Release Docker Container\n\non:\n push:\n tags:\n - 'v*'\n\njobs:\n build-and-push:\n name: Build an"
},
{
"path": ".github/workflows/finalize-copybara-sync.yml",
"chars": 4591,
"preview": "name: Finalize Copybara Sync\n\non:\n push:\n branches:\n - 'copybara/v*'\n\n# Cancel any in-progress runs when a new "
},
{
"path": ".github/workflows/release.yml",
"chars": 3296,
"preview": "name: goreleaser-release\n\non:\n push:\n tags:\n - 'v*'\njobs:\n test:\n name: Run Tests\n runs-on: depot-ubuntu"
},
{
"path": ".github/workflows/tag-on-merge.yml",
"chars": 1629,
"preview": "name: Tag Release on Merge\n\non:\n pull_request:\n types:\n - closed\n branches:\n - main\n\njobs:\n tag-releas"
},
{
"path": ".github/workflows/tests.yml",
"chars": 777,
"preview": "name: Run Tests\non: push\njobs:\n test:\n name: Run Tests\n runs-on: depot-ubuntu-24.04-4\n concurrency:\n grou"
},
{
"path": ".gitignore",
"chars": 652,
"preview": "# If you prefer the allow list template instead of the deny list, see community template:\n# https://github.com/github/gi"
},
{
"path": ".goreleaser.yaml",
"chars": 5041,
"preview": "# Make sure to check the documentation at https://goreleaser.com\nversion: 2\nbuilds:\n - binary: overmind\n id: overmin"
},
{
"path": ".terraform.lock.hcl",
"chars": 4292,
"preview": "# This file is maintained automatically by \"terraform init\".\n# Manual edits may be lost in future updates.\n\nprovider \"re"
},
{
"path": "CONTRIBUTING.md",
"chars": 63,
"preview": "# Contributing to the CLI\n\nJust open a PR and we'll review it.\n"
},
{
"path": "Dockerfile",
"chars": 641,
"preview": "FROM ghcr.io/opentofu/opentofu:minimal AS tofu\n\nFROM alpine:3.23.4\n\n# Copy the tofu binary from the minimal image\nCOPY -"
},
{
"path": "LICENSE",
"chars": 3767,
"preview": "# Functional Source License, Version 1.1, Apache 2.0 Future License\n\n## Abbreviation\n\nFSL-1.1-Apache-2.0\n\n## Notice\n\nCop"
},
{
"path": "README.md",
"chars": 10483,
"preview": "<p align=\"center\">\n <picture width=\"120px\" align=\"center\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"h"
},
{
"path": "aws-source/.deadcode-ignore",
"chars": 1727,
"preview": "adapterhelpers/shared_tests.go:19:6: unreachable func: PtrInt32\nadapterhelpers/shared_tests.go:27:6: unreachable func: P"
},
{
"path": "aws-source/acceptance/nats-server.conf",
"chars": 762,
"preview": "# Client port of 4222 on all interfaces\nport: 4222\n\n# HTTP monitoring port\nmonitor_port: 8222\n\n# This is for clustering "
},
{
"path": "aws-source/adapters/adapterhelpers_always_get_source.go",
"chars": 14811,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"buf.build/go/protovalidate\"\n\t\"github.co"
},
{
"path": "aws-source/adapters/adapterhelpers_always_get_source_test.go",
"chars": 19720,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/overmindtech/cli/go/discovery\"\n\t\"github."
},
{
"path": "aws-source/adapters/adapterhelpers_describe_source.go",
"chars": 17129,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"buf.build/go/protovalidate\"\n\t\"github.com/ov"
},
{
"path": "aws-source/adapters/adapterhelpers_describe_source_test.go",
"chars": 25971,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/overmindtech/cli/go/discovery\""
},
{
"path": "aws-source/adapters/adapterhelpers_get_list_adapter_v2.go",
"chars": 11530,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/overmindtech/cli/go/discovery\"\n\t\""
},
{
"path": "aws-source/adapters/adapterhelpers_get_list_adapter_v2_test.go",
"chars": 14757,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/overmindtech/cli/go/discovery\"\n\t\"github."
},
{
"path": "aws-source/adapters/adapterhelpers_get_list_source.go",
"chars": 11501,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\t\"time\"\n\n\t\"buf.build/go/protovalidate\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/adapterhelpers_get_list_source_test.go",
"chars": 12046,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/overmindtech/cli/go/sdp-go\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/adapterhelpers_notfound_cache_test.go",
"chars": 26621,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/overmindtech/cli/go/sdp-go\"\n\t\"github.co"
},
{
"path": "aws-source/adapters/adapterhelpers_shared_tests.go",
"chars": 5214,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"gi"
},
{
"path": "aws-source/adapters/adapterhelpers_sources.go",
"chars": 1808,
"preview": "package adapters\n\nimport \"context\"\n\nconst DefaultMaxResultsPerPage = 100\n\n// These `any` types exist just for documentat"
},
{
"path": "aws-source/adapters/adapterhelpers_util.go",
"chars": 14747,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\t\"tim"
},
{
"path": "aws-source/adapters/adapterhelpers_util_test.go",
"chars": 9453,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n)\n\nfunc TestParseARN(t *testing.T) {\n\tt.Run(\"arn:partition:service:region:account-"
},
{
"path": "aws-source/adapters/apigateway-api-key.go",
"chars": 3751,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/apigateway-api-key_test.go",
"chars": 1373,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/apigateway-authorizer.go",
"chars": 3996,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-authorizer_test.go",
"chars": 1885,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/apigateway-deployment.go",
"chars": 3838,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-deployment_test.go",
"chars": 1467,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/apigateway-domain-name.go",
"chars": 7265,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aws-sd"
},
{
"path": "aws-source/adapters/apigateway-domain-name_test.go",
"chars": 4402,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aws-s"
},
{
"path": "aws-source/adapters/apigateway-integration.go",
"chars": 3841,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n"
},
{
"path": "aws-source/adapters/apigateway-integration_test.go",
"chars": 2456,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/apigateway-method-response.go",
"chars": 3392,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-method-response_test.go",
"chars": 1756,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/apigateway-method.go",
"chars": 4649,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-method_test.go",
"chars": 3141,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/apigateway-model.go",
"chars": 3477,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-model_test.go",
"chars": 1313,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/apigateway-resource.go",
"chars": 4159,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-resource_test.go",
"chars": 4926,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aws-s"
},
{
"path": "aws-source/adapters/apigateway-rest-api.go",
"chars": 6408,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aws-sd"
},
{
"path": "aws-source/adapters/apigateway-rest-api_test.go",
"chars": 3417,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com/aws/aws-s"
},
{
"path": "aws-source/adapters/apigateway-stage.go",
"chars": 5190,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/apigateway\"\n\t\"github.com"
},
{
"path": "aws-source/adapters/apigateway-stage_test.go",
"chars": 2219,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/autoscaling-auto-scaling-group.go",
"chars": 7977,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/autoscaling\"\n\n\t\"github.com/over"
},
{
"path": "aws-source/adapters/autoscaling-auto-scaling-group_test.go",
"chars": 10734,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/autoscaling\"\n\t\"github.c"
},
{
"path": "aws-source/adapters/autoscaling-auto-scaling-policy.go",
"chars": 10416,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/autoscaling\"\n\n\t\"github.c"
},
{
"path": "aws-source/adapters/autoscaling-auto-scaling-policy_test.go",
"chars": 17598,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/autoscaling\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/cloudfront-cache-policy.go",
"chars": 2859,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-cache-policy_test.go",
"chars": 2710,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.co"
},
{
"path": "aws-source/adapters/cloudfront-continuous-deployment-policy.go",
"chars": 3563,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-continuous-deployment-policy_test.go",
"chars": 1796,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-distribution.go",
"chars": 16064,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"regexp\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\n\t\"github.com/overmi"
},
{
"path": "aws-source/adapters/cloudfront-distribution_test.go",
"chars": 16654,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.co"
},
{
"path": "aws-source/adapters/cloudfront-function.go",
"chars": 2603,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-function_test.go",
"chars": 1128,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-key-group.go",
"chars": 2476,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-key-group_test.go",
"chars": 865,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-origin-access-control.go",
"chars": 3373,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-origin-access-control_test.go",
"chars": 1140,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-origin-request-policy.go",
"chars": 2735,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-origin-request-policy_test.go",
"chars": 1640,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-realtime-log-config.go",
"chars": 3747,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-realtime-log-config_test.go",
"chars": 1729,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-response-headers-policy.go",
"chars": 2796,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront-response-headers-policy_test.go",
"chars": 2981,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront/types\"\n\t\"github.com/ove"
},
{
"path": "aws-source/adapters/cloudfront-streaming-distribution.go",
"chars": 5765,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\n\t\"github.com/overmindt"
},
{
"path": "aws-source/adapters/cloudfront-streaming-distribution_test.go",
"chars": 3597,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.co"
},
{
"path": "aws-source/adapters/cloudfront.go",
"chars": 1698,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/cloudfront_test.go",
"chars": 779,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudfront\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/cloudwatch-alarm.go",
"chars": 10335,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudwatch\"\n\t\"g"
},
{
"path": "aws-source/adapters/cloudwatch-alarm_test.go",
"chars": 10701,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudwatch\"\n\t\"gi"
},
{
"path": "aws-source/adapters/cloudwatch-instance-metric.go",
"chars": 11571,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws"
},
{
"path": "aws-source/adapters/cloudwatch-instance-metric_integration_test.go",
"chars": 1885,
"preview": "//go:build integration\n\npackage adapters\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/aws/aws-sd"
},
{
"path": "aws-source/adapters/cloudwatch-instance-metric_test.go",
"chars": 15623,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/cloudwatch_metric_links.go",
"chars": 5868,
"preview": "package adapters\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudwatch/types\"\n\n\t\"github.com/"
},
{
"path": "aws-source/adapters/cloudwatch_metric_links_test.go",
"chars": 4990,
"preview": "package adapters\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/service/cloudwatch/types\"\n"
},
{
"path": "aws-source/adapters/directconnect-connection.go",
"chars": 4005,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-connection_test.go",
"chars": 2524,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-customer-metadata.go",
"chars": 2740,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-customer-metadata_test.go",
"chars": 1093,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-association-proposal.go",
"chars": 4001,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmi"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-association-proposal_test.go",
"chars": 2395,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-association.go",
"chars": 5998,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-association_test.go",
"chars": 3578,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-attachment.go",
"chars": 5497,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway-attachment_test.go",
"chars": 3451,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway.go",
"chars": 4615,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github.com/aws/aws"
},
{
"path": "aws-source/adapters/directconnect-direct-connect-gateway_test.go",
"chars": 3368,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-hosted-connection.go",
"chars": 4305,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-hosted-connection_test.go",
"chars": 2548,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-interconnect.go",
"chars": 4706,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect/types\"\n\n\t\"github.com/aws/aws"
},
{
"path": "aws-source/adapters/directconnect-interconnect_test.go",
"chars": 4039,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-lag.go",
"chars": 4250,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect/types\"\n\n\t\"github.com/aws/aws"
},
{
"path": "aws-source/adapters/directconnect-lag_test.go",
"chars": 4215,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/overmindtech/cli/go/sdp-go\"\n\t\"github.com/overmind"
},
{
"path": "aws-source/adapters/directconnect-location.go",
"chars": 2713,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-location_test.go",
"chars": 1349,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-router-configuration.go",
"chars": 2985,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-router-configuration_test.go",
"chars": 1796,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-virtual-gateway.go",
"chars": 2725,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/directconnect-virtual-gateway_test.go",
"chars": 1111,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github"
},
{
"path": "aws-source/adapters/directconnect-virtual-interface.go",
"chars": 5805,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\n\t\"github.com/overmi"
},
{
"path": "aws-source/adapters/directconnect-virtual-interface_test.go",
"chars": 2649,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t"
},
{
"path": "aws-source/adapters/directconnect.go",
"chars": 910,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"github.com/aws/aws-sdk-go"
},
{
"path": "aws-source/adapters/directconnect_test.go",
"chars": 310,
"preview": "package adapters\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/service/directconnect\"\n\t\"testing\"\n)\n\nfunc directconnectGetAuto"
},
{
"path": "aws-source/adapters/dynamodb-backup.go",
"chars": 6341,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n\n\t\"github.com/overmindtec"
},
{
"path": "aws-source/adapters/dynamodb-backup_test.go",
"chars": 3924,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n\t\"github.com/"
},
{
"path": "aws-source/adapters/dynamodb-table.go",
"chars": 5660,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n\n\t\"github.com/overmind"
},
{
"path": "aws-source/adapters/dynamodb-table_test.go",
"chars": 7913,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n\t\"github.com/"
},
{
"path": "aws-source/adapters/dynamodb.go",
"chars": 847,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n)\n\ntype Client interface {\n\tDesc"
},
{
"path": "aws-source/adapters/dynamodb_test.go",
"chars": 51,
"preview": "package adapters\n\ntype DynamoDBTestClient struct{}\n"
},
{
"path": "aws-source/adapters/ec2-address.go",
"chars": 4589,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/"
},
{
"path": "aws-source/adapters/ec2-address_test.go",
"chars": 3128,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-capacity-reservation-fleet.go",
"chars": 4418,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ec2-capacity-reservation-fleet_test.go",
"chars": 2513,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-capacity-reservation.go",
"chars": 4152,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-capacity-reservation_test.go",
"chars": 3323,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-egress-only-internet-gateway.go",
"chars": 3815,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-egress-only-internet-gateway_test.go",
"chars": 2422,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-iam-instance-profile-association.go",
"chars": 3719,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-iam-instance-profile-association_test.go",
"chars": 2027,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-image.go",
"chars": 3051,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-image_test.go",
"chars": 2893,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-instance-event-window.go",
"chars": 3713,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-instance-event-window_test.go",
"chars": 2856,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-instance-status.go",
"chars": 3603,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ec2-instance-status_test.go",
"chars": 2713,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-instance.go",
"chars": 11843,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n"
},
{
"path": "aws-source/adapters/ec2-instance_test.go",
"chars": 12062,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-internet-gateway.go",
"chars": 3458,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-internet-gateway_test.go",
"chars": 2382,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-key-pair.go",
"chars": 2599,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-key-pair_test.go",
"chars": 1799,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-launch-template-version.go",
"chars": 8022,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github"
},
{
"path": "aws-source/adapters/ec2-launch-template-version_test.go",
"chars": 5924,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-launch-template.go",
"chars": 3096,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-launch-template_test.go",
"chars": 1792,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-nat-gateway.go",
"chars": 4396,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-nat-gateway_test.go",
"chars": 3989,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-network-acl.go",
"chars": 3564,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-network-acl_test.go",
"chars": 3582,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-network-interface-permission.go",
"chars": 3671,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-network-interface-permission_test.go",
"chars": 2655,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-network-interface.go",
"chars": 7831,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/ser"
},
{
"path": "aws-source/adapters/ec2-network-interface_test.go",
"chars": 8085,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-placement-group.go",
"chars": 2825,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-placement-group_test.go",
"chars": 1880,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-reserved-instance.go",
"chars": 2796,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-reserved-instance_test.go",
"chars": 2778,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-route-table.go",
"chars": 7333,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech"
},
{
"path": "aws-source/adapters/ec2-route-table_test.go",
"chars": 5310,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-security-group-rule.go",
"chars": 4074,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-security-group-rule_test.go",
"chars": 3274,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-security-group.go",
"chars": 5330,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ec2-security-group_test.go",
"chars": 3148,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-snapshot.go",
"chars": 3355,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-snapshot_test.go",
"chars": 2493,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-subnet.go",
"chars": 3125,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-subnet_test.go",
"chars": 3257,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table-association.go",
"chars": 9704,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table-association_test.go",
"chars": 2062,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2/types\"\n\t\"github.com/overmindtech/cli/g"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table-propagation.go",
"chars": 9763,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table-propagation_test.go",
"chars": 1872,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2/types\"\n\t\"github.com/overmindtech/cli/g"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table.go",
"chars": 4662,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route-table_test.go",
"chars": 3329,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route.go",
"chars": 11324,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/ec2-transit-gateway-route_test.go",
"chars": 2026,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2/types\"\n\t\"github.com/overmindtech/cli/g"
},
{
"path": "aws-source/adapters/ec2-volume-status.go",
"chars": 3959,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ec2-volume-status_test.go",
"chars": 3069,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-volume.go",
"chars": 3106,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-volume_test.go",
"chars": 2661,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-vpc-endpoint.go",
"chars": 6762,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-g"
},
{
"path": "aws-source/adapters/ec2-vpc-endpoint_test.go",
"chars": 4409,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-vpc-peering-connection.go",
"chars": 5472,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ec2-vpc-peering-connection_test.go",
"chars": 2876,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2-vpc.go",
"chars": 2565,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\n\t\"github.com/overmindtech/cli/go/sdp"
},
{
"path": "aws-source/adapters/ec2-vpc_test.go",
"chars": 2650,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ec2.go",
"chars": 335,
"preview": "package adapters\n\nimport \"github.com/aws/aws-sdk-go-v2/service/ec2/types\"\n\n// Converts a slice of tags to a map\nfunc ec2"
},
{
"path": "aws-source/adapters/ec2_test.go",
"chars": 284,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ec2\"\n)\n\nfunc ec2GetAutoConfig(t *testing.T"
},
{
"path": "aws-source/adapters/ecs-capacity-provider.go",
"chars": 5598,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/ecs-capacity-provider_test.go",
"chars": 4785,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs-cluster.go",
"chars": 6728,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aws-sdk-go-v2"
},
{
"path": "aws-source/adapters/ecs-cluster_test.go",
"chars": 4227,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs-container-instance.go",
"chars": 5507,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/ecs-container-instance_test.go",
"chars": 9537,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs-service.go",
"chars": 10217,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aw"
},
{
"path": "aws-source/adapters/ecs-service_test.go",
"chars": 10811,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs-task-definition.go",
"chars": 6293,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aws-sdk-go"
},
{
"path": "aws-source/adapters/ecs-task-definition_test.go",
"chars": 8922,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs-task.go",
"chars": 6355,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github."
},
{
"path": "aws-source/adapters/ecs-task_test.go",
"chars": 8133,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/a"
},
{
"path": "aws-source/adapters/ecs.go",
"chars": 1502,
"preview": "package adapters\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n\t\"github.com/aws/aws-sdk-go-v2/servic"
},
{
"path": "aws-source/adapters/ecs_test.go",
"chars": 300,
"preview": "package adapters\n\nimport (\n\t\"testing\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/ecs\"\n)\n\ntype ecsTestClient struct{}\n\nfunc "
}
]
// ... and 1737 more files (download for full content)
About this extraction
This page contains the full source code of the overmindtech/cli GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1937 files (12.5 MB), approximately 3.4M tokens, and a symbol index with 13870 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.